Token
BrownFi V2 (BF-V2)
ERC-20
Overview
Max Total Supply
26,306.439585714897729371 BF-V2
Holders
3
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.015114195128763132 BF-V2Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BrownFiV2Pair
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 999999 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
import './interfaces/IBrownFiV2Pair.sol';
import './BrownFiV2ERC20.sol';
import './libraries/Math.sol';
import '@uniswap/v3-core/contracts/libraries/FullMath.sol';
import './libraries/UQ112x112.sol';
import './interfaces/IERC20.sol';
import './interfaces/IBrownFiV2Factory.sol';
import './interfaces/IBrownFiV2Callee.sol';
contract BrownFiV2Pair is IBrownFiV2Pair, BrownFiV2ERC20 {
using SafeMath for uint;
using UQ112x112 for uint224;
uint public constant override MINIMUM_LIQUIDITY = 10**3;
uint32 public constant PRECISION = 1e5;
uint public constant Q64 = 1 << 64;
address public immutable override factory;
address public override token0;
uint8 public token0Decimals;
address public override token1;
uint8 public token1Decimals;
uint112 private reserve0; // uses single storage slot, accessible via getReserves
uint112 private reserve1; // uses single storage slot, accessible via getReserves
uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves
bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
uint32 public override k = 100; // default 0.001
uint32 public override lambda = 0; // default 0
uint32 public override fee = 300; // default 0.3%
uint32 public protocolFee = 10000; // default 10%
uint private unlocked = 1;
modifier lock() {
require(unlocked == 1, 'BrownFiV2: LOCKED');
unlocked = 0;
_;
unlocked = 1;
}
modifier whenNotPaused() {
require(!IBrownFiV2Factory(factory).isPaused(), "BrownFiV2: PAUSED");
_;
}
modifier onlyFactory() {
require(msg.sender == factory, 'BrownFiV2: ONLY_FACTORY');
_;
}
function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
_reserve0 = reserve0;
_reserve1 = reserve1;
_blockTimestampLast = blockTimestampLast;
}
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'BrownFiV2: TRANSFER_FAILED');
}
constructor() {
factory = msg.sender;
}
// called once by the factory at time of deployment
function initialize(address _token0, address _token1) external {
require(msg.sender == factory, 'BrownFiV2: FORBIDDEN'); // sufficient check
token0 = _token0;
token1 = _token1;
token0Decimals = IERC20(_token0).decimals();
token1Decimals = IERC20(_token1).decimals();
}
function _getPrices() internal view returns (uint price0, uint price1) {
uint minPriceAge = IBrownFiV2Factory(factory).minPriceAge();
price0 = IBrownFiV2Factory(factory).priceOf(token0, minPriceAge);
price1 = IBrownFiV2Factory(factory).priceOf(token1, minPriceAge);
}
/**
* @dev convert raw amount to default decimals amount
*/
function _parseAmountToDefaultDecimals(uint8 tokenDecimals, uint amount) internal pure returns (uint formattedAmount) {
formattedAmount = tokenDecimals > decimals ?
amount / 10**uint(tokenDecimals - decimals) : amount * 10**uint(decimals - tokenDecimals);
}
// update reserves and, on the first call per block, price accumulators
function _update(uint balance0, uint balance1) private {
require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, 'BrownFiV2: OVERFLOW');
uint32 blockTimestamp = uint32(block.timestamp % 2**32);
reserve0 = uint112(balance0);
reserve1 = uint112(balance1);
blockTimestampLast = blockTimestamp;
emit Sync(reserve0, reserve1);
}
// this low-level function should be called from a contract which performs important safety checks
function mint(address to) external lock whenNotPaused returns (uint liquidity) {
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
uint balance0 = IERC20(token0).balanceOf(address(this));
uint balance1 = IERC20(token1).balanceOf(address(this));
uint amount0 = balance0.sub(_reserve0);
uint amount1 = balance1.sub(_reserve1);
(uint price0, uint price1) = _getPrices();
uint parsedAmount0 = _parseAmountToDefaultDecimals(token0Decimals, amount0);
uint parsedAmount1 = _parseAmountToDefaultDecimals(token1Decimals, amount1);
uint minValue = Math.min(parsedAmount0.mul(price0), parsedAmount1.mul(price1));
uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
if (_totalSupply == 0) {
liquidity = minValue.mul(2) / Q64 - MINIMUM_LIQUIDITY;
_mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
} else {
uint parsedReserve0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
uint parsedReserve1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
liquidity = FullMath.mulDiv(
_totalSupply,
minValue.mul(2),
price0.mul(parsedReserve0).add(
price1.mul(parsedReserve1)
)
);
}
require(liquidity > 0, 'BrownFiV2: INSUFFICIENT_LIQUIDITY_MINTED');
_mint(to, liquidity);
_update(balance0, balance1);
emit Mint(msg.sender, amount0, amount1, price0, price1, to);
}
// this low-level function should be called from a contract which performs important safety checks
function burn(address to) external lock whenNotPaused returns (uint amount0, uint amount1) {
address _token0 = token0; // gas savings
address _token1 = token1; // gas savings
uint balance0 = IERC20(_token0).balanceOf(address(this));
uint balance1 = IERC20(_token1).balanceOf(address(this));
uint liquidity = balanceOf[address(this)];
// bool feeOn = _mintFee(_reserve0, _reserve1);
uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
require(amount0 > 0 && amount1 > 0, 'BrownFiV2: INSUFFICIENT_LIQUIDITY_BURNED');
_burn(address(this), liquidity);
_safeTransfer(_token0, to, amount0);
_safeTransfer(_token1, to, amount1);
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
_update(balance0, balance1);
emit Burn(msg.sender, amount0, amount1, to);
}
// this low-level function should be called from a contract which performs important safety checks
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock whenNotPaused {
require(amount0Out > 0 || amount1Out > 0, 'BrownFiV2: INSUFFICIENT_OUTPUT_AMOUNT');
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
require(amount0Out.mul(10) <= uint(_reserve0).mul(8) && amount1Out.mul(10) <= uint(_reserve1).mul(8), 'BrownFiV2: INSUFFICIENT_LIQUIDITY');
uint balance0;
uint balance1;
{ // scope for _token{0,1}, avoids stack too deep errors
address _token0 = token0;
address _token1 = token1;
require(to != _token0 && to != _token1, 'BrownFiV2: INVALID_TO');
if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
if (data.length > 0) IBrownFiV2Callee(to).brownFiV2Call(msg.sender, amount0Out, amount1Out, data);
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
}
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
require(amount0In > 0 || amount1In > 0, 'BrownFiV2: INSUFFICIENT_INPUT_AMOUNT');
{ // scope for reserve{0,1}Adjusted, avoids stack too deep errors
(uint price0, uint price1) = _getPrices();
if (lambda > 0) {
(price0, price1) = computeSkewnessPrice(_reserve0, _reserve1, price0, price1);
}
uint amount0OutWithoutFee = FullMath.mulDiv(amount0Out, PRECISION, PRECISION + fee);
uint amount1OutWithoutFee = FullMath.mulDiv(amount1Out, PRECISION, PRECISION + fee);
// check inventory
if (amount0Out > 0) {
checkInventory(balance0, balance1, price0, price1, amount0OutWithoutFee, false);
}
if (amount1Out > 0) {
checkInventory(balance0, balance1, price0, price1, amount1OutWithoutFee, true);
}
// calculate protocol fee
if(protocolFee > 0) {
uint lpForProtocol;
uint _totalSupply = totalSupply;
uint inventoryRight = computeInventoryRight(price0, price1);
if (amount0In > 0) {
uint tradingFee = FullMath.mulDiv(amount0In, fee, PRECISION + fee);
uint protocolFeeInDollarValue = FullMath.mulDiv(tradingFee, protocolFee * price0, PRECISION);
lpForProtocol = FullMath.mulDiv(protocolFeeInDollarValue, _totalSupply, inventoryRight);
}
if (amount1In > 0) {
uint tradingFee = FullMath.mulDiv(amount1In, fee, PRECISION + fee);
uint protocolFeeInDollarValue = FullMath.mulDiv(tradingFee, protocolFee * price1, PRECISION);
lpForProtocol = FullMath.mulDiv(protocolFeeInDollarValue, _totalSupply, inventoryRight);
}
if (lpForProtocol > 0) {
_mint(IBrownFiV2Factory(factory).feeTo(), lpForProtocol);
}
}
_update(balance0, balance1);
emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, price0, price1, to);
}
}
function computeSkewnessPrice(uint _reserve0, uint _reserve1, uint _price0, uint _price1) internal view returns (uint, uint) {
// s = lambda * |x * px - y * py| / (x * px + y * py)
uint reserve0Price = _reserve0 * _price0;
uint reserve1Price = _reserve1 * _price1;
uint reservePriceDiff = reserve0Price >= reserve1Price ?
reserve0Price - reserve1Price :
reserve1Price - reserve0Price;
uint reservePriceSum = reserve0Price + reserve1Price;
uint s = FullMath.mulDiv(reservePriceDiff, lambda, reservePriceSum);
uint precisionPlusS = PRECISION + s;
uint precisionMinusS = PRECISION - s;
// if x > y, px = px * (1 - s), py = py * (1 + s)
// if x < y, px = px * (1 + s), py = py * (1 - s)
if (_reserve0 > _reserve1) {
return (
FullMath.mulDiv(_price0, precisionMinusS, PRECISION),
FullMath.mulDiv(_price1, precisionPlusS, PRECISION)
);
} else {
return (
FullMath.mulDiv(_price0, precisionPlusS, PRECISION),
FullMath.mulDiv(_price1, precisionMinusS, PRECISION)
);
}
}
function checkInventory(uint balance0, uint balance1, uint price0, uint price1, uint amountOut, bool zeroToOne) internal view {
uint _balance0 = _parseAmountToDefaultDecimals(token0Decimals, balance0);
uint _balance1 = _parseAmountToDefaultDecimals(token1Decimals, balance1);
uint _amountOut = _parseAmountToDefaultDecimals(zeroToOne ? token1Decimals : token0Decimals, amountOut);
uint left = computeInventoryLeft(_balance0, _balance1, price0, price1, _amountOut, zeroToOne);
uint right = computeInventoryRight(price0, price1);
require(left >= right, 'BrownFiV2: INVALID_INVENTORY');
}
function computeInventoryLeft(uint balance0, uint balance1, uint price0, uint price1, uint amountOut, bool zeroToOne) internal view returns (uint) {
uint32 _k = k;
uint balance = zeroToOne ? balance1 : balance0;
uint price = zeroToOne ? price1 : price0;
// Pre-calculate the denominator with one multiplication
uint denominator = balance.mul(PRECISION * 2);
return price0.mul(balance0).add(price1.mul(balance1)).sub(
FullMath.mulDiv(
price.mul(_k),
amountOut.mul(amountOut),
denominator
)
);
}
function computeInventoryRight(
uint price0,
uint price1
) internal view returns (uint) {
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
return price0.mul(_reserve0).add(price1.mul(_reserve1));
}
// force balances to match reserves
function skim(address to) external lock {
}
// force reserves to match balances
function sync() external lock {
_update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)));
}
function setK(uint32 _k) external onlyFactory {
require(k <= 2 * PRECISION, 'BrownFiV2: MAXIMUM_K');
k = _k;
}
function setLambda(uint32 _lambda) external onlyFactory {
require(_lambda <= PRECISION, 'BrownFiV2: MAXIMUM_LAMBDA'); // max 1
lambda = _lambda;
}
function setFee(uint32 _fee) external onlyFactory {
fee = _fee;
}
function setProtocolFee(uint32 _protocolFee) external onlyFactory {
protocolFee = _protocolFee;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
uint256 twos = (0 - denominator) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
// Invert denominator mod 2**256
// Now that denominator is an odd number, it has an inverse
// modulo 2**256 such that denominator * inv = 1 mod 2**256.
// Compute the inverse by starting with a seed that is correct
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use Newton-Raphson iteration to improve the precision.
// Thanks to Hensel's lifting lemma, this also works in modular
// arithmetic, doubling the correct bits in each step.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
// Because the division is now exact we can divide by multiplying
// with the modular inverse of denominator. This will give us the
// correct result modulo 2**256. Since the precoditions guarantee
// that the outcome is less than 2**256, this is the final result.
// We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inv;
return result;
}
}
/// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
function mulDivRoundingUp(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
result = mulDiv(a, b, denominator);
if (mulmod(a, b, denominator) > 0) {
require(result < type(uint256).max);
result++;
}
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
import './interfaces/IBrownFiV2ERC20.sol';
import './libraries/SafeMath.sol';
contract BrownFiV2ERC20 is IBrownFiV2ERC20 {
using SafeMath for uint;
string public constant override name = 'BrownFi V2';
string public constant override symbol = 'BF-V2';
uint8 public constant override decimals = 18;
uint public override totalSupply;
mapping(address => uint) public override balanceOf;
mapping(address => mapping(address => uint)) public override allowance;
bytes32 public override DOMAIN_SEPARATOR;
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
mapping(address => uint) public override nonces;
constructor() {
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
keccak256(bytes(name)),
keccak256(bytes('1')),
block.chainid,
address(this)
)
);
}
function _mint(address to, uint value) internal {
totalSupply = totalSupply.add(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(address(0), to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value);
totalSupply = totalSupply.sub(value);
emit Transfer(from, address(0), value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external override returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external override returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external override returns (bool) {
if (allowance[from][msg.sender] != type(uint256).max) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
}
_transfer(from, to, value);
return true;
}
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
require(deadline >= block.timestamp, 'BrownFiV2: EXPIRED');
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, 'BrownFiV2: INVALID_SIGNATURE');
_approve(owner, spender, value);
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2Callee {
function brownFiV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2ERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint 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 (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint totalPair);
event PauseStateChanged(bool paused);
function priceOracle() external view returns (address);
function feeTo() external view returns (address);
function priceOf(address token, uint256 priceAge) external view returns(uint256);
function minPriceAge() external view returns (uint);
function priceFeedIds(address token) external view returns (bytes32);
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, bytes32 priceFeedA, bytes32 priceFeedB) external returns (address pair);
function setPriceOracle(address newOracle) external;
function setFeeTo(address) external;
function setOracleOf(address token, bytes32 priceFeedId) external;
function setMinPriceAge(uint age) external;
function setPaused(bool paused) external;
function isPaused() external view returns (bool);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2Pair {
event Mint(address indexed sender, uint amount0, uint amount1, uint price0, uint price1, address indexed to);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
uint price0,
uint price1,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
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 k() external view returns (uint32);
function lambda() external view returns (uint32);
function fee() external view returns (uint32);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function setK(uint32 _k) external;
function setFee(uint32 _fee) external;
function setLambda(uint32 _lambda) external;
function setProtocolFee(uint32 _protocolFee) external;
function initialize(address, address) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
// a library for performing various math operations
library Math {
function min(uint x, uint y) internal pure returns (uint z) {
z = x < y ? x : y;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, 'ds-math-sub-underflow');
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
// range: [0, 2**112 - 1]
// resolution: 1 / 2**112
library UQ112x112 {
uint224 constant Q112 = 2**112;
// encode a uint112 as a UQ112x112
function encode(uint112 y) internal pure returns (uint224 z) {
z = uint224(y) * Q112; // never overflows
}
// divide a UQ112x112 by a uint112, returning a UQ112x112
function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
z = x / uint224(y);
}
}{
"optimizer": {
"enabled": true,
"runs": 999999
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract ABI
API[{"inputs":[],"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":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Q64","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"k","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lambda","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_fee","type":"uint32"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_k","type":"uint32"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_lambda","type":"uint32"}],"name":"setLambda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_protocolFee","type":"uint32"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0Decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a0604052346101495760405161001760408261014e565b600a815269213937bbb72334902b1960b11b602090910152604080517f6734371cf3152a7df61c4623a003b33fdd6df5cdf7648e19ad4b1d9eababb5159161005f908261014e565b600181526020810190603160f81b82525190206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526100c360c08261014e565b519020600355600880546001600160801b0319166d27100000012c00000000000000641790556001600955336080526040516139f2908161018882396080518181816107b0015281816109b501528181610b7b0152818161107c01528181611236015281816116fa0152818161181301528181611d120152818161205401526131280152f35b600080fd5b601f909101601f19168101906001600160401b0382119082101761017157604052565b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c8063022c0d9f14611f9457806306fdde0314611f1d5780630902f1ac14611e8c578063095ea7b314611e475780630b77884d14611e055780630dfe168114611db357806318160ddd14611d785780631ab971ab14611cb857806323b872dd14611b8e57806330adf81f14611b35578063313ce56714611afb57806333fca18714611ab95780633644e51514611a7d578063485cc955146117bb5780635f0865491461169f5780636a627842146111a857806370a0823114611145578063762bff4a1461101c5780637ecebe0014610fb957806389afcb4414610aee57806395d89b4114610a73578063a9059cbb14610a23578063aa9f76281461095b578063aaf5eb681461091f578063b0e21e8a146108da578063b31ac6e214610898578063b4f40c6114610856578063ba9a7a561461081b578063bc25cf77146107d4578063c45a015514610765578063d21220a714610713578063d505accf14610441578063dad0be61146103fd578063dd62ed3e14610382578063ddca3f431461033d5763fff6cae9146101a957600080fd5b3461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576101e5600160095414612c44565b806009556024602073ffffffffffffffffffffffffffffffffffffffff60055416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561032f5782906102fc575b60249150602073ffffffffffffffffffffffffffffffffffffffff60065416604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156102f15783916102b6575b6102ae9250613609565b600160095580f35b90506020823d6020116102e9575b816102d160209383612b6c565b810103126102e4576102ae9151906102a4565b600080fd5b3d91506102c4565b6040513d85823e3d90fd5b506020813d602011610327575b8161031660209383612b6c565b810103126102e45760249051610245565b3d9150610309565b6040513d84823e3d90fd5b80fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60085460401c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5773ffffffffffffffffffffffffffffffffffffffff60406103d1612b26565b92826103db612b49565b9416815260026020522091166000526020526020604060002054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff600854821c16604051908152f35b503461033a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610479612b26565b610481612b49565b6044359060643560843560ff811680910361070f574282106106b15760035473ffffffffffffffffffffffffffffffffffffffff861692838852600460205260408820908154917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314610684579282602095928b95600160809601905560405190878201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845289604084015273ffffffffffffffffffffffffffffffffffffffff8b1660608401528b8784015260a083015260c082015260c0815261056a60e082612b6c565b51902060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526105b1606282612b6c565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156106795773ffffffffffffffffffffffffffffffffffffffff85511690811515918261066f575b5050156106115761060e92613733565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f5349474e4154555245000000006044820152fd5b14905038806105fe565b6040513d86823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956323a204558504952454400000000000000000000000000006044820152fd5b8580fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5761080c612b26565b506102ae600160095414612c44565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516103e88152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60085416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60055460a01c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60085460601c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051620186a08152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff81168103610a1f576109dc73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d8e565b7fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff6fffffffff0000000000000000000000006008549260601b1691161760085580f35b5080fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610a68610a5e612b26565b6024359033613809565b602060405160018152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610aea604051610ab4604082612b6c565b600581527f42462d5632000000000000000000000000000000000000000000000000000000602082015260405191829182612bdc565b0390f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b26612b26565b610b34600160095414612c44565b816009556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102f157610bb5918491610f8a575b5015612cc1565b73ffffffffffffffffffffffffffffffffffffffff600554169173ffffffffffffffffffffffffffffffffffffffff6006541691604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481885afa928315610f7d578193610f49575b50604051937f70a08231000000000000000000000000000000000000000000000000000000008552306004860152602085602481845afa94851561032f578295610f15575b503082526001602052610ca4610c98610c98610c9d60408620549786549384918a612f39565b612e0c565b9787612f39565b9385151580610f0c575b15610e88576024968360209230825260018452610ccf816040842054613796565b308352600185526040832055610ce6818354613796565b82556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843092a3610d1e878683612f70565b610d29868685612f70565b604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561032f578296610e53575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa918215610e475791610e14575b50610dbb90604095613609565b73ffffffffffffffffffffffffffffffffffffffff84519184835283602084015216907fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496853392a3600160095582519182526020820152f35b90506020813d602011610e3f575b81610e2f60209383612b6c565b810103126102e457516040610dae565b3d9150610e22565b604051903d90823e3d90fd5b9095506020813d602011610e80575b81610e6f60209383612b6c565b810103126102e45751946020610d69565b3d9150610e62565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152fd5b50841515610cae565b9094506020813d602011610f41575b81610f3160209383612b6c565b810103126102e457519338610c72565b3d9150610f24565b9092506020813d602011610f75575b81610f6560209383612b6c565b810103126102e457519138610c2d565b3d9150610f58565b50604051903d90823e3d90fd5b610fac915060203d602011610fb2575b610fa48183612b6c565b810190612ca9565b38610bae565b503d610f9a565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61100b612b26565b168152600483522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff811680820361114157620186a0906110a373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d8e565b116110e3577fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff67ffffffff000000006008549260201b1691161760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42726f776e466956323a204d4158494d554d5f4c414d424441000000000000006044820152fd5b8280fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff611197612b26565b168152600183522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576111e0612b26565b906111ef600160095414612c44565b806009556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561032f5790611271918391610f8a575015612cc1565b6112a46007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5090600554604051947f70a0823100000000000000000000000000000000000000000000000000000000865230600487015260208660248173ffffffffffffffffffffffffffffffffffffffff86165afa958615611694578596611660575b5060065491604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff85165afa938415611655578794611611575b506dffffffffffffffffffffffffffff60ff939495166dffffffffffffffffffffffffffff611391828b613796565b971661139d8188613796565b926113a6613111565b96909560a01c169160ff6113ba8b856138a8565b9260a01c16916113de886113d8896113d28a886138a8565b94612f39565b92612f39565b808210156116095750935b8b5493846115ba5750505050506113ff90612f16565b60401c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18810190811161158d579661143a6103e88254613949565b815580805260016020526114546103e86040832054613949565b81805260016020526040822055807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040516103e88152a35b8615611509576114c073ffffffffffffffffffffffffffffffffffffffff956020996114bb8a88613595565b613609565b604051958652878601526040850152606084015216907f265ee4cff6cdf714e68c02e61a7864cf66bc04e372a41b6cc425acbb737cd39560803392a36001600955604051908152f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b611603969c506115e96115e36115fd959697946115dd6115f7956115f0956138a8565b976138a8565b93612f16565b9488612f39565b9188612f39565b90613949565b916134ef565b9561148f565b9050936113e9565b9293506020833d60201161164d575b8161162d60209383612b6c565b810103126102e457915192916dffffffffffffffffffffffffffff611362565b3d9150611620565b6040513d89823e3d90fd5b9095506020813d60201161168c575b8161167c60209383612b6c565b810103126102e457519438611303565b3d915061166f565b6040513d87823e3d90fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116809103610a1f5761172173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d8e565b60085462030d4063ffffffff82161161175d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a204d4158494d554d5f4b0000000000000000000000006044820152fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576117f3612b26565b6117fb612b49565b9073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303611a1f5773ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff60055491837fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600555169060065492827fffffffffffffffffffffffff00000000000000000000000000000000000000008516176006556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa908115611a14577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009188916119f5575b5060a01b16921617176005556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa908115610679577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009186916119c6575b5060a01b169216171760065580f35b6119e8915060203d6020116119ee575b6119e08183612b6c565b810190612df3565b386119b7565b503d6119d6565b611a0e915060203d6020116119ee576119e08183612b6c565b38611935565b6040513d88823e3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a20464f5242494444454e0000000000000000000000006044820152fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600354604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051680100000000000000008152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405160128152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98152f35b503461033a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610a6890611bca612b26565b611bd2612b49565b906044359273ffffffffffffffffffffffffffffffffffffffff82169081815260026020526040812073ffffffffffffffffffffffffffffffffffffffff33166000526020527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205403611c4c575b5050613809565b808260409252600260205281812073ffffffffffffffffffffffffffffffffffffffff3316600052602052611c85868360002054613796565b92815260026020522073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020553880611c45565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff81168103610a1f57611d3973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d8e565b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff00000000000000006008549260401b1691161760085580f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760209054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60065460a01c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610a68611e82612b26565b6024359033613733565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760606dffffffffffffffffffffffffffff63ffffffff611f046007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b9193908160405195168552166020840152166040820152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610aea604051611f5e604082612b6c565b600a81527f42726f776e466920563200000000000000000000000000000000000000000000602082015260405191829182612bdc565b503461033a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576004359060243560443573ffffffffffffffffffffffffffffffffffffffff811691828203612b225760643567ffffffffffffffff8111612b1e5736602382011215612b1e5780600401359567ffffffffffffffff871161070f57366024888401011161070f57612039600160095414612c44565b8560095573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517fb187bd26000000000000000000000000000000000000000000000000000000008152602081600481855afa908115612b1357906120bc918991610f8a575015612cc1565b81159283158094612b0a575b15612a86576121006007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b509690916dffffffffffffffffffffffffffff61211c86612e45565b93169261212884612ef3565b101580612a5c575b156129d85773ffffffffffffffffffffffffffffffffffffffff600554169a73ffffffffffffffffffffffffffffffffffffffff60065416928c8b1415806129ce575b15612970578c87828a61295f575b505050888061294e575b50508061288c575b505060206024969798999a604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561284c578a96612857575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa90811561284c578a9161281a575b5061222f8483612d26565b861115612804576dffffffffffffffffffffffffffff6122586122528685612d26565b88612d26565b985b16956122668888612d26565b8211156127fd5761228061227a8989612d26565b83612d26565b935b8915801580916127f4575b15612771578a8d9561229d613111565b819b919b819d6008549463ffffffff8660201c1661274f575b505050509a818b8e9c9d839f6122f96122ea8f9763ffffffff9060401c169763ffffffff6122e38a612d62565b16906133ac565b9163ffffffff6122e389612d62565b91612688575b508d612529575b505060601c63ffffffff169182612375575b5050505050506123289250613609565b604051958652602086015260408501526060840152608083015260a08201527f72362f8601a26e309bef1da8d6795550a593bd38f121bedcaf24be6e4b7c6bee60c03392a3600160095580f35b8c8954946123d66dffffffffffffffffffffffffffff6115f7816123ce6123c56007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b50941687612f39565b921687612f39565b966124f1575b5050896124ad575b5050505050836123fa575b808a818b8f97612318565b6020600491604051928380927f017e7e580000000000000000000000000000000000000000000000000000000082525afa9081156124a2578c9161244d575b506123289361244791613595565b386123ef565b90506020813d60201161249a575b8161246860209383612b6c565b81010312612496575173ffffffffffffffffffffffffffffffffffffffff8116810361249657612328612439565b8b80fd5b3d915061245b565b6040513d8e823e3d90fd5b6124e69598506124e192916124d58263ffffffff6124cd6124db95612d62565b16908d6134ef565b92612d7b565b9061345a565b6134ef565b923880808b816123e4565b829a506124e187926124db61251a89948763ffffffff6125136125219a612d62565b16916134ef565b9188612d7b565b978c8f6123dc565b6dffffffffffffffffffffffffffff809396506126116125d484979d6125ce6115f7968f998f6125c16125ba6126199d6115f76125b3869d6125936125796125c89860ff60055460a01c166138a8565b9161258d60ff60065460a01c1696876138a8565b956138a8565b60085463ffffffff169b5097506125ad62030d4085612f39565b98612f39565b918d612f39565b958a612f39565b9180612f39565b906134ef565b90613796565b966126086007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b50961690612f39565b931690612f39565b1161262a578d958b8d928c38612306565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f494e56454e544f5259000000006044820152fd5b61272c939650936dffffffffffffffffffffffffffff6126116125d48e6115f7959f8f978f6125c86125c1889b612726859f6115f76126f28e926125ce9a506126ec6126dd60ff60055460a01c169a8b6138a8565b9660ff60065460a01c166138a8565b986138a8565b966113d863ffffffff60085416958c60001461274857829c5b1561273e57612720859d5b62030d4090612f39565b9a612f39565b96612f39565b1161262a578b8f97928c8f94386122ff565b6127208b9d612716565b809c61270b565b8d959f50612762949f9e509f9d9f61330d565b9c8d919b9d9c918193386122b6565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42726f776e466956323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152fd5b5085151561228d565b8a93612282565b6dffffffffffffffffffffffffffff8a9861225a565b90506020813d602011612844575b8161283560209383612b6c565b810103126102e4575138612224565b3d9150612828565b6040513d8c823e3d90fd5b9095506020813d602011612884575b8161287360209383612b6c565b810103126102e457519460206121de565b3d9150612866565b893b1561294a578760a4877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8f95806024604051998a9889977f6f9d78fc0000000000000000000000000000000000000000000000000000000089523360048a01528389015260448801526080606488015282608488015201868601378685828601015201168101030181838d5af1801561284c5761292e575b80612193565b89612940602498999a9b602093612b6c565b9998979650612928565b8a80fd5b6129589185612f70565b388861218b565b61296892612f70565b8c8782612181565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956323a20494e56414c49445f544f00000000000000000000006044820152fd5b50838b1415612173565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152fd5b50612a6687612e45565b612a7f6dffffffffffffffffffffffffffff8a16612ef3565b1015612130565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42726f776e466956323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152fd5b508415156120c8565b6040513d8a823e3d90fd5b8480fd5b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612bad57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b848110612c2e5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201612bef565b15612c4b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a204c4f434b45440000000000000000000000000000006044820152fd5b908160209103126102e4575180151581036102e45790565b15612cc857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a205041555345440000000000000000000000000000006044820152fd5b91908203918211612d3357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff16620186a0019063ffffffff8211612d3357565b81810292918115918404141715612d3357565b15612d9557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a204f4e4c595f464143544f52590000000000000000006044820152fd5b908160209103126102e4575160ff811681036102e45790565b8115612e16570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90600091600a8102818104600a1482151715612ec6579250600a830403612e6857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b906000916008810281810460081482151715612ec65780935060031c03612e6857565b906000916002810281810460021482151715612ec65780935060011c03612e6857565b600092918015918215612f50575b505015612e6857565b91509250612f68612f618483612d7b565b9384612e0c565b143880612f47565b600091908291826040956130157fffffffff00000000000000000000000000000000000000000000000000000000601960208a51612fae8c82612b6c565b8281527f7472616e7366657228616464726573732c75696e743235362900000000000000910190815220895191166020820190815273ffffffffffffffffffffffffffffffffffffffff959095166024820152604480820193909352918252606482612b6c565b51925af13d1561310a573d67ffffffffffffffff8111612bad57825190613064601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183612b6c565b81523d6000602083013e5b816130db575b501561307e5750565b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956323a205452414e534645525f4641494c45440000000000006044820152fd5b80518015925082156130f0575b505038613075565b6131039250602080918301019101612ca9565b38806130e8565b606061306f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f67cc3403000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561328e576000916132ce575b506005546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101829052602081604481875afa90811561328e5760009161329a575b506006546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101929092529260209082908180604481015b03915afa90811561328e5760009161325f575090565b90506020813d602011613286575b8161327a60209383612b6c565b810103126102e4575190565b3d915061326d565b6040513d6000823e3d90fd5b90506020813d6020116132c6575b816132b560209383612b6c565b810103126102e457516132496131ed565b3d91506132a8565b906020823d6020116132f8575b816132e860209383612b6c565b8101031261033a57505138613187565b3d91506132db565b91908201809211612d3357565b909193929361335661331f8284612d7b565b61334361332c8887612d7b565b8083106133a25761333d8184612d26565b92613300565b9063ffffffff60085460201c16906134ef565b9283620186a0019384620186a011612d3357620186a00392620186a08411612d3357111561339557613392929161338c9161345a565b9361345a565b90565b6133929261338c9161345a565b61333d8382612d26565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620186a0820991620186a082029182808510940393808503941461344d57838211156102e457620186a0829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50809250156102e4570490565b9190916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84820990848102928380841093039280840393146134e15782620186a0111561033a57507f58cd20afa2f05a708ede54b48d3ae685db76b3bb83cf2cf95d4e8fb00bcbe61d9394620186a0910990828211900360fb1b910360051c170290565b505050620186a09192500490565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828409928281029283808610950394808603951461358757848311156102e457829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156102e4570490565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000936135db868654613949565b85551693848452600182526135f4816040862054613949565b858552600183526040852055604051908152a3565b6dffffffffffffffffffffffffffff8111158061371b575b156136bd577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1916dffffffffffffffffffffffffffff806040931691827bffffffffffffffffffffffffffff00000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000004260e01b169260701b16171780600755835192835260701c166020820152a1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956323a204f564552464c4f57000000000000000000000000006044820152fd5b506dffffffffffffffffffffffffffff821115613621565b602073ffffffffffffffffffffffffffffffffffffffff807f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925931693846000526002835260406000208282166000528352856040600020556040519586521693a3565b91906137a29083612d26565b9182116137ab57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef931693846000526001835261385c86604060002054613796565b85600052600184526040600020551693846000526001825261388381604060002054613949565b8560005260018352604060002055604051908152a3565b604d8111612d3357600a0a90565b60009060ff1660128111156138f9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9150019060ff8211612d33576138f360ff613392931661389a565b90612e0c565b6012039060ff821161391c57509061391660ff613392931661389a565b90612d7b565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b91906139559083613300565b91821061395e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152fdfea26469706673582212208b44adcbabd63fa9497ef1b40131d84f535f5757d27110873c9ee80efb7839db64736f6c634300081c0033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c8063022c0d9f14611f9457806306fdde0314611f1d5780630902f1ac14611e8c578063095ea7b314611e475780630b77884d14611e055780630dfe168114611db357806318160ddd14611d785780631ab971ab14611cb857806323b872dd14611b8e57806330adf81f14611b35578063313ce56714611afb57806333fca18714611ab95780633644e51514611a7d578063485cc955146117bb5780635f0865491461169f5780636a627842146111a857806370a0823114611145578063762bff4a1461101c5780637ecebe0014610fb957806389afcb4414610aee57806395d89b4114610a73578063a9059cbb14610a23578063aa9f76281461095b578063aaf5eb681461091f578063b0e21e8a146108da578063b31ac6e214610898578063b4f40c6114610856578063ba9a7a561461081b578063bc25cf77146107d4578063c45a015514610765578063d21220a714610713578063d505accf14610441578063dad0be61146103fd578063dd62ed3e14610382578063ddca3f431461033d5763fff6cae9146101a957600080fd5b3461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576101e5600160095414612c44565b806009556024602073ffffffffffffffffffffffffffffffffffffffff60055416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561032f5782906102fc575b60249150602073ffffffffffffffffffffffffffffffffffffffff60065416604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156102f15783916102b6575b6102ae9250613609565b600160095580f35b90506020823d6020116102e9575b816102d160209383612b6c565b810103126102e4576102ae9151906102a4565b600080fd5b3d91506102c4565b6040513d85823e3d90fd5b506020813d602011610327575b8161031660209383612b6c565b810103126102e45760249051610245565b3d9150610309565b6040513d84823e3d90fd5b80fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60085460401c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5773ffffffffffffffffffffffffffffffffffffffff60406103d1612b26565b92826103db612b49565b9416815260026020522091166000526020526020604060002054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff600854821c16604051908152f35b503461033a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610479612b26565b610481612b49565b6044359060643560843560ff811680910361070f574282106106b15760035473ffffffffffffffffffffffffffffffffffffffff861692838852600460205260408820908154917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314610684579282602095928b95600160809601905560405190878201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845289604084015273ffffffffffffffffffffffffffffffffffffffff8b1660608401528b8784015260a083015260c082015260c0815261056a60e082612b6c565b51902060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526105b1606282612b6c565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156106795773ffffffffffffffffffffffffffffffffffffffff85511690811515918261066f575b5050156106115761060e92613733565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f5349474e4154555245000000006044820152fd5b14905038806105fe565b6040513d86823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956323a204558504952454400000000000000000000000000006044820152fd5b8580fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d168152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5761080c612b26565b506102ae600160095414612c44565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516103e88152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60085416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60055460a01c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60085460601c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051620186a08152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff81168103610a1f576109dc73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d163314612d8e565b7fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff6fffffffff0000000000000000000000006008549260601b1691161760085580f35b5080fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610a68610a5e612b26565b6024359033613809565b602060405160018152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610aea604051610ab4604082612b6c565b600581527f42462d5632000000000000000000000000000000000000000000000000000000602082015260405191829182612bdc565b0390f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b26612b26565b610b34600160095414612c44565b816009556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d165afa80156102f157610bb5918491610f8a575b5015612cc1565b73ffffffffffffffffffffffffffffffffffffffff600554169173ffffffffffffffffffffffffffffffffffffffff6006541691604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481885afa928315610f7d578193610f49575b50604051937f70a08231000000000000000000000000000000000000000000000000000000008552306004860152602085602481845afa94851561032f578295610f15575b503082526001602052610ca4610c98610c98610c9d60408620549786549384918a612f39565b612e0c565b9787612f39565b9385151580610f0c575b15610e88576024968360209230825260018452610ccf816040842054613796565b308352600185526040832055610ce6818354613796565b82556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843092a3610d1e878683612f70565b610d29868685612f70565b604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561032f578296610e53575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa918215610e475791610e14575b50610dbb90604095613609565b73ffffffffffffffffffffffffffffffffffffffff84519184835283602084015216907fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496853392a3600160095582519182526020820152f35b90506020813d602011610e3f575b81610e2f60209383612b6c565b810103126102e457516040610dae565b3d9150610e22565b604051903d90823e3d90fd5b9095506020813d602011610e80575b81610e6f60209383612b6c565b810103126102e45751946020610d69565b3d9150610e62565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152fd5b50841515610cae565b9094506020813d602011610f41575b81610f3160209383612b6c565b810103126102e457519338610c72565b3d9150610f24565b9092506020813d602011610f75575b81610f6560209383612b6c565b810103126102e457519138610c2d565b3d9150610f58565b50604051903d90823e3d90fd5b610fac915060203d602011610fb2575b610fa48183612b6c565b810190612ca9565b38610bae565b503d610f9a565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61100b612b26565b168152600483522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff811680820361114157620186a0906110a373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d163314612d8e565b116110e3577fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff67ffffffff000000006008549260201b1691161760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42726f776e466956323a204d4158494d554d5f4c414d424441000000000000006044820152fd5b8280fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff611197612b26565b168152600183522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576111e0612b26565b906111ef600160095414612c44565b806009556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d165afa90811561032f5790611271918391610f8a575015612cc1565b6112a46007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5090600554604051947f70a0823100000000000000000000000000000000000000000000000000000000865230600487015260208660248173ffffffffffffffffffffffffffffffffffffffff86165afa958615611694578596611660575b5060065491604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff85165afa938415611655578794611611575b506dffffffffffffffffffffffffffff60ff939495166dffffffffffffffffffffffffffff611391828b613796565b971661139d8188613796565b926113a6613111565b96909560a01c169160ff6113ba8b856138a8565b9260a01c16916113de886113d8896113d28a886138a8565b94612f39565b92612f39565b808210156116095750935b8b5493846115ba5750505050506113ff90612f16565b60401c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18810190811161158d579661143a6103e88254613949565b815580805260016020526114546103e86040832054613949565b81805260016020526040822055807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040516103e88152a35b8615611509576114c073ffffffffffffffffffffffffffffffffffffffff956020996114bb8a88613595565b613609565b604051958652878601526040850152606084015216907f265ee4cff6cdf714e68c02e61a7864cf66bc04e372a41b6cc425acbb737cd39560803392a36001600955604051908152f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b611603969c506115e96115e36115fd959697946115dd6115f7956115f0956138a8565b976138a8565b93612f16565b9488612f39565b9188612f39565b90613949565b916134ef565b9561148f565b9050936113e9565b9293506020833d60201161164d575b8161162d60209383612b6c565b810103126102e457915192916dffffffffffffffffffffffffffff611362565b3d9150611620565b6040513d89823e3d90fd5b9095506020813d60201161168c575b8161167c60209383612b6c565b810103126102e457519438611303565b3d915061166f565b6040513d87823e3d90fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116809103610a1f5761172173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d163314612d8e565b60085462030d4063ffffffff82161161175d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a204d4158494d554d5f4b0000000000000000000000006044820152fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576117f3612b26565b6117fb612b49565b9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d163303611a1f5773ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff60055491837fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600555169060065492827fffffffffffffffffffffffff00000000000000000000000000000000000000008516176006556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa908115611a14577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009188916119f5575b5060a01b16921617176005556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa908115610679577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009186916119c6575b5060a01b169216171760065580f35b6119e8915060203d6020116119ee575b6119e08183612b6c565b810190612df3565b386119b7565b503d6119d6565b611a0e915060203d6020116119ee576119e08183612b6c565b38611935565b6040513d88823e3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a20464f5242494444454e0000000000000000000000006044820152fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600354604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051680100000000000000008152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405160128152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98152f35b503461033a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610a6890611bca612b26565b611bd2612b49565b906044359273ffffffffffffffffffffffffffffffffffffffff82169081815260026020526040812073ffffffffffffffffffffffffffffffffffffffff33166000526020527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205403611c4c575b5050613809565b808260409252600260205281812073ffffffffffffffffffffffffffffffffffffffff3316600052602052611c85868360002054613796565b92815260026020522073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020553880611c45565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff81168103610a1f57611d3973ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d163314612d8e565b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff00000000000000006008549260401b1691161760085580f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760209054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60065460a01c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610a68611e82612b26565b6024359033613733565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760606dffffffffffffffffffffffffffff63ffffffff611f046007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b9193908160405195168552166020840152166040820152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610aea604051611f5e604082612b6c565b600a81527f42726f776e466920563200000000000000000000000000000000000000000000602082015260405191829182612bdc565b503461033a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576004359060243560443573ffffffffffffffffffffffffffffffffffffffff811691828203612b225760643567ffffffffffffffff8111612b1e5736602382011215612b1e5780600401359567ffffffffffffffff871161070f57366024888401011161070f57612039600160095414612c44565b8560095573ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d166040517fb187bd26000000000000000000000000000000000000000000000000000000008152602081600481855afa908115612b1357906120bc918991610f8a575015612cc1565b81159283158094612b0a575b15612a86576121006007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b509690916dffffffffffffffffffffffffffff61211c86612e45565b93169261212884612ef3565b101580612a5c575b156129d85773ffffffffffffffffffffffffffffffffffffffff600554169a73ffffffffffffffffffffffffffffffffffffffff60065416928c8b1415806129ce575b15612970578c87828a61295f575b505050888061294e575b50508061288c575b505060206024969798999a604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561284c578a96612857575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa90811561284c578a9161281a575b5061222f8483612d26565b861115612804576dffffffffffffffffffffffffffff6122586122528685612d26565b88612d26565b985b16956122668888612d26565b8211156127fd5761228061227a8989612d26565b83612d26565b935b8915801580916127f4575b15612771578a8d9561229d613111565b819b919b819d6008549463ffffffff8660201c1661274f575b505050509a818b8e9c9d839f6122f96122ea8f9763ffffffff9060401c169763ffffffff6122e38a612d62565b16906133ac565b9163ffffffff6122e389612d62565b91612688575b508d612529575b505060601c63ffffffff169182612375575b5050505050506123289250613609565b604051958652602086015260408501526060840152608083015260a08201527f72362f8601a26e309bef1da8d6795550a593bd38f121bedcaf24be6e4b7c6bee60c03392a3600160095580f35b8c8954946123d66dffffffffffffffffffffffffffff6115f7816123ce6123c56007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b50941687612f39565b921687612f39565b966124f1575b5050896124ad575b5050505050836123fa575b808a818b8f97612318565b6020600491604051928380927f017e7e580000000000000000000000000000000000000000000000000000000082525afa9081156124a2578c9161244d575b506123289361244791613595565b386123ef565b90506020813d60201161249a575b8161246860209383612b6c565b81010312612496575173ffffffffffffffffffffffffffffffffffffffff8116810361249657612328612439565b8b80fd5b3d915061245b565b6040513d8e823e3d90fd5b6124e69598506124e192916124d58263ffffffff6124cd6124db95612d62565b16908d6134ef565b92612d7b565b9061345a565b6134ef565b923880808b816123e4565b829a506124e187926124db61251a89948763ffffffff6125136125219a612d62565b16916134ef565b9188612d7b565b978c8f6123dc565b6dffffffffffffffffffffffffffff809396506126116125d484979d6125ce6115f7968f998f6125c16125ba6126199d6115f76125b3869d6125936125796125c89860ff60055460a01c166138a8565b9161258d60ff60065460a01c1696876138a8565b956138a8565b60085463ffffffff169b5097506125ad62030d4085612f39565b98612f39565b918d612f39565b958a612f39565b9180612f39565b906134ef565b90613796565b966126086007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b50961690612f39565b931690612f39565b1161262a578d958b8d928c38612306565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f494e56454e544f5259000000006044820152fd5b61272c939650936dffffffffffffffffffffffffffff6126116125d48e6115f7959f8f978f6125c86125c1889b612726859f6115f76126f28e926125ce9a506126ec6126dd60ff60055460a01c169a8b6138a8565b9660ff60065460a01c166138a8565b986138a8565b966113d863ffffffff60085416958c60001461274857829c5b1561273e57612720859d5b62030d4090612f39565b9a612f39565b96612f39565b1161262a578b8f97928c8f94386122ff565b6127208b9d612716565b809c61270b565b8d959f50612762949f9e509f9d9f61330d565b9c8d919b9d9c918193386122b6565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42726f776e466956323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152fd5b5085151561228d565b8a93612282565b6dffffffffffffffffffffffffffff8a9861225a565b90506020813d602011612844575b8161283560209383612b6c565b810103126102e4575138612224565b3d9150612828565b6040513d8c823e3d90fd5b9095506020813d602011612884575b8161287360209383612b6c565b810103126102e457519460206121de565b3d9150612866565b893b1561294a578760a4877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8f95806024604051998a9889977f6f9d78fc0000000000000000000000000000000000000000000000000000000089523360048a01528389015260448801526080606488015282608488015201868601378685828601015201168101030181838d5af1801561284c5761292e575b80612193565b89612940602498999a9b602093612b6c565b9998979650612928565b8a80fd5b6129589185612f70565b388861218b565b61296892612f70565b8c8782612181565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956323a20494e56414c49445f544f00000000000000000000006044820152fd5b50838b1415612173565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152fd5b50612a6687612e45565b612a7f6dffffffffffffffffffffffffffff8a16612ef3565b1015612130565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42726f776e466956323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152fd5b508415156120c8565b6040513d8a823e3d90fd5b8480fd5b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612bad57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b848110612c2e5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201612bef565b15612c4b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a204c4f434b45440000000000000000000000000000006044820152fd5b908160209103126102e4575180151581036102e45790565b15612cc857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a205041555345440000000000000000000000000000006044820152fd5b91908203918211612d3357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff16620186a0019063ffffffff8211612d3357565b81810292918115918404141715612d3357565b15612d9557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a204f4e4c595f464143544f52590000000000000000006044820152fd5b908160209103126102e4575160ff811681036102e45790565b8115612e16570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90600091600a8102818104600a1482151715612ec6579250600a830403612e6857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b906000916008810281810460081482151715612ec65780935060031c03612e6857565b906000916002810281810460021482151715612ec65780935060011c03612e6857565b600092918015918215612f50575b505015612e6857565b91509250612f68612f618483612d7b565b9384612e0c565b143880612f47565b600091908291826040956130157fffffffff00000000000000000000000000000000000000000000000000000000601960208a51612fae8c82612b6c565b8281527f7472616e7366657228616464726573732c75696e743235362900000000000000910190815220895191166020820190815273ffffffffffffffffffffffffffffffffffffffff959095166024820152604480820193909352918252606482612b6c565b51925af13d1561310a573d67ffffffffffffffff8111612bad57825190613064601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183612b6c565b81523d6000602083013e5b816130db575b501561307e5750565b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956323a205452414e534645525f4641494c45440000000000006044820152fd5b80518015925082156130f0575b505038613075565b6131039250602080918301019101612ca9565b38806130e8565b606061306f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043ab776770cc5c739addf318af712dd40918c42d16906040517f67cc3403000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561328e576000916132ce575b506005546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101829052602081604481875afa90811561328e5760009161329a575b506006546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101929092529260209082908180604481015b03915afa90811561328e5760009161325f575090565b90506020813d602011613286575b8161327a60209383612b6c565b810103126102e4575190565b3d915061326d565b6040513d6000823e3d90fd5b90506020813d6020116132c6575b816132b560209383612b6c565b810103126102e457516132496131ed565b3d91506132a8565b906020823d6020116132f8575b816132e860209383612b6c565b8101031261033a57505138613187565b3d91506132db565b91908201809211612d3357565b909193929361335661331f8284612d7b565b61334361332c8887612d7b565b8083106133a25761333d8184612d26565b92613300565b9063ffffffff60085460201c16906134ef565b9283620186a0019384620186a011612d3357620186a00392620186a08411612d3357111561339557613392929161338c9161345a565b9361345a565b90565b6133929261338c9161345a565b61333d8382612d26565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620186a0820991620186a082029182808510940393808503941461344d57838211156102e457620186a0829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50809250156102e4570490565b9190916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84820990848102928380841093039280840393146134e15782620186a0111561033a57507f58cd20afa2f05a708ede54b48d3ae685db76b3bb83cf2cf95d4e8fb00bcbe61d9394620186a0910990828211900360fb1b910360051c170290565b505050620186a09192500490565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828409928281029283808610950394808603951461358757848311156102e457829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156102e4570490565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000936135db868654613949565b85551693848452600182526135f4816040862054613949565b858552600183526040852055604051908152a3565b6dffffffffffffffffffffffffffff8111158061371b575b156136bd577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1916dffffffffffffffffffffffffffff806040931691827bffffffffffffffffffffffffffff00000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000004260e01b169260701b16171780600755835192835260701c166020820152a1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956323a204f564552464c4f57000000000000000000000000006044820152fd5b506dffffffffffffffffffffffffffff821115613621565b602073ffffffffffffffffffffffffffffffffffffffff807f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925931693846000526002835260406000208282166000528352856040600020556040519586521693a3565b91906137a29083612d26565b9182116137ab57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef931693846000526001835261385c86604060002054613796565b85600052600184526040600020551693846000526001825261388381604060002054613949565b8560005260018352604060002055604051908152a3565b604d8111612d3357600a0a90565b60009060ff1660128111156138f9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9150019060ff8211612d33576138f360ff613392931661389a565b90612e0c565b6012039060ff821161391c57509061391660ff613392931661389a565b90612d7b565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b91906139559083613300565b91821061395e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152fdfea26469706673582212208b44adcbabd63fa9497ef1b40131d84f535f5757d27110873c9ee80efb7839db64736f6c634300081c0033
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.