ETH Price: $3,494.04 (+2.20%)
Gas: 12 Gwei

Contract

0x35557BDA8c1eB81E2924AF07cCCcB9608e2E4A9b
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Altitude (PWDR) (@$0.00)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve194776592024-03-20 18:21:11102 days ago1710958871IN
Altitude Finance: PWDR Token
0 ETH0.0008299234.1983295
Approve175398482023-06-23 4:16:59374 days ago1687493819IN
Altitude Finance: PWDR Token
0 ETH0.0003967216.34769248
Approve168543992023-03-18 11:39:47471 days ago1679139587IN
Altitude Finance: PWDR Token
0 ETH0.0003330313.72304536
Approve168543992023-03-18 11:39:47471 days ago1679139587IN
Altitude Finance: PWDR Token
0 ETH0.0003330313.72304536
Approve166544772023-02-18 8:57:11499 days ago1676710631IN
Altitude Finance: PWDR Token
0 ETH0.0005468522.53386857
Approve165176282023-01-30 5:43:59518 days ago1675057439IN
Altitude Finance: PWDR Token
0 ETH0.0005139421.17777497
Approve161472802022-12-09 12:56:11570 days ago1670590571IN
Altitude Finance: PWDR Token
0 ETH0.0004346817.91170769
Approve154698282022-09-04 5:30:04666 days ago1662269404IN
Altitude Finance: PWDR Token
0 ETH0.000178067.33743634
Approve154572232022-09-02 5:00:29668 days ago1662094829IN
Altitude Finance: PWDR Token
0 ETH0.000222399.16421456
Transfer152216972022-07-27 1:48:05705 days ago1658886485IN
Altitude Finance: PWDR Token
0 ETH0.000748998.1031586
Transfer152216662022-07-27 1:40:32705 days ago1658886032IN
Altitude Finance: PWDR Token
0 ETH0.000735116.71066008
Approve150652402022-07-02 20:28:36729 days ago1656793716IN
Altitude Finance: PWDR Token
0 ETH0.0006237313.39868855
Approve146762242022-04-29 1:13:27794 days ago1651194807IN
Altitude Finance: PWDR Token
0 ETH0.0013007653.60002241
Transfer145161762022-04-03 23:45:49819 days ago1649029549IN
Altitude Finance: PWDR Token
0 ETH0.0050389145.99856179
Transfer144254762022-03-20 20:41:10833 days ago1647808870IN
Altitude Finance: PWDR Token
0 ETH0.003749734.22607854
Approve142132432022-02-15 21:47:13866 days ago1644961633IN
Altitude Finance: PWDR Token
0 ETH0.0012719352.41200777
Transfer139154272021-12-31 21:11:14912 days ago1640985074IN
Altitude Finance: PWDR Token
0 ETH0.0073802480
Approve138307132021-12-18 18:25:28925 days ago1639851928IN
Altitude Finance: PWDR Token
0 ETH0.0029521163.41540272
Approve138306992021-12-18 18:22:10925 days ago1639851730IN
Altitude Finance: PWDR Token
0 ETH0.0040711287.92937237
Approve130716892021-08-21 23:43:141044 days ago1629589394IN
Altitude Finance: PWDR Token
0 ETH0.0005468822.53534087
Transfer130680022021-08-21 10:12:161045 days ago1629540736IN
Altitude Finance: PWDR Token
0 ETH0.0029902527.3
Approve129478142021-08-02 19:28:491063 days ago1627932529IN
Altitude Finance: PWDR Token
0 ETH0.0020948445
Approve128379212021-07-16 12:32:371081 days ago1626438757IN
Altitude Finance: PWDR Token
0 ETH0.0004650832
Transfer125963812021-06-08 21:45:211118 days ago1623188721IN
Altitude Finance: PWDR Token
0 ETH0.0019014323
Transfer125963752021-06-08 21:44:041118 days ago1623188644IN
Altitude Finance: PWDR Token
0 ETH0.0013777814.9
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PWDR

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 18 : PWDR.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import { IUniswapV2Factory } from '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol';
import { IUniswapV2Router02 } from '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol';
import { IPWDR } from "../interfaces/IPWDR.sol";
import { IAvalanche } from '../interfaces/IAvalanche.sol';
import { PWDRBase } from "./PWDRBase.sol";

contract PWDR is IPWDR, PWDRBase {
    event EpochUpdated(address _address, uint256 _epoch, uint256 _phase);

    uint256 public override constant MAX_SUPPLY = 21000000 * 1e18; // max supply 21M

    bool public override maxSupplyHit; // has max supply been reached
    uint256 public override transferFee; // PWDR transfer fee, 1 = 0.1%. Default 1.5%

    uint256 public override currentEpoch;
    uint256 public override currentPhase; // current phase; 0 = Accumulation ,1 = Distribution
    uint256[] public override epochMaxSupply; // max total supply for each epoch, running total
    uint256[] public override epochBaseRate; // base APR of Slope rewards
    
    // Mapping of whitelisted sender and recipient addresses that don't pay the transfer fee. 
    // Allows PWDR token holders to whitelist future contracts
    mapping(address => bool) public senderWhitelist;
    mapping(address => bool) public recipientWhitelist;

    modifier Accumulation {
        require(
            currentPhase == 0,
            "PWDR is not in Accumulation"
        );
        _;
    }
    
    modifier MaxSupplyNotReached {
        require(!maxSupplyHit, "Max PWDR Supply has been reached");
        _;
    }

    modifier OnlyAuthorized {
        require(
            msg.sender == avalancheAddress()
            || msg.sender == lgeAddress()
            || msg.sender == slopesAddress(),
            "Only LGE, Slopes, and Avalanche contracts can call this function"
        );
        _;
    }

    constructor(address addressRegistry) 
        public 
        PWDRBase(addressRegistry, "Altitude", "PWDR") 
    {
        transferFee = 15;
        _initializeEpochs();
    }

    function _initializeEpochs() 
        private 
    {
        _setupEpoch(5250000 * 1e18, 0); // 5.25M PWDR for LGE
        _setupEpoch(13250000 * 1e18, 800); // +8M PWDR, 800%
        _setupEpoch(17250000 * 1e18, 400); // +4M PWDR, 400%
        _setupEpoch(19250000 * 1e18, 200); // +2M PWDR, 200%
        _setupEpoch(20250000 * 1e18, 100); // +1M PWDR, 100%
        _setupEpoch(20750000 * 1e18, 50); // +500K PWDR, 50%
        _setupEpoch(21000000 * 1e18, 25); // +250K PWDR, 25%
    }

    function _setupEpoch(uint256 maxSupply, uint256 baseRate) 
        private 
    {
        epochMaxSupply.push(maxSupply);
        epochBaseRate.push(baseRate);
    }

    function currentMaxSupply() 
        external 
        view
        override 
        returns (uint256)
    {
        return epochMaxSupply[currentEpoch];
    }

    function currentBaseRate() 
        external 
        view 
        override
        returns (uint256)
    {
        return epochBaseRate[currentEpoch];
    }

    function accumulating()
        external
        view
        override
        returns (bool)
    {
        return currentEpoch > 0 && currentEpoch <= 6
            && currentPhase == 0;
    }

    function updateEpoch(uint256 _epoch, uint256 _phase)
        external
        override
        OnlyAuthorized
    {
        // require valid update calls
        if (currentPhase == 0) {
            require(
                _epoch == currentEpoch && _phase == 1,
                "Invalid Epoch Phase Update Call"
            );
        } else {
            // change this to _epoch == currentEpoch + 1 in prod
            require(
                _epoch > currentEpoch && _phase == 0,
                "Invalid Epoch Update Call"
            );
        }

        currentEpoch = _epoch;
        currentPhase = _phase;

        emit EpochUpdated(_msgSender(), _epoch, _phase);
    }

    // Creates `_amount` PWDR token to `_to`. 
    // Can only be called by the LGE, Slopes, and Avalanche contracts
    //  when epoch and max supply numbers allow
    function mint(address _to, uint256 _amount)
        external
        override
        Accumulation
        MaxSupplyNotReached
        OnlyAuthorized
    {
        uint256 supply = totalSupply();
        uint256 epochSupply = epochMaxSupply[currentEpoch];

        // update phase if epoch max supply is hit during this mint
        if (supply.add(_amount) >= epochSupply) {
            _amount = epochSupply.sub(supply);
            
            if (supply.add(_amount) >= MAX_SUPPLY) {
                maxSupplyHit = true;
            }

            // activate gets called at every accumulation end to reset rewards
            IAvalanche(avalancheAddress()).activate();            

            if (currentEpoch == 0) {
                currentEpoch += 1;
            } else {
                currentPhase += 1;
            }
            emit EpochUpdated(_msgSender(), currentEpoch, currentPhase);
        }

        if (_amount > 0) {
            _mint(_to, _amount);
        }
    }

    // Transfer override to support transfer fees that are sent to Avalanche
    function _transfer(
        address sender, 
        address recipient, 
        uint256 amount
    ) 
        internal
        override
    {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        uint256 transferFeeAmount;
        uint256 tokensToTransfer;
        if (amount > 0) {
            address avalancheAddress = avalancheAddress();

            // Send a fee to the Avalanche staking contract if this isn't a whitelisted transfer
            if (_isWhitelistedTransfer(sender, recipient) != true) {
                transferFeeAmount = amount.mul(transferFee).div(1000);
                _balances[avalancheAddress] = _balances[avalancheAddress].add(transferFeeAmount);
                IAvalanche(avalancheAddress).addPwdrReward(sender, transferFeeAmount);
                emit Transfer(sender, avalancheAddress, transferFeeAmount);
            }
            tokensToTransfer = amount.sub(transferFeeAmount);
            _balances[sender] = _balances[sender].sub(tokensToTransfer, "ERC20: transfer amount exceeds balance");

            if (tokensToTransfer > 0) {
                _balances[recipient] = _balances[recipient].add(tokensToTransfer);

                // If the Avalanche is the transfer recipient, add rewards to keep balances updated
                if (recipient == avalancheAddress) {
                    IAvalanche(avalancheAddress).addPwdrReward(sender, tokensToTransfer);
                }
            }

        }
        emit Transfer(sender, recipient, tokensToTransfer);
    }

    // Admin calls this at token deployment to setup PWDR-LP LGE transfers
    function calculateUniswapPoolAddress() 
        external
        view 
        HasPatrol("ADMIN")
        returns (address)
    {
        address uniswapRouter = uniswapRouterAddress();
        address wethAddress = wethAddress();

        // Calculate the address the PWDR-ETH Uniswap pool will exist at
        address factoryAddress = IUniswapV2Router02(uniswapRouter).factory();
        // return IUniswapV2Factory(factoryAddress).createPair(wethAddress, address(this));

        // token0 must be strictly less than token1 by sort order to determine the correct address
        (address token0, address token1) = address(this) < wethAddress 
            ? (address(this), wethAddress) 
            : (wethAddress, address(this));

        //uniswap address pre-calculation using create2
        return address(uint(keccak256(abi.encodePacked(
            hex'ff',
            factoryAddress,
            keccak256(abi.encodePacked(token0, token1)),
            hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'
        ))));
    }

    // Sets the PWDR transfer fee that gets rewarded to Avalanche stakers. Can't be higher than 5%.
    function setTransferFee(uint256 _transferFee) 
        public
        override
        HasPatrol("ADMIN")
    {
        require(_transferFee <= 50, "over 5%");
        transferFee = _transferFee;
    }

    // Add an address to the sender or recipient transfer whitelist
    function addToTransferWhitelist(bool _addToSenderWhitelist, address _address) 
        public
        override 
        HasPatrol("ADMIN") 
    {
        if (_addToSenderWhitelist == true) {
            senderWhitelist[_address] = true;
        } else {
            recipientWhitelist[_address] = true;
        }
    }

    // Remove an address from the sender or recipient transfer whitelist
    function removeFromTransferWhitelist(bool _removeFromSenderWhitelist, address _address) 
        public
        override
        HasPatrol("ADMIN") 
    {
        if (_removeFromSenderWhitelist == true) {
            senderWhitelist[_address] = false;
        } else  {
            recipientWhitelist[_address] = false;
        }
    }

    // Internal function to determine if a PWDR transfer is being sent or received by a whitelisted address
    function _isWhitelistedTransfer(
        address _sender, 
        address _recipient
    ) 
        internal 
        view 
        returns (bool) 
    {
        // Ecosytem contracts should not pay transfer fees
        return _sender == avalancheAddress() || _recipient == avalancheAddress()
            || _sender == lgeAddress() || _recipient == lgeAddress()
            || _sender == slopesAddress() || _recipient == slopesAddress()
            || senderWhitelist[_sender] == true || recipientWhitelist[_recipient] == true;
    }
}

File 2 of 18 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 18 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 4 of 18 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 18 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 6 of 18 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 7 of 18 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 8 of 18 : IAccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

interface IAccessControl {
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
    function DEFAULT_ADMIN_ROLE() external view returns (bytes32);
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

File 9 of 18 : IAddressRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

interface IAddressRegistry {
    event AvalancheUpdated(address indexed newAddress);
    event LGEUpdated(address indexed newAddress);
    event LodgeUpdated(address indexed newAddress);
    event LoyaltyUpdated(address indexed newAddress);
    event PwdrUpdated(address indexed newAddress);
    event PwdrPoolUpdated(address indexed newAddress);
    event SlopesUpdated(address indexed newAddress);
    event SnowPatrolUpdated(address indexed newAddress);
    event TreasuryUpdated(address indexed newAddress);
    event UniswapRouterUpdated(address indexed newAddress);
    event VaultUpdated(address indexed newAddress);
    event WethUpdated(address indexed newAddress);
    
    function getAvalanche() external view returns (address);
    function setAvalanche(address _address) external;

    function getLGE() external view returns (address);
    function setLGE(address _address) external;

    function getLodge() external view returns (address);
    function setLodge(address _address) external;

    function getLoyalty() external view returns (address);
    function setLoyalty(address _address) external;

    function getPwdr() external view returns (address);
    function setPwdr(address _address) external;

    function getPwdrPool() external view returns (address);
    function setPwdrPool(address _address) external;

    function getSlopes() external view returns (address);
    function setSlopes(address _address) external;

    function getSnowPatrol() external view returns (address);
    function setSnowPatrol(address _address) external;

    function getTreasury() external view returns (address payable);
    function setTreasury(address _address) external;

    function getUniswapRouter() external view returns (address);
    function setUniswapRouter(address _address) external;

    function getVault() external view returns (address);
    function setVault(address _address) external;

    function getWeth() external view returns (address);
    function setWeth(address _address) external;
}

File 10 of 18 : IAvalanche.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

interface IAvalanche {
    event Activated(address indexed user);
    event Claim(address indexed user, uint256 pwdrAmount);    
    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event PwdrRewardAdded(address indexed user, uint256 pwdrReward);
    event EthRewardAdded(address indexed user, uint256 ethReward);

    function active() external view returns (bool);
    function activate() external;

    function addPwdrReward(address _from, uint256 _amount) external;
    // function addEthReward() external virtual payable;
    function deposit(uint256 _amount) external;
    function depositFor(address _from, address _user, uint256 _amount) external;
    function claim() external;
    function claimFor(address _user) external;
    function withdraw(uint256 _amount) external;

    function payoutNumber() external view returns (uint256);
    function timeUntilNextPayout() external view returns (uint256); 
    function rewardAtPayout(uint256 _payoutNumber) external view returns (uint256);
}

File 11 of 18 : IPWDR.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

interface IPWDR {
    event EpochUpdated(address _address, uint256 _epoch, uint256 _phase);

    function MAX_SUPPLY() external view returns (uint256);
    function maxSupplyHit() external view returns (bool);
    function transferFee() external view returns (uint256);
    function currentEpoch() external view returns (uint256);
    function currentPhase() external view returns (uint256);
    function epochMaxSupply(uint _epoch) external view returns (uint256);
    function epochBaseRate(uint _epoch) external view returns (uint256);

    function accumulating() external view returns (bool);
    function currentMaxSupply() external view returns (uint256);
    function currentBaseRate() external view returns (uint256);
    // function incrementEpoch() external;
    // function incrementPhase() external;
    
    function updateEpoch(uint256 _epoch, uint256 _phase) external;
    function mint(address _to, uint256 _amount) external;
    function setTransferFee(uint256 _transferFee) external;
    function addToTransferWhitelist(bool _addToSenderWhitelist, address _address) external;
    function removeFromTransferWhitelist(bool _removeFromSenderWhitelist, address _address) external;
}

File 12 of 18 : ISnowPatrol.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import { AltitudeBase } from "../utils/AltitudeBase.sol";

interface ISnowPatrol {
    function ADMIN_ROLE() external pure returns (bytes32);
    function LGE_ROLE() external pure returns (bytes32);
    function PWDR_ROLE() external pure returns (bytes32);
    function SLOPES_ROLE() external pure returns (bytes32);
    function setCoreRoles() external;
}

File 13 of 18 : PWDRBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

// import { ERC20 } from "../utils/ERC20/ERC20.sol";

import { PWDRToken } from "./PWDRToken.sol";
import { PatrolBase } from "../utils/PatrolBase.sol";

abstract contract PWDRBase is PatrolBase, PWDRToken {
    constructor(
        address addressRegistry,
        string memory name_, 
        string memory symbol_
    ) 
        public
        PWDRToken(name_, symbol_)
    {
        _setAddressRegistry(addressRegistry);
    }
}

File 14 of 18 : PWDRToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

// import { ERC20 } from "../utils/ERC20/ERC20.sol";
import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import { Context } from "@openzeppelin/contracts/GSN/Context.sol";

// Standed ERC20 with internal _balances, virtual _transfer, and add'l helper funcs
// Modificiations made out of ecosystem necessity  
abstract contract PWDRToken is IERC20, Context {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual;

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

File 15 of 18 : AddressBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import { IAddressRegistry } from "../interfaces/IAddressRegistry.sol";
import { UtilitiesBase } from "./UtilitiesBase.sol";

abstract contract AddressBase is UtilitiesBase {
    address internal _addressRegistry;

    function _setAddressRegistry(address _address)
        internal
    {
        _addressRegistry = _address;
    }
}

File 16 of 18 : AltitudeBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import { IAddressRegistry } from "../interfaces/IAddressRegistry.sol";
import { ISnowPatrol } from "../interfaces/ISnowPatrol.sol";
import { AddressBase } from "./AddressBase.sol";

abstract contract AltitudeBase is AddressBase {
    modifier OnlyLGE {
        require(
            _msgSender() == lgeAddress(), 
            "Only the LGE contract can call this function"
        );
        _;
    }

    modifier OnlyLoyalty {
        require(
            _msgSender() == loyaltyAddress(), 
            "Only the Loyalty contract can call this function"
        );
        _;
    }

    modifier OnlyPWDR {
        require(
            _msgSender() == pwdrAddress(),
            "Only PWDR Contract can call this function"
        );
        _;
    }

    modifier OnlySlopes {
        require(
            _msgSender() == slopesAddress(), 
            "Only the Slopes contract can call this function"
        );
        _;
    }

    function avalancheAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getAvalanche();
    }

    function lgeAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getLGE();
    }

    function lodgeAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getLodge();
    }

    function loyaltyAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getLoyalty();
    }

    function pwdrAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getPwdr();
    }

    function pwdrPoolAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getPwdrPool();
    }

    function slopesAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getSlopes();
    }

    function snowPatrolAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getSnowPatrol();
    }

    function treasuryAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getTreasury();
    }

    function uniswapRouterAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getUniswapRouter();
    }

    function vaultAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getVault();
    }

    function wethAddress() internal view returns (address) {
        return IAddressRegistry(_addressRegistry).getWeth();
    }
}

File 17 of 18 : PatrolBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import { AltitudeBase } from "./AltitudeBase.sol";
import { IAddressRegistry } from "../interfaces/IAddressRegistry.sol";
import { IAccessControl } from "../interfaces/IAccessControl.sol";

contract PatrolBase is AltitudeBase {
    modifier HasPatrol(bytes memory _patrol) {
        require(
            IAccessControl(snowPatrolAddress()).hasRole(keccak256(_patrol), address(_msgSender())),
            "Account does not have sufficient role to call this function"
        );
        _;
    }

    function hasPatrol(bytes memory _patrol, address _address)
        internal
        view
        returns (bool)
    {
        return IAccessControl(snowPatrolAddress()).hasRole(keccak256(_patrol), _address);
    }
}

File 18 of 18 : UtilitiesBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Context } from "@openzeppelin/contracts/GSN/Context.sol";

abstract contract UtilitiesBase is Context {
    modifier NonZeroAmount(uint256 _amount) {
        require(
            _amount > 0, 
            "Amount must be greater than zero"
        );
        _;
    }

    modifier NonZeroTokenBalance(address _address) {
        require(
            IERC20(_address).balanceOf(address(this)) > 0,
            "No tokens to transfer"
        );
        _;
    }

    modifier NonZeroETHBalance(address _address) {
        require(
            address(this).balance > 0,
            "No ETH to transfer"
        );
        _;
    }

    modifier OnlyOrigin {
        require(
            tx.origin == address(this), 
            "Only origin contract can call this function"
        );
        _;
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"addressRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_phase","type":"uint256"}],"name":"EpochUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accumulating","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_addToSenderWhitelist","type":"bool"},{"internalType":"address","name":"_address","type":"address"}],"name":"addToTransferWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateUniswapPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupplyHit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recipientWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_removeFromSenderWhitelist","type":"bool"},{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromTransferWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"senderWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epoch","type":"uint256"},{"internalType":"uint256","name":"_phase","type":"uint256"}],"name":"updateEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620022dd380380620022dd833981810160405260208110156200003757600080fd5b50516040805180820182526008815267416c74697475646560c01b60208281019182528351808501909452600480855263282ba22960e11b918501919091528251859492849284926200008b929062000208565b508051620000a190600590602084019062000208565b50506006805460ff1916601217905550620000bc83620000d5565b5050600f60075550620000ce620000f7565b50620002a4565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6200010f6a0457bb11fdb3df8d4000006000620001a3565b620001286a0af5cbf0741b4c95400000610320620001a3565b620001416a0e44d45faf4f0319400000610190620001a3565b620001596a0fec58974ce8de5b40000060c8620001a3565b620001716a10c01ab31bb5cbfc4000006064620001a3565b620001896a1129fbc1031c42ccc000006032620001a3565b620001a16a115eec47f6cf7e350000006019620001a3565b565b600a805460018181019092557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80192909255600b805492830181556000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910155565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200024b57805160ff19168380011785556200027b565b828001600101855582156200027b579182015b828111156200027b5782518255916020019190600101906200025e565b50620002899291506200028d565b5090565b5b808211156200028957600081556001016200028e565b61202980620002b46000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806340c10f19116101045780638f02bb5b116100a2578063a9059cbb11610071578063a9059cbb14610529578063acb2ad6f14610555578063b41328701461055d578063dd62ed3e14610565576101cf565b80638f02bb5b146104b257806395d89b41146104cf578063a457c2d7146104d7578063a818655814610503576101cf565b806371e7a802116100de57806371e7a8021461044e57806376671808146104565780637b2bad2b1461045e5780638222f07d1461048c576101cf565b806340c10f19146103d957806353fdfab01461040557806370a0823114610428576101cf565b806318160ddd11610171578063308ee2481161014b578063308ee2481461037f578063313ce5671461038757806332cb6b0c146103a557806339509351146103ad576101cf565b806318160ddd1461031157806323b872dd146103195780632666ed0a1461034f576101cf565b80630db1d138116101ad5780630db1d138146102ab5780630fde9c05146102c8578063104aeef8146102ec57806313e3fb9e146102f4576101cf565b8063055ad42e146101d457806306fdde03146101ee578063095ea7b31461026b575b600080fd5b6101dc610593565b60408051918252519081900360200190f35b6101f6610599565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610230578181015183820152602001610218565b50505050905090810190601f16801561025d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102976004803603604081101561028157600080fd5b506001600160a01b03813516906020013561062f565b604080519115158252519081900360200190f35b6101dc600480360360208110156102c157600080fd5b503561064d565b6102d061066b565b604080516001600160a01b039092168252519081900360200190f35b6101dc6108c4565b6101dc6004803603602081101561030a57600080fd5b50356108e5565b6101dc6108f2565b6102976004803603606081101561032f57600080fd5b506001600160a01b038135811691602081013590911690604001356108f8565b61037d6004803603604081101561036557600080fd5b508035151590602001356001600160a01b031661097f565b005b610297610ac4565b61038f610aeb565b6040805160ff9092168252519081900360200190f35b6101dc610af4565b610297600480360360408110156103c357600080fd5b506001600160a01b038135169060200135610b03565b61037d600480360360408110156103ef57600080fd5b506001600160a01b038135169060200135610b51565b61037d6004803603604081101561041b57600080fd5b5080359060200135610dfc565b6101dc6004803603602081101561043e57600080fd5b50356001600160a01b0316610fc6565b6101dc610fe1565b6101dc610ff2565b61037d6004803603604081101561047457600080fd5b508035151590602001356001600160a01b0316610ff8565b610297600480360360208110156104a257600080fd5b50356001600160a01b0316611142565b61037d600480360360208110156104c857600080fd5b5035611157565b6101f66112a2565b610297600480360360408110156104ed57600080fd5b506001600160a01b038135169060200135611303565b6102976004803603602081101561051957600080fd5b50356001600160a01b031661136b565b6102976004803603604081101561053f57600080fd5b506001600160a01b038135169060200135611380565b6101dc611394565b61029761139a565b6101dc6004803603604081101561057b57600080fd5b506001600160a01b03813581169160200135166113a8565b60095481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061064361063c6113d3565b84846113d7565b5060015b92915050565b600b818154811061065a57fe5b600091825260209091200154905081565b60006040518060400160405280600581526020016420a226a4a760d91b8152506106936114c3565b6001600160a01b03166391d1485482805190602001206106b16113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156106f557600080fd5b505afa158015610709573d6000803e3d6000fd5b505050506040513d602081101561071f57600080fd5b505161075c5760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b6000610766611543565b90506000610772611592565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156107af57600080fd5b505afa1580156107c3573d6000803e3d6000fd5b505050506040513d60208110156107d957600080fd5b505190506000806001600160a01b03841630106107f75783306107fa565b30845b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529790941b9093166069840152607d8301959095527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528551808403909101815260bd90920190945280519301929092209550505050505090565b6000600a600854815481106108d557fe5b9060005260206000200154905090565b600a818154811061065a57fe5b60035490565b60006109058484846115e1565b610975846109116113d3565b61097085604051806060016040528060288152602001611f5e602891396001600160a01b038a1660009081526002602052604081209061094f6113d3565b6001600160a01b031681526020810191909152604001600020549190611921565b6113d7565b5060019392505050565b6040518060400160405280600581526020016420a226a4a760d91b8152506109a56114c3565b6001600160a01b03166391d1485482805190602001206109c36113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b158015610a0757600080fd5b505afa158015610a1b573d6000803e3d6000fd5b505050506040513d6020811015610a3157600080fd5b5051610a6e5760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b60018315151415610a9e576001600160a01b0382166000908152600c60205260409020805460ff19169055610abf565b6001600160a01b0382166000908152600d60205260409020805460ff191690555b505050565b600080600854118015610ada5750600660085411155b8015610ae65750600954155b905090565b60065460ff1690565b6a115eec47f6cf7e3500000081565b6000610643610b106113d3565b846109708560026000610b216113d3565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906119b8565b60095415610ba6576040805162461bcd60e51b815260206004820152601b60248201527f50574452206973206e6f7420696e20416363756d756c6174696f6e0000000000604482015290519081900360640190fd5b600654610100900460ff1615610c03576040805162461bcd60e51b815260206004820181905260248201527f4d6178205057445220537570706c7920686173206265656e2072656163686564604482015290519081900360640190fd5b610c0b611a19565b6001600160a01b0316336001600160a01b03161480610c425750610c2d611a68565b6001600160a01b0316336001600160a01b0316145b80610c655750610c50611ab7565b6001600160a01b0316336001600160a01b0316145b610ca05760405162461bcd60e51b8152600401808060200182810382526040815260200180611e9c6040913960400191505060405180910390fd5b6000610caa6108f2565b90506000600a60085481548110610cbd57fe5b600091825260209091200154905080610cd683856119b8565b10610de657610ce58183611b06565b92506a115eec47f6cf7e35000000610cfd83856119b8565b10610d12576006805461ff0019166101001790555b610d1a611a19565b6001600160a01b0316630f15f4c06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d5457600080fd5b505af1158015610d68573d6000803e3d6000fd5b5050505060085460001415610d8557600880546001019055610d8f565b6009805460010190555b7fdfa95fe668d6ab10f33312099e193045aa32c97581c4e5e0b08ca0f6d14d71b7610db86113d3565b600854600954604080516001600160a01b039094168452602084019290925282820152519081900360600190a15b8215610df657610df68484611b48565b50505050565b610e04611a19565b6001600160a01b0316336001600160a01b03161480610e3b5750610e26611a68565b6001600160a01b0316336001600160a01b0316145b80610e5e5750610e49611ab7565b6001600160a01b0316336001600160a01b0316145b610e995760405162461bcd60e51b8152600401808060200182810382526040815260200180611e9c6040913960400191505060405180910390fd5b600954610f075760085482148015610eb15750806001145b610f02576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c69642045706f6368205068617365205570646174652043616c6c00604482015290519081900360640190fd5b610f67565b60085482118015610f16575080155b610f67576040805162461bcd60e51b815260206004820152601960248201527f496e76616c69642045706f6368205570646174652043616c6c00000000000000604482015290519081900360640190fd5b600882905560098190557fdfa95fe668d6ab10f33312099e193045aa32c97581c4e5e0b08ca0f6d14d71b7610f9a6113d3565b604080516001600160a01b03909216825260208201859052818101849052519081900360600190a15050565b6001600160a01b031660009081526001602052604090205490565b6000600b600854815481106108d557fe5b60085481565b6040518060400160405280600581526020016420a226a4a760d91b81525061101e6114c3565b6001600160a01b03166391d14854828051906020012061103c6113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b15801561108057600080fd5b505afa158015611094573d6000803e3d6000fd5b505050506040513d60208110156110aa57600080fd5b50516110e75760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b6001831515141561111a576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610abf565b6001600160a01b0382166000908152600d60205260409020805460ff19166001179055505050565b600c6020526000908152604090205460ff1681565b6040518060400160405280600581526020016420a226a4a760d91b81525061117d6114c3565b6001600160a01b03166391d14854828051906020012061119b6113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156111df57600080fd5b505afa1580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50516112465760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b603282111561129c576040805162461bcd60e51b815260206004820152600760248201527f6f76657220352500000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b50600755565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106255780601f106105fa57610100808354040283529160200191610625565b60006106436113106113d3565b8461097085604051806060016040528060258152602001611fcf602591396002600061133a6113d3565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611921565b600d6020526000908152604090205460ff1681565b600061064361138d6113d3565b84846115e1565b60075481565b600654610100900460ff1681565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661141c5760405162461bcd60e51b8152600401808060200182810382526024815260200180611fab6024913960400191505060405180910390fd5b6001600160a01b0382166114615760405162461bcd60e51b8152600401808060200182810382526022815260200180611e7a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008060009054906101000a90046001600160a01b03166001600160a01b0316637e221d626040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d602081101561153c57600080fd5b5051905090565b60008060009054906101000a90046001600160a01b03166001600160a01b031663524900b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b031663107c279f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b6001600160a01b0383166116265760405162461bcd60e51b8152600401808060200182810382526025815260200180611f866025913960400191505060405180910390fd5b6001600160a01b03821661166b5760405162461bcd60e51b8152600401808060200182810382526023815260200180611e576023913960400191505060405180910390fd5b60008082156118cf57600061167e611a19565b905061168a8686611c3a565b15156001146117ad576116b46103e86116ae60075487611d5b90919063ffffffff16565b90611db4565b6001600160a01b0382166000908152600160205260409020549093506116da90846119b8565b6001600160a01b038083166000818152600160205260408082209490945583517f041f023d000000000000000000000000000000000000000000000000000000008152928a166004840152602483018790529251909263041f023d926044808201939182900301818387803b15801561175257600080fd5b505af1158015611766573d6000803e3d6000fd5b50506040805186815290516001600160a01b0380861694508a1692507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b6117b78484611b06565b91506117f682604051806060016040528060268152602001611edc602691396001600160a01b0389166000908152600160205260409020549190611921565b6001600160a01b03871660009081526001602052604090205581156118cd576001600160a01b03851660009081526001602052604090205461183890836119b8565b6001600160a01b03808716600081815260016020526040902092909255821614156118cd57806001600160a01b031663041f023d87846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156118b457600080fd5b505af11580156118c8573d6000803e3d6000fd5b505050505b505b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050505050565b600081848411156119b05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561197557818101518382015260200161195d565b50505050905090810190601f1680156119a25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611a12576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663129978476040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b0316633fe9d8036040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b0316634326e3d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b6000611a1283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611921565b6001600160a01b038216611ba3576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611baf60008383610abf565b600354611bbc90826119b8565b6003556001600160a01b038216600090815260016020526040902054611be290826119b8565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000611c44611a19565b6001600160a01b0316836001600160a01b03161480611c7b5750611c66611a19565b6001600160a01b0316826001600160a01b0316145b80611c9e5750611c89611a68565b6001600160a01b0316836001600160a01b0316145b80611cc15750611cac611a68565b6001600160a01b0316826001600160a01b0316145b80611ce45750611ccf611ab7565b6001600160a01b0316836001600160a01b0316145b80611d075750611cf2611ab7565b6001600160a01b0316826001600160a01b0316145b80611d2f57506001600160a01b0383166000908152600c602052604090205460ff1615156001145b80611a125750506001600160a01b03166000908152600d602052604090205460ff161515600114919050565b600082611d6a57506000610647565b82820282848281611d7757fe5b0414611a125760405162461bcd60e51b8152600401808060200182810382526021815260200180611f3d6021913960400191505060405180910390fd5b6000611a1283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183611e405760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561197557818101518382015260200161195d565b506000838581611e4c57fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734f6e6c79204c47452c20536c6f7065732c20616e64204176616c616e63686520636f6e7472616374732063616e2063616c6c20746869732066756e6374696f6e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654163636f756e7420646f6573206e6f7420686176652073756666696369656e7420726f6c6520746f2063616c6c20746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202a6469132e6017baacddb37c379c5430a734710915343a113f83dc9f79b19d7564736f6c634300060c00330000000000000000000000001ec4a8b60191230c4c6b4db79e321441b63bd143

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806340c10f19116101045780638f02bb5b116100a2578063a9059cbb11610071578063a9059cbb14610529578063acb2ad6f14610555578063b41328701461055d578063dd62ed3e14610565576101cf565b80638f02bb5b146104b257806395d89b41146104cf578063a457c2d7146104d7578063a818655814610503576101cf565b806371e7a802116100de57806371e7a8021461044e57806376671808146104565780637b2bad2b1461045e5780638222f07d1461048c576101cf565b806340c10f19146103d957806353fdfab01461040557806370a0823114610428576101cf565b806318160ddd11610171578063308ee2481161014b578063308ee2481461037f578063313ce5671461038757806332cb6b0c146103a557806339509351146103ad576101cf565b806318160ddd1461031157806323b872dd146103195780632666ed0a1461034f576101cf565b80630db1d138116101ad5780630db1d138146102ab5780630fde9c05146102c8578063104aeef8146102ec57806313e3fb9e146102f4576101cf565b8063055ad42e146101d457806306fdde03146101ee578063095ea7b31461026b575b600080fd5b6101dc610593565b60408051918252519081900360200190f35b6101f6610599565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610230578181015183820152602001610218565b50505050905090810190601f16801561025d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102976004803603604081101561028157600080fd5b506001600160a01b03813516906020013561062f565b604080519115158252519081900360200190f35b6101dc600480360360208110156102c157600080fd5b503561064d565b6102d061066b565b604080516001600160a01b039092168252519081900360200190f35b6101dc6108c4565b6101dc6004803603602081101561030a57600080fd5b50356108e5565b6101dc6108f2565b6102976004803603606081101561032f57600080fd5b506001600160a01b038135811691602081013590911690604001356108f8565b61037d6004803603604081101561036557600080fd5b508035151590602001356001600160a01b031661097f565b005b610297610ac4565b61038f610aeb565b6040805160ff9092168252519081900360200190f35b6101dc610af4565b610297600480360360408110156103c357600080fd5b506001600160a01b038135169060200135610b03565b61037d600480360360408110156103ef57600080fd5b506001600160a01b038135169060200135610b51565b61037d6004803603604081101561041b57600080fd5b5080359060200135610dfc565b6101dc6004803603602081101561043e57600080fd5b50356001600160a01b0316610fc6565b6101dc610fe1565b6101dc610ff2565b61037d6004803603604081101561047457600080fd5b508035151590602001356001600160a01b0316610ff8565b610297600480360360208110156104a257600080fd5b50356001600160a01b0316611142565b61037d600480360360208110156104c857600080fd5b5035611157565b6101f66112a2565b610297600480360360408110156104ed57600080fd5b506001600160a01b038135169060200135611303565b6102976004803603602081101561051957600080fd5b50356001600160a01b031661136b565b6102976004803603604081101561053f57600080fd5b506001600160a01b038135169060200135611380565b6101dc611394565b61029761139a565b6101dc6004803603604081101561057b57600080fd5b506001600160a01b03813581169160200135166113a8565b60095481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061064361063c6113d3565b84846113d7565b5060015b92915050565b600b818154811061065a57fe5b600091825260209091200154905081565b60006040518060400160405280600581526020016420a226a4a760d91b8152506106936114c3565b6001600160a01b03166391d1485482805190602001206106b16113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156106f557600080fd5b505afa158015610709573d6000803e3d6000fd5b505050506040513d602081101561071f57600080fd5b505161075c5760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b6000610766611543565b90506000610772611592565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156107af57600080fd5b505afa1580156107c3573d6000803e3d6000fd5b505050506040513d60208110156107d957600080fd5b505190506000806001600160a01b03841630106107f75783306107fa565b30845b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529790941b9093166069840152607d8301959095527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528551808403909101815260bd90920190945280519301929092209550505050505090565b6000600a600854815481106108d557fe5b9060005260206000200154905090565b600a818154811061065a57fe5b60035490565b60006109058484846115e1565b610975846109116113d3565b61097085604051806060016040528060288152602001611f5e602891396001600160a01b038a1660009081526002602052604081209061094f6113d3565b6001600160a01b031681526020810191909152604001600020549190611921565b6113d7565b5060019392505050565b6040518060400160405280600581526020016420a226a4a760d91b8152506109a56114c3565b6001600160a01b03166391d1485482805190602001206109c36113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b158015610a0757600080fd5b505afa158015610a1b573d6000803e3d6000fd5b505050506040513d6020811015610a3157600080fd5b5051610a6e5760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b60018315151415610a9e576001600160a01b0382166000908152600c60205260409020805460ff19169055610abf565b6001600160a01b0382166000908152600d60205260409020805460ff191690555b505050565b600080600854118015610ada5750600660085411155b8015610ae65750600954155b905090565b60065460ff1690565b6a115eec47f6cf7e3500000081565b6000610643610b106113d3565b846109708560026000610b216113d3565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906119b8565b60095415610ba6576040805162461bcd60e51b815260206004820152601b60248201527f50574452206973206e6f7420696e20416363756d756c6174696f6e0000000000604482015290519081900360640190fd5b600654610100900460ff1615610c03576040805162461bcd60e51b815260206004820181905260248201527f4d6178205057445220537570706c7920686173206265656e2072656163686564604482015290519081900360640190fd5b610c0b611a19565b6001600160a01b0316336001600160a01b03161480610c425750610c2d611a68565b6001600160a01b0316336001600160a01b0316145b80610c655750610c50611ab7565b6001600160a01b0316336001600160a01b0316145b610ca05760405162461bcd60e51b8152600401808060200182810382526040815260200180611e9c6040913960400191505060405180910390fd5b6000610caa6108f2565b90506000600a60085481548110610cbd57fe5b600091825260209091200154905080610cd683856119b8565b10610de657610ce58183611b06565b92506a115eec47f6cf7e35000000610cfd83856119b8565b10610d12576006805461ff0019166101001790555b610d1a611a19565b6001600160a01b0316630f15f4c06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d5457600080fd5b505af1158015610d68573d6000803e3d6000fd5b5050505060085460001415610d8557600880546001019055610d8f565b6009805460010190555b7fdfa95fe668d6ab10f33312099e193045aa32c97581c4e5e0b08ca0f6d14d71b7610db86113d3565b600854600954604080516001600160a01b039094168452602084019290925282820152519081900360600190a15b8215610df657610df68484611b48565b50505050565b610e04611a19565b6001600160a01b0316336001600160a01b03161480610e3b5750610e26611a68565b6001600160a01b0316336001600160a01b0316145b80610e5e5750610e49611ab7565b6001600160a01b0316336001600160a01b0316145b610e995760405162461bcd60e51b8152600401808060200182810382526040815260200180611e9c6040913960400191505060405180910390fd5b600954610f075760085482148015610eb15750806001145b610f02576040805162461bcd60e51b815260206004820152601f60248201527f496e76616c69642045706f6368205068617365205570646174652043616c6c00604482015290519081900360640190fd5b610f67565b60085482118015610f16575080155b610f67576040805162461bcd60e51b815260206004820152601960248201527f496e76616c69642045706f6368205570646174652043616c6c00000000000000604482015290519081900360640190fd5b600882905560098190557fdfa95fe668d6ab10f33312099e193045aa32c97581c4e5e0b08ca0f6d14d71b7610f9a6113d3565b604080516001600160a01b03909216825260208201859052818101849052519081900360600190a15050565b6001600160a01b031660009081526001602052604090205490565b6000600b600854815481106108d557fe5b60085481565b6040518060400160405280600581526020016420a226a4a760d91b81525061101e6114c3565b6001600160a01b03166391d14854828051906020012061103c6113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b15801561108057600080fd5b505afa158015611094573d6000803e3d6000fd5b505050506040513d60208110156110aa57600080fd5b50516110e75760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b6001831515141561111a576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610abf565b6001600160a01b0382166000908152600d60205260409020805460ff19166001179055505050565b600c6020526000908152604090205460ff1681565b6040518060400160405280600581526020016420a226a4a760d91b81525061117d6114c3565b6001600160a01b03166391d14854828051906020012061119b6113d3565b6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156111df57600080fd5b505afa1580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50516112465760405162461bcd60e51b815260040180806020018281038252603b815260200180611f02603b913960400191505060405180910390fd5b603282111561129c576040805162461bcd60e51b815260206004820152600760248201527f6f76657220352500000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b50600755565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106255780601f106105fa57610100808354040283529160200191610625565b60006106436113106113d3565b8461097085604051806060016040528060258152602001611fcf602591396002600061133a6113d3565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611921565b600d6020526000908152604090205460ff1681565b600061064361138d6113d3565b84846115e1565b60075481565b600654610100900460ff1681565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661141c5760405162461bcd60e51b8152600401808060200182810382526024815260200180611fab6024913960400191505060405180910390fd5b6001600160a01b0382166114615760405162461bcd60e51b8152600401808060200182810382526022815260200180611e7a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008060009054906101000a90046001600160a01b03166001600160a01b0316637e221d626040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d602081101561153c57600080fd5b5051905090565b60008060009054906101000a90046001600160a01b03166001600160a01b031663524900b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b031663107c279f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b6001600160a01b0383166116265760405162461bcd60e51b8152600401808060200182810382526025815260200180611f866025913960400191505060405180910390fd5b6001600160a01b03821661166b5760405162461bcd60e51b8152600401808060200182810382526023815260200180611e576023913960400191505060405180910390fd5b60008082156118cf57600061167e611a19565b905061168a8686611c3a565b15156001146117ad576116b46103e86116ae60075487611d5b90919063ffffffff16565b90611db4565b6001600160a01b0382166000908152600160205260409020549093506116da90846119b8565b6001600160a01b038083166000818152600160205260408082209490945583517f041f023d000000000000000000000000000000000000000000000000000000008152928a166004840152602483018790529251909263041f023d926044808201939182900301818387803b15801561175257600080fd5b505af1158015611766573d6000803e3d6000fd5b50506040805186815290516001600160a01b0380861694508a1692507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b6117b78484611b06565b91506117f682604051806060016040528060268152602001611edc602691396001600160a01b0389166000908152600160205260409020549190611921565b6001600160a01b03871660009081526001602052604090205581156118cd576001600160a01b03851660009081526001602052604090205461183890836119b8565b6001600160a01b03808716600081815260016020526040902092909255821614156118cd57806001600160a01b031663041f023d87846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156118b457600080fd5b505af11580156118c8573d6000803e3d6000fd5b505050505b505b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050505050565b600081848411156119b05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561197557818101518382015260200161195d565b50505050905090810190601f1680156119a25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611a12576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663129978476040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b0316633fe9d8036040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b0316634326e3d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561151257600080fd5b6000611a1283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611921565b6001600160a01b038216611ba3576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611baf60008383610abf565b600354611bbc90826119b8565b6003556001600160a01b038216600090815260016020526040902054611be290826119b8565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000611c44611a19565b6001600160a01b0316836001600160a01b03161480611c7b5750611c66611a19565b6001600160a01b0316826001600160a01b0316145b80611c9e5750611c89611a68565b6001600160a01b0316836001600160a01b0316145b80611cc15750611cac611a68565b6001600160a01b0316826001600160a01b0316145b80611ce45750611ccf611ab7565b6001600160a01b0316836001600160a01b0316145b80611d075750611cf2611ab7565b6001600160a01b0316826001600160a01b0316145b80611d2f57506001600160a01b0383166000908152600c602052604090205460ff1615156001145b80611a125750506001600160a01b03166000908152600d602052604090205460ff161515600114919050565b600082611d6a57506000610647565b82820282848281611d7757fe5b0414611a125760405162461bcd60e51b8152600401808060200182810382526021815260200180611f3d6021913960400191505060405180910390fd5b6000611a1283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183611e405760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561197557818101518382015260200161195d565b506000838581611e4c57fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734f6e6c79204c47452c20536c6f7065732c20616e64204176616c616e63686520636f6e7472616374732063616e2063616c6c20746869732066756e6374696f6e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654163636f756e7420646f6573206e6f7420686176652073756666696369656e7420726f6c6520746f2063616c6c20746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202a6469132e6017baacddb37c379c5430a734710915343a113f83dc9f79b19d7564736f6c634300060c0033

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

0000000000000000000000001ec4a8b60191230c4c6b4db79e321441b63bd143

-----Decoded View---------------
Arg [0] : addressRegistry (address): 0x1eC4A8b60191230C4c6b4dB79e321441B63BD143

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001ec4a8b60191230c4c6b4db79e321441b63bd143


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Altitude (PWDR) is an evolutionary cryptocurrency that is pushing the limits of DeFi by combining yield farming, flash loans, and community governance.

Validator Index Block Amount
View All Withdrawals

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

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