Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,145,707.953532504030570333 $OPHX
Holders
87
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
13,152.907083627816075409 $OPHXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BridgeTokenDest
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-15 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.20; /** * @title IGovernable Interface * @notice This is an interface used by the AxelarGateway contract to manage governance and mint limiter roles. */ interface IGovernable { error NotGovernance(); error NotMintLimiter(); error InvalidGovernance(); error InvalidMintLimiter(); event GovernanceTransferred(address indexed previousGovernance, address indexed newGovernance); event MintLimiterTransferred(address indexed previousGovernance, address indexed newGovernance); /** * @notice Returns the governance address. * @return address of the governance */ function governance() external view returns (address); /** * @notice Returns the mint limiter address. * @return address of the mint limiter */ function mintLimiter() external view returns (address); /** * @notice Transfer the governance role to another address. * @param newGovernance The new governance address */ function transferGovernance(address newGovernance) external; /** * @notice Transfer the mint limiter role to another address. * @param newGovernance The new mint limiter address */ function transferMintLimiter(address newGovernance) external; } // General interface for upgradable contracts interface IContractIdentifier { /** * @notice Returns the contract ID. It can be used as a check during upgrades. * @dev Meant to be overridden in derived contracts. * @return bytes32 The contract ID */ function contractId() external pure returns (bytes32); } interface IImplementation is IContractIdentifier { error NotProxy(); function setup(bytes calldata data) external; } /** * @title IOwnable Interface * @notice IOwnable is an interface that abstracts the implementation of a * contract with ownership control features. It's commonly used in upgradable * contracts and includes the functionality to get current owner, transfer * ownership, and propose and accept ownership. */ interface IOwnable { error NotOwner(); error InvalidOwner(); error InvalidOwnerAddress(); event OwnershipTransferStarted(address indexed newOwner); event OwnershipTransferred(address indexed newOwner); /** * @notice Returns the current owner of the contract. * @return address The address of the current owner */ function owner() external view returns (address); /** * @notice Returns the address of the pending owner of the contract. * @return address The address of the pending owner */ function pendingOwner() external view returns (address); /** * @notice Transfers ownership of the contract to a new address * @param newOwner The address to transfer ownership to */ function transferOwnership(address newOwner) external; /** * @notice Proposes to transfer the contract's ownership to a new address. * The new owner needs to accept the ownership explicitly. * @param newOwner The address to transfer ownership to */ function proposeOwnership(address newOwner) external; /** * @notice Transfers ownership to the pending owner. * @dev Can only be called by the pending owner */ function acceptOwnership() external; } // General interface for upgradable contracts interface IUpgradable is IOwnable, IImplementation { error InvalidCodeHash(); error InvalidImplementation(); error SetupFailed(); event Upgraded(address indexed newImplementation); function implementation() external view returns (address); function upgrade( address newImplementation, bytes32 newImplementationCodeHash, bytes calldata params ) external; } /** * @title IAxelarGasService Interface * @notice This is an interface for the AxelarGasService contract which manages gas payments * and refunds for cross-chain communication on the Axelar network. * @dev This interface inherits IUpgradable */ interface IAxelarGasService is IUpgradable { error NothingReceived(); error InvalidAddress(); error NotCollector(); error InvalidAmounts(); event GasPaidForContractCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, address gasToken, uint256 gasFeeAmount, address refundAddress ); event GasPaidForContractCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForContractCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForContractCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, uint256 gasFeeAmount, address refundAddress ); event GasPaidForExpressCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, address gasToken, uint256 gasFeeAmount, address refundAddress ); event GasPaidForExpressCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForExpressCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForExpressCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, uint256 gasFeeAmount, address refundAddress ); event GasAdded( bytes32 indexed txHash, uint256 indexed logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ); event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress); event ExpressGasAdded( bytes32 indexed txHash, uint256 indexed logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ); event NativeExpressGasAdded( bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress ); event Refunded( bytes32 indexed txHash, uint256 indexed logIndex, address payable receiver, address token, uint256 amount ); /** * @notice Pay for gas using ERC20 tokens for a contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForContractCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using ERC20 tokens for a contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForContractCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using native currency for a contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForContractCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address refundAddress ) external payable; /** * @notice Pay for gas using native currency for a contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForContractCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address refundAddress ) external payable; /** * @notice Pay for gas using ERC20 tokens for an express contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForExpressCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using ERC20 tokens for an express contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForExpressCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using native currency for an express contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForExpressCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address refundAddress ) external payable; /** * @notice Pay for gas using native currency for an express contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForExpressCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address refundAddress ) external payable; /** * @notice Add additional gas payment using ERC20 tokens after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param gasToken The ERC20 token address used to add gas * @param gasFeeAmount The amount of tokens to add as gas * @param refundAddress The address where refunds, if any, should be sent */ function addGas( bytes32 txHash, uint256 logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Add additional gas payment using native currency after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable; /** * @notice Add additional gas payment using ERC20 tokens after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param gasToken The ERC20 token address used to add gas * @param gasFeeAmount The amount of tokens to add as gas * @param refundAddress The address where refunds, if any, should be sent */ function addExpressGas( bytes32 txHash, uint256 logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Add additional gas payment using native currency after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeExpressGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable; /** * @notice Allows the gasCollector to collect accumulated fees from the contract. * @dev Use address(0) as the token address for native currency. * @param receiver The address to receive the collected fees * @param tokens Array of token addresses to be collected * @param amounts Array of amounts to be collected for each respective token address */ function collectFees( address payable receiver, address[] calldata tokens, uint256[] calldata amounts ) external; /** * @notice Refunds gas payment to the receiver in relation to a specific cross-chain transaction. * @dev Only callable by the gasCollector. * @dev Use address(0) as the token address to refund native currency. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param receiver The address to receive the refund * @param token The token address to be refunded * @param amount The amount to refund */ function refund( bytes32 txHash, uint256 logIndex, address payable receiver, address token, uint256 amount ) external; /** * @notice Returns the address of the designated gas collector. * @return address of the gas collector */ function gasCollector() external returns (address); } interface IAxelarExecutable { error InvalidAddress(); error NotApprovedByGateway(); function gateway() external view returns (IAxelarGateway); function execute( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes calldata payload ) external; function executeWithToken( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes calldata payload, string calldata tokenSymbol, uint256 amount ) external; } interface IAxelarGateway is IImplementation, IGovernable { /**********\ |* Errors *| \**********/ error NotSelf(); error InvalidCodeHash(); error SetupFailed(); error InvalidAuthModule(); error InvalidTokenDeployer(); error InvalidAmount(); error InvalidChainId(); error InvalidCommands(); error TokenDoesNotExist(string symbol); error TokenAlreadyExists(string symbol); error TokenDeployFailed(string symbol); error TokenContractDoesNotExist(address token); error BurnFailed(string symbol); error MintFailed(string symbol); error InvalidSetMintLimitsParams(); error ExceedMintLimit(string symbol); /**********\ |* Events *| \**********/ event TokenSent( address indexed sender, string destinationChain, string destinationAddress, string symbol, uint256 amount ); event ContractCall( address indexed sender, string destinationChain, string destinationContractAddress, bytes32 indexed payloadHash, bytes payload ); event ContractCallWithToken( address indexed sender, string destinationChain, string destinationContractAddress, bytes32 indexed payloadHash, bytes payload, string symbol, uint256 amount ); event Executed(bytes32 indexed commandId); event TokenDeployed(string symbol, address tokenAddresses); event ContractCallApproved( bytes32 indexed commandId, string sourceChain, string sourceAddress, address indexed contractAddress, bytes32 indexed payloadHash, bytes32 sourceTxHash, uint256 sourceEventIndex ); event ContractCallApprovedWithMint( bytes32 indexed commandId, string sourceChain, string sourceAddress, address indexed contractAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, bytes32 sourceTxHash, uint256 sourceEventIndex ); event ContractCallExecuted(bytes32 indexed commandId); event TokenMintLimitUpdated(string symbol, uint256 limit); event OperatorshipTransferred(bytes newOperatorsData); event Upgraded(address indexed implementation); /********************\ |* Public Functions *| \********************/ function sendToken( string calldata destinationChain, string calldata destinationAddress, string calldata symbol, uint256 amount ) external; function callContract( string calldata destinationChain, string calldata contractAddress, bytes calldata payload ) external; function callContractWithToken( string calldata destinationChain, string calldata contractAddress, bytes calldata payload, string calldata symbol, uint256 amount ) external; function isContractCallApproved( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, address contractAddress, bytes32 payloadHash ) external view returns (bool); function isContractCallAndMintApproved( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, address contractAddress, bytes32 payloadHash, string calldata symbol, uint256 amount ) external view returns (bool); function validateContractCall( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes32 payloadHash ) external returns (bool); function validateContractCallAndMint( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes32 payloadHash, string calldata symbol, uint256 amount ) external returns (bool); /***********\ |* Getters *| \***********/ function authModule() external view returns (address); function tokenDeployer() external view returns (address); function tokenMintLimit(string memory symbol) external view returns (uint256); function tokenMintAmount(string memory symbol) external view returns (uint256); function allTokensFrozen() external view returns (bool); function implementation() external view returns (address); function tokenAddresses(string memory symbol) external view returns (address); function tokenFrozen(string memory symbol) external view returns (bool); function isCommandExecuted(bytes32 commandId) external view returns (bool); /************************\ |* Governance Functions *| \************************/ function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external; function upgrade( address newImplementation, bytes32 newImplementationCodeHash, bytes calldata setupParams ) external; /**********************\ |* External Functions *| \**********************/ function execute(bytes calldata input) external; } contract AxelarExecutable is IAxelarExecutable { IAxelarGateway public immutable gateway; constructor(address gateway_) { if (gateway_ == address(0)) revert InvalidAddress(); gateway = IAxelarGateway(gateway_); } function execute( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes calldata payload ) external { bytes32 payloadHash = keccak256(payload); if (!gateway.validateContractCall(commandId, sourceChain, sourceAddress, payloadHash)) revert NotApprovedByGateway(); _execute(sourceChain, sourceAddress, payload); } function executeWithToken( bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes calldata payload, string calldata tokenSymbol, uint256 amount ) external { bytes32 payloadHash = keccak256(payload); if ( !gateway.validateContractCallAndMint( commandId, sourceChain, sourceAddress, payloadHash, tokenSymbol, amount ) ) revert NotApprovedByGateway(); _executeWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount); } function _execute( string calldata sourceChain, string calldata sourceAddress, bytes calldata payload ) internal virtual {} function _executeWithToken( string calldata sourceChain, string calldata sourceAddress, bytes calldata payload, string calldata tokenSymbol, uint256 amount ) internal virtual {} } /** * @title Owner * @dev Set & change owner */ contract Ownable { address private owner; // event for EVM logging event OwnerSet(address indexed oldOwner, address indexed newOwner); // modifier to check if caller is owner modifier onlyOwner() { // If the first argument of 'require' evaluates to 'false', execution terminates and all // changes to the state and to Ether balances are reverted. // This used to consume all gas in old EVM versions, but not anymore. // It is often a good idea to use 'require' to check if functions are called correctly. // As a second argument, you can also provide an explanation about what went wrong. require(msg.sender == owner, "Caller is not owner"); _; } /** * @dev Set contract deployer as owner */ constructor() { owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor emit OwnerSet(address(0), owner); } /** * @dev Change owner * @param newOwner address of new owner */ function changeOwner(address newOwner) public onlyOwner { emit OwnerSet(owner, newOwner); owner = newOwner; } /** * @dev Return owner address * @return address of owner */ function getOwner() external view returns (address) { return owner; } } interface IERC20 { function totalSupply() external view returns (uint256); function symbol() external view returns(string memory); function name() external view returns(string memory); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Returns the number of decimal places */ function decimals() external view returns (uint8); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } } /** The Bridge Token Source Contract holds the tokens While the wrapped version of these tokens exist on other chains The BridgeTokenDest contract should tell the BridgeTokenSrc contract to release tokens to an address And the BridgeTokenDest contract should ensure that it follows the appropriate rules This contract should only receive messages from the source chain and source address of the token wrapper */ contract BridgeTokenDest is AxelarExecutable, Ownable, IERC20 { // total supply uint256 private _totalSupply; // token data string private _name; string private _symbol; uint8 private immutable _decimals; // balances and allowances mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; /** Axelar Gas Service Contract */ IAxelarGasService public immutable gasService; /** Source Chain for BridgeTokenSource */ string public sourceChain; /** Source Address for BridgeTokenSource */ string public sourceAddress; /** Min Gas Required */ uint256 public minGas; /** Gas Fee For Platform */ uint256 public platformFee; /** Fee Recipient */ address public upchargeFeeReceiver; // permissions struct Permissions { bool isFeeExempt; bool isLiquidityPool; } mapping ( address => Permissions ) public permissions; // Fees uint256 public buyFee = 1000; uint256 public sellFee = 1000; uint256 public transferFee = 0; uint256 public constant FEE_DENOMINATOR = 10_000; // Fee Recipient address public feeRecipient; bool public autoTrigger; // Bridging Blocked bool public bridgingBlocked; // Max totals uint256 public MAX_TOTAL_SUPPLY = 95_000_000 * 10**18; constructor( /** Axelar */ address gateway_, address gasService_, /** Wrapped Token Info */ string memory name_, string memory symbol_, uint8 decimals_, /** Platform */ uint256 minGas_, uint256 platformFee_, address upchargeFeeReceiver_, /** Source Bridge */ string memory sourceChain_, string memory sourceAddress_ ) AxelarExecutable(gateway_) { // set token info _name = name_; _symbol = symbol_; _decimals = decimals_; // set gas service info gasService = IAxelarGasService(gasService_); // set bridge info minGas = minGas_; platformFee = platformFee_; upchargeFeeReceiver = upchargeFeeReceiver_; // set chain and address sourceChain = sourceChain_; sourceAddress = sourceAddress_; // emit event emit Transfer(address(0), msg.sender, 0); } function withdrawForeignToken(address token_, address to, uint256 amount) external onlyOwner { TransferHelper.safeTransfer(token_, to, amount); } function withdrawETH(address to, uint256 amount) external onlyOwner { TransferHelper.safeTransferETH(to, amount); } function setMinGas(uint256 minGas_) external onlyOwner { minGas = minGas_; } function setPlatformFee(uint256 platformFee_) external onlyOwner { platformFee = platformFee_; } function setUpchargeFeeReceiver(address upchargeFeeReceiver_) external onlyOwner { upchargeFeeReceiver = upchargeFeeReceiver_; } function setFeeExempt(address account, bool isFeeExempt) external onlyOwner { permissions[account].isFeeExempt = isFeeExempt; } function setLiquidityPool(address account, bool isLiquidityPool) external onlyOwner { permissions[account].isLiquidityPool = isLiquidityPool; } function setFeeRecipient(address feeRecipient_) external onlyOwner { feeRecipient = feeRecipient_; } function setBuyFee(uint256 buyFee_) external onlyOwner { buyFee = buyFee_; } function setSellFee(uint256 sellFee_) external onlyOwner { sellFee = sellFee_; } function setTransferFee(uint256 transferFee_) external onlyOwner { transferFee = transferFee_; } function setAutoTrigger(bool autoTrigger_) external onlyOwner { autoTrigger = autoTrigger_; } function setBridgingBlocked(bool bridgingBlocked_) external onlyOwner { bridgingBlocked = bridgingBlocked_; } function setMaxTotalSupply(uint256 maxTotalSupply_) external onlyOwner { MAX_TOTAL_SUPPLY = maxTotalSupply_; } function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function name() external view override returns(string memory) { return _name; } function symbol() external view override returns(string memory) { return _symbol; } function decimals() external view override returns (uint8) { return _decimals; } function approve(address spender, uint256 amount) public override returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } /** Transfer Function */ function transfer(address recipient, uint256 amount) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } /** Transfer Function */ function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { require( _allowances[sender][msg.sender] >= amount, 'Insufficient Allowance' ); _allowances[sender][msg.sender] -= amount; return _transferFrom(sender, recipient, amount); } /** Used To Burn Tokens On This Chain, and Unlock them on the destination chain */ function bridgeBack( address to, uint256 amount ) external payable { require( amount > 0, 'Zero Amount' ); require( to != address(0), 'Zero Recipient' ); require( msg.value >= ( minGas + platformFee ), 'Min Gas' ); require( _balances[msg.sender] >= amount, 'Insufficient Balance' ); require( bridgingBlocked == false, 'Bridging Blocked' ); // send platform fee to owner if (platformFee > 0) { TransferHelper.safeTransferETH(upchargeFeeReceiver, platformFee); } // subtract platform fee from value uint256 gasForCall = msg.value - platformFee; // burn internal tokens _burn(msg.sender, amount); // create payload using the amount burned bytes memory payload = abi.encode(to, amount); // pass payload into gasService, paying the gas // NOTE: take fee out of gas sent gasService.payNativeGasForContractCall{value: gasForCall} ( address(this), sourceChain, sourceAddress, payload, msg.sender ); // Call Contract On The Gateway gateway.callContract(sourceChain, sourceAddress, payload); } /** * @notice Add additional gas payment using native currency after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable { gasService.addNativeGas{value: msg.value}(txHash, logIndex, refundAddress); } /** * @notice Add additional gas payment using native currency after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeExpressGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable { gasService.addNativeExpressGas{value: msg.value}(txHash, logIndex, refundAddress); } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { require( sender != address(0), 'Zero Sender' ); require( recipient != address(0), 'Zero Recipient' ); require( amount > 0, 'Zero Amount' ); require( _balances[sender] >= amount, 'Insufficient Balance' ); // decrement sender balance _balances[sender] -= amount; // fee for transaction (uint256 fee) = getTax(sender, recipient, amount); // give amount to recipient less fee uint256 sendAmount = amount - fee; require(sendAmount > 0, 'Zero Amount'); // allocate balance unchecked { _balances[recipient] += sendAmount; } emit Transfer(sender, recipient, sendAmount); // allocate fee if any if (fee > 0) { // if recipient field is valid bool isValidRecipient = feeRecipient != address(0) && feeRecipient != address(this); // allocate amount to recipient address feeRecipient_ = isValidRecipient ? feeRecipient : address(this); // allocate fee unchecked { _balances[feeRecipient_] += fee; } emit Transfer(sender, feeRecipient_, fee); // if valid and trigger is enabled, trigger tokenomics mid transfer if (autoTrigger && isValidRecipient) { (bool success,) = feeRecipient_.call( abi.encodeWithSelector(bytes4(keccak256(bytes('trigger()')))) ); success; } } // emit Transfer Event return true; } function getTax(address sender, address recipient, uint256 amount) public view returns (uint256) { if ( permissions[sender].isFeeExempt || permissions[recipient].isFeeExempt ) { return 0; } return permissions[recipient].isLiquidityPool ? (amount * sellFee) / FEE_DENOMINATOR : permissions[sender].isLiquidityPool ? (amount * buyFee) / FEE_DENOMINATOR : (amount * transferFee) / FEE_DENOMINATOR; } function _burn(address account, uint256 amount) internal { require( account != address(0), 'Zero Address' ); require( amount > 0, 'Zero Amount' ); require( amount <= _balances[account], 'Insufficient Balance' ); _balances[account] -= amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } function _mint(address account, uint256 amount) internal { require( account != address(0), 'Zero Address' ); require( amount > 0, 'Zero Amount' ); unchecked { _balances[account] += amount; _totalSupply += amount; } require( _totalSupply <= MAX_TOTAL_SUPPLY, 'Exceeds Max Total Supply' ); emit Transfer(address(0), account, amount); } function _execute( string calldata sourceChain_, string calldata sourceAddress_, bytes calldata payload_ ) internal override { require( keccak256(bytes(sourceChain_)) == keccak256(bytes(sourceChain)), 'Invalid Source Chain' ); require( keccak256(bytes(sourceAddress_)) == keccak256(bytes(sourceAddress)), 'Invalid Source Address' ); require( bridgingBlocked == false, 'Bridging Blocked' ); // decode recipient and amount from payload (address to, uint256 amount) = abi.decode(payload_, (address, uint256)); // mint tokens for user _mint(to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"gateway_","type":"address"},{"internalType":"address","name":"gasService_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"minGas_","type":"uint256"},{"internalType":"uint256","name":"platformFee_","type":"uint256"},{"internalType":"address","name":"upchargeFeeReceiver_","type":"address"},{"internalType":"string","name":"sourceChain_","type":"string"},{"internalType":"string","name":"sourceAddress_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotApprovedByGateway","type":"error"},{"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":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","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":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"addNativeExpressGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"addNativeGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridgeBack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bridgingBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"executeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasService","outputs":[{"internalType":"contract IAxelarGasService","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gateway","outputs":[{"internalType":"contract IAxelarGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permissions","outputs":[{"internalType":"bool","name":"isFeeExempt","type":"bool"},{"internalType":"bool","name":"isLiquidityPool","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"autoTrigger_","type":"bool"}],"name":"setAutoTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bridgingBlocked_","type":"bool"}],"name":"setBridgingBlocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee_","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isFeeExempt","type":"bool"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feeRecipient_","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isLiquidityPool","type":"bool"}],"name":"setLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTotalSupply_","type":"uint256"}],"name":"setMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minGas_","type":"uint256"}],"name":"setMinGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"platformFee_","type":"uint256"}],"name":"setPlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellFee_","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transferFee_","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"upchargeFeeReceiver_","type":"address"}],"name":"setUpchargeFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sourceAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sourceChain","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upchargeFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040526103e8600c556103e8600d555f600e556a4e950851be0c2ebf0000006010553480156200002f575f80fd5b50604051620029d9380380620029d9833981016040819052620000529162000268565b896001600160a01b0381166200007b5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03166080525f80546001600160a01b0319163390811782556040519091907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a36002620000d3898262000404565b506003620000e2888262000404565b5060ff861660a0526001600160a01b0389811660c05260088690556009859055600a80546001600160a01b031916918516919091179055600662000127838262000404565b50600762000136828262000404565b506040515f80825233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050505050505050620004cc565b80516001600160a01b038116811462000194575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001bd575f80fd5b81516001600160401b0380821115620001da57620001da62000199565b604051601f8301601f19908116603f0116810190828211818310171562000205576200020562000199565b8160405283815260209250868385880101111562000221575f80fd5b5f91505b8382101562000244578582018301518183018401529082019062000225565b5f93810190920192909252949350505050565b805160ff8116811462000194575f80fd5b5f805f805f805f805f806101408b8d03121562000283575f80fd5b6200028e8b6200017d565b99506200029e60208c016200017d565b60408c01519099506001600160401b0380821115620002bb575f80fd5b620002c98e838f01620001ad565b995060608d0151915080821115620002df575f80fd5b620002ed8e838f01620001ad565b9850620002fd60808e0162000257565b975060a08d0151965060c08d015195506200031b60e08e016200017d565b94506101008d015191508082111562000332575f80fd5b620003408e838f01620001ad565b93506101208d015191508082111562000357575f80fd5b50620003668d828e01620001ad565b9150509295989b9194979a5092959850565b600181811c908216806200038d57607f821691505b602082108103620003ac57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620003ff575f81815260208120601f850160051c81016020861015620003da5750805b601f850160051c820191505b81811015620003fb57828155600101620003e6565b5050505b505050565b81516001600160401b0381111562000420576200042062000199565b620004388162000431845462000378565b84620003b2565b602080601f8311600181146200046e575f8415620004565750858301515b5f19600386901b1c1916600185901b178555620003fb565b5f85815260208120601f198616915b828110156200049e578886015182559484019460019091019084016200047d565b5085821015620004bc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516124b8620005215f395f81816105b001528181610e06015281816110f701526112c601525f61049d01525f818161037801528181610a9d01528181610d25015261134901526124b85ff3fe608060405260043610610280575f3560e01c80636a22d8cc11610155578063b34a3060116100be578063d479e97411610078578063d479e974146107be578063d73792a9146107d1578063d7ad21ac146107e6578063dd62ed3e14610805578063e74b981b14610849578063f558eb0514610868575f80fd5b8063b34a306014610719578063b94e8df214610739578063be37757a14610758578063c29c669a1461076d578063cb64ef1b1461078c578063cd433ada146107ab575f80fd5b806395d89b411161010f57806395d89b411461067f578063a6f9dae114610693578063a9059cbb146106b2578063acb2ad6f146106d1578063ad80e451146106e6578063b0fa844414610705575f80fd5b80636a22d8cc1461059f57806370a08231146105d2578063893d20e8146106065780638b4cee08146106225780638ebfc796146106415780638f02bb5b14610660575f80fd5b806323b872dd116101f757806346904840116101b157806346904840146104fb578063470624021461051a5780634782f7791461052f578063491606581461054e5780634d2384891461056d578063678f5b3c14610580575f80fd5b806323b872dd1461044157806326232a2e146104605780632b14ca5614610475578063313ce5671461048a57806333039d3d146104c75780633f3e4c11146104dc575f80fd5b8063116191b611610248578063116191b61461036757806312e8e2c3146103b2578063131417de146103d157806318160ddd146103f05780631a98b2e01461040e5780631c6ffa461461042d575f80fd5b806301e88208146102845780630659ce5c146102d757806306fdde03146102f8578063095ea7b3146103195780630cc835a314610348575b5f80fd5b34801561028f575f80fd5b506102bb61029e366004611d3a565b600b6020525f908152604090205460ff8082169161010090041682565b6040805192151583529015156020830152015b60405180910390f35b3480156102e2575f80fd5b506102f66102f1366004611d55565b610888565b005b348015610303575f80fd5b5061030c6108ca565b6040516102ce9190611de0565b348015610324575f80fd5b50610338610333366004611df2565b61095a565b60405190151581526020016102ce565b348015610353575f80fd5b506102f6610362366004611e1c565b6109c6565b348015610372575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102ce565b3480156103bd575f80fd5b506102f66103cc366004611e1c565b6109f4565b3480156103dc575f80fd5b506102f66103eb366004611d3a565b610a22565b3480156103fb575f80fd5b506001545b6040519081526020016102ce565b348015610419575f80fd5b506102f6610428366004611e78565b610a6d565b348015610438575f80fd5b5061030c610b4c565b34801561044c575f80fd5b5061033861045b366004611d55565b610bd8565b34801561046b575f80fd5b5061040060095481565b348015610480575f80fd5b50610400600d5481565b348015610495575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016102ce565b3480156104d2575f80fd5b5061040060105481565b3480156104e7575f80fd5b506102f66104f6366004611e1c565b610c90565b348015610506575f80fd5b50600f5461039a906001600160a01b031681565b348015610525575f80fd5b50610400600c5481565b34801561053a575f80fd5b506102f6610549366004611df2565b610cbe565b348015610559575f80fd5b506102f6610568366004611f48565b610cf5565b6102f661057b366004611fe4565b610dd9565b34801561058b575f80fd5b50600a5461039a906001600160a01b031681565b3480156105aa575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105dd575f80fd5b506104006105ec366004611d3a565b6001600160a01b03165f9081526004602052604090205490565b348015610611575f80fd5b505f546001600160a01b031661039a565b34801561062d575f80fd5b506102f661063c366004611e1c565b610e5c565b34801561064c575f80fd5b506102f661065b366004612027565b610e8a565b34801561066b575f80fd5b506102f661067a366004611e1c565b610edd565b34801561068a575f80fd5b5061030c610f0b565b34801561069e575f80fd5b506102f66106ad366004611d3a565b610f1a565b3480156106bd575f80fd5b506103386106cc366004611df2565b610f9c565b3480156106dc575f80fd5b50610400600e5481565b3480156106f1575f80fd5b506102f6610700366004611e1c565b610fa8565b348015610710575f80fd5b5061030c610fd6565b348015610724575f80fd5b50600f5461033890600160a81b900460ff1681565b348015610744575f80fd5b506102f661075336600461205e565b610fe3565b348015610763575f80fd5b5061040060085481565b348015610778575f80fd5b506102f6610787366004612027565b61102a565b348015610797575f80fd5b506102f66107a636600461205e565b611083565b6102f66107b9366004611fe4565b6110ca565b6102f66107cc366004611df2565b611128565b3480156107dc575f80fd5b5061040061271081565b3480156107f1575f80fd5b50610400610800366004611d55565b61139e565b348015610810575f80fd5b5061040061081f366004612079565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610854575f80fd5b506102f6610863366004611d3a565b61147b565b348015610873575f80fd5b50600f5461033890600160a01b900460ff1681565b5f546001600160a01b031633146108ba5760405162461bcd60e51b81526004016108b1906120a5565b60405180910390fd5b6108c58383836114c6565b505050565b6060600280546108d9906120d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610905906120d2565b80156109505780601f1061092757610100808354040283529160200191610950565b820191905f5260205f20905b81548152906001019060200180831161093357829003601f168201915b5050505050905090565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109b49086815260200190565b60405180910390a35060015b92915050565b5f546001600160a01b031633146109ef5760405162461bcd60e51b81526004016108b1906120a5565b600c55565b5f546001600160a01b03163314610a1d5760405162461bcd60e51b81526004016108b1906120a5565b600955565b5f546001600160a01b03163314610a4b5760405162461bcd60e51b81526004016108b1906120a5565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f8585604051610a7e92919061210a565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed990610ae2908e908e908e908e908e9089908d908d908d90600401612141565b6020604051808303815f875af1158015610afe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b22919061219f565b610b3f57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60068054610b59906120d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b85906120d2565b8015610bd05780601f10610ba757610100808354040283529160200191610bd0565b820191905f5260205f20905b815481529060010190602001808311610bb357829003601f168201915b505050505081565b6001600160a01b0383165f908152600560209081526040808320338452909152812054821115610c435760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b60448201526064016108b1565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610c759084906121ce565b90915550610c8690508484846115f2565b90505b9392505050565b5f546001600160a01b03163314610cb95760405162461bcd60e51b81526004016108b1906120a5565b601055565b5f546001600160a01b03163314610ce75760405162461bcd60e51b81526004016108b1906120a5565b610cf182826118e5565b5050565b5f8282604051610d0692919061210a565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390610d64908b908b908b908b908b9089906004016121e1565b6020604051808303815f875af1158015610d80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da4919061219f565b610dc157604051631403112d60e21b815260040160405180910390fd5b610dcf8787878787876119bb565b5050505050505050565b604051634d23848960e01b815260048101849052602481018390526001600160a01b0382811660448301527f00000000000000000000000000000000000000000000000000000000000000001690634d2384899034906064015b5f604051808303818588803b158015610e4a575f80fd5b505af1158015610dcf573d5f803e3d5ffd5b5f546001600160a01b03163314610e855760405162461bcd60e51b81526004016108b1906120a5565b600d55565b5f546001600160a01b03163314610eb35760405162461bcd60e51b81526004016108b1906120a5565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610f065760405162461bcd60e51b81526004016108b1906120a5565b600e55565b6060600380546108d9906120d2565b5f546001600160a01b03163314610f435760405162461bcd60e51b81526004016108b1906120a5565b5f80546040516001600160a01b03808516939216917f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73591a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610c893384846115f2565b5f546001600160a01b03163314610fd15760405162461bcd60e51b81526004016108b1906120a5565b600855565b60078054610b59906120d2565b5f546001600160a01b0316331461100c5760405162461bcd60e51b81526004016108b1906120a5565b600f8054911515600160a01b0260ff60a01b19909216919091179055565b5f546001600160a01b031633146110535760405162461bcd60e51b81526004016108b1906120a5565b6001600160a01b039091165f908152600b6020526040902080549115156101000261ff0019909216919091179055565b5f546001600160a01b031633146110ac5760405162461bcd60e51b81526004016108b1906120a5565b600f8054911515600160a81b0260ff60a81b19909216919091179055565b6040516366a19d6d60e11b815260048101849052602481018390526001600160a01b0382811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063cd433ada903490606401610e33565b5f81116111475760405162461bcd60e51b81526004016108b190612221565b6001600160a01b03821661118e5760405162461bcd60e51b815260206004820152600e60248201526d16995c9bc8149958da5c1a595b9d60921b60448201526064016108b1565b60095460085461119e9190612246565b3410156111d75760405162461bcd60e51b81526020600482015260076024820152664d696e2047617360c81b60448201526064016108b1565b335f908152600460205260409020548111156112055760405162461bcd60e51b81526004016108b190612259565b600f54600160a81b900460ff16156112525760405162461bcd60e51b815260206004820152601060248201526f109c9a5919da5b99c8109b1bd8dad95960821b60448201526064016108b1565b6009541561127357600a54600954611273916001600160a01b0316906118e5565b5f6009543461128291906121ce565b905061128e3383611b0c565b604080516001600160a01b0385811660208301528183018590528251808303840181526060830193849052630c93e3bb60e01b9093527f00000000000000000000000000000000000000000000000000000000000000001690630c93e3bb90849061130790309060069060079088903390606401612300565b5f604051808303818588803b15801561131e575f80fd5b505af1158015611330573d5f803e3d5ffd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506113879150600690600790869060040161235d565b5f604051808303815f87803b158015610e4a575f80fd5b6001600160a01b0383165f908152600b602052604081205460ff16806113db57506001600160a01b0383165f908152600b602052604090205460ff165b156113e757505f610c89565b6001600160a01b0383165f908152600b6020526040902054610100900460ff16611460576001600160a01b0384165f908152600b6020526040902054610100900460ff1661144f57612710600e5483611440919061239f565b61144a91906123b6565b610c86565b612710600c5483611440919061239f565b612710600d5483611471919061239f565b610c8691906123b6565b5f546001600160a01b031633146114a45760405162461bcd60e51b81526004016108b1906120a5565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161152191906123d5565b5f604051808303815f865af19150503d805f811461155a576040519150601f19603f3d011682016040523d82523d5f602084013e61155f565b606091505b5091509150818015611589575080511580611589575080806020019051810190611589919061219f565b6115eb5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016108b1565b5050505050565b5f6001600160a01b0384166116375760405162461bcd60e51b815260206004820152600b60248201526a2d32b9379029b2b73232b960a91b60448201526064016108b1565b6001600160a01b03831661167e5760405162461bcd60e51b815260206004820152600e60248201526d16995c9bc8149958da5c1a595b9d60921b60448201526064016108b1565b5f821161169d5760405162461bcd60e51b81526004016108b190612221565b6001600160a01b0384165f908152600460205260409020548211156116d45760405162461bcd60e51b81526004016108b190612259565b6001600160a01b0384165f90815260046020526040812080548492906116fb9084906121ce565b909155505f905061170d85858561139e565b90505f61171a82856121ce565b90505f811161173b5760405162461bcd60e51b81526004016108b190612221565b6001600160a01b038086165f81815260046020526040908190208054850190555190918816905f805160206124638339815191529061177d9085815260200190565b60405180910390a381156118d957600f545f906001600160a01b0316158015906117b25750600f546001600160a01b03163014155b90505f816117c057306117cd565b600f546001600160a01b03165b6001600160a01b038082165f81815260046020526040908190208054890190555192935091908a16905f80516020612463833981519152906118129088815260200190565b60405180910390a3600f54600160a01b900460ff1680156118305750815b156118d657604080518082018252600981526874726967676572282960b81b60209182015281516004815260248101835290810180516001600160e01b0316630ffd91a760e31b17905290515f916001600160a01b0384169161189391906123d5565b5f604051808303815f865af19150503d805f81146118cc576040519150601f19603f3d011682016040523d82523d5f602084013e6118d1565b606091505b505050505b50505b50600195945050505050565b604080515f808252602082019092526001600160a01b03841690839060405161190e91906123d5565b5f6040518083038185875af1925050503d805f8114611948576040519150601f19603f3d011682016040523d82523d5f602084013e61194d565b606091505b50509050806108c55760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016108b1565b60066040516119ca91906123f0565b604051809103902086866040516119e292919061210a565b604051809103902014611a2e5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21029b7bab931b29021b430b4b760611b60448201526064016108b1565b6007604051611a3d91906123f0565b60405180910390208484604051611a5592919061210a565b604051809103902014611aa35760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420536f75726365204164647265737360501b60448201526064016108b1565b600f54600160a81b900460ff1615611af05760405162461bcd60e51b815260206004820152601060248201526f109c9a5919da5b99c8109b1bd8dad95960821b60448201526064016108b1565b5f80611afe83850185611df2565b91509150610dcf8282611c1d565b6001600160a01b038216611b515760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016108b1565b5f8111611b705760405162461bcd60e51b81526004016108b190612221565b6001600160a01b0382165f90815260046020526040902054811115611ba75760405162461bcd60e51b81526004016108b190612259565b6001600160a01b0382165f9081526004602052604081208054839290611bce9084906121ce565b925050819055508060015f828254611be691906121ce565b90915550506040518181525f906001600160a01b038416905f80516020612463833981519152906020015b60405180910390a35050565b6001600160a01b038216611c625760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016108b1565b5f8111611c815760405162461bcd60e51b81526004016108b190612221565b6001600160a01b0382165f908152600460205260409020805482019055600180548201908190556010541015611cf95760405162461bcd60e51b815260206004820152601860248201527f45786365656473204d617820546f74616c20537570706c79000000000000000060448201526064016108b1565b6040518181526001600160a01b038316905f905f8051602061246383398151915290602001611c11565b6001600160a01b0381168114611d37575f80fd5b50565b5f60208284031215611d4a575f80fd5b8135610c8981611d23565b5f805f60608486031215611d67575f80fd5b8335611d7281611d23565b92506020840135611d8281611d23565b929592945050506040919091013590565b5f5b83811015611dad578181015183820152602001611d95565b50505f910152565b5f8151808452611dcc816020860160208601611d93565b601f01601f19169290920160200192915050565b602081525f610c896020830184611db5565b5f8060408385031215611e03575f80fd5b8235611e0e81611d23565b946020939093013593505050565b5f60208284031215611e2c575f80fd5b5035919050565b5f8083601f840112611e43575f80fd5b50813567ffffffffffffffff811115611e5a575f80fd5b602083019150836020828501011115611e71575f80fd5b9250929050565b5f805f805f805f805f8060c08b8d031215611e91575f80fd5b8a35995060208b013567ffffffffffffffff80821115611eaf575f80fd5b611ebb8e838f01611e33565b909b50995060408d0135915080821115611ed3575f80fd5b611edf8e838f01611e33565b909950975060608d0135915080821115611ef7575f80fd5b611f038e838f01611e33565b909750955060808d0135915080821115611f1b575f80fd5b50611f288d828e01611e33565b9150809450508092505060a08b013590509295989b9194979a5092959850565b5f805f805f805f6080888a031215611f5e575f80fd5b87359650602088013567ffffffffffffffff80821115611f7c575f80fd5b611f888b838c01611e33565b909850965060408a0135915080821115611fa0575f80fd5b611fac8b838c01611e33565b909650945060608a0135915080821115611fc4575f80fd5b50611fd18a828b01611e33565b989b979a50959850939692959293505050565b5f805f60608486031215611ff6575f80fd5b8335925060208401359150604084013561200f81611d23565b809150509250925092565b8015158114611d37575f80fd5b5f8060408385031215612038575f80fd5b823561204381611d23565b915060208301356120538161201a565b809150509250929050565b5f6020828403121561206e575f80fd5b8135610c898161201a565b5f806040838503121561208a575f80fd5b823561209581611d23565b9150602083013561205381611d23565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b600181811c908216806120e657607f821691505b60208210810361210457634e487b7160e01b5f52602260045260245ffd5b50919050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b89815260c060208201525f61215a60c083018a8c612119565b828103604084015261216d81898b612119565b90508660608401528281036080840152612188818688612119565b9150508260a08301529a9950505050505050505050565b5f602082840312156121af575f80fd5b8151610c898161201a565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109c0576109c06121ba565b868152608060208201525f6121fa608083018789612119565b828103604084015261220d818688612119565b915050826060830152979650505050505050565b6020808252600b908201526a16995c9bc8105b5bdd5b9d60aa1b604082015260600190565b808201808211156109c0576109c06121ba565b602080825260149082015273496e73756666696369656e742042616c616e636560601b604082015260600190565b5f8154612293816120d2565b8085526020600183811680156122b057600181146122ca576122f5565b60ff1985168884015283151560051b8801830195506122f5565b865f52825f205f5b858110156122ed5781548a82018601529083019084016122d2565b890184019650505b505050505092915050565b5f60018060a01b03808816835260a0602084015261232160a0840188612287565b83810360408501526123338188612287565b905083810360608501526123478187611db5565b9250508084166080840152509695505050505050565b606081525f61236f6060830186612287565b82810360208401526123818186612287565b905082810360408401526123958185611db5565b9695505050505050565b80820281158282048414176109c0576109c06121ba565b5f826123d057634e487b7160e01b5f52601260045260245ffd5b500490565b5f82516123e6818460208701611d93565b9190910192915050565b5f8083546123fd816120d2565b60018281168015612415576001811461242a57612456565b60ff1984168752821515830287019450612456565b875f526020805f205f5b8581101561244d5781548a820152908401908201612434565b50505082870194505b5092969550505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cd00dad9b63dda306c15547cddf961de6ebea9d1a66cf255bd7690d86d6056ba64736f6c634300081400330000000000000000000000004f4495243837681061c4743b74b3eedf548d56a50000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000016bcc41e900000000000000000000000000002d2171118bcef0649d6472dc5219d58be4f259ca00000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000114f7065726174696f6e2050686f656e69780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005244f504858000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000762696e616e636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a30784466334332343730366139396462394437613746396335614132303641646363373433453537396500000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610280575f3560e01c80636a22d8cc11610155578063b34a3060116100be578063d479e97411610078578063d479e974146107be578063d73792a9146107d1578063d7ad21ac146107e6578063dd62ed3e14610805578063e74b981b14610849578063f558eb0514610868575f80fd5b8063b34a306014610719578063b94e8df214610739578063be37757a14610758578063c29c669a1461076d578063cb64ef1b1461078c578063cd433ada146107ab575f80fd5b806395d89b411161010f57806395d89b411461067f578063a6f9dae114610693578063a9059cbb146106b2578063acb2ad6f146106d1578063ad80e451146106e6578063b0fa844414610705575f80fd5b80636a22d8cc1461059f57806370a08231146105d2578063893d20e8146106065780638b4cee08146106225780638ebfc796146106415780638f02bb5b14610660575f80fd5b806323b872dd116101f757806346904840116101b157806346904840146104fb578063470624021461051a5780634782f7791461052f578063491606581461054e5780634d2384891461056d578063678f5b3c14610580575f80fd5b806323b872dd1461044157806326232a2e146104605780632b14ca5614610475578063313ce5671461048a57806333039d3d146104c75780633f3e4c11146104dc575f80fd5b8063116191b611610248578063116191b61461036757806312e8e2c3146103b2578063131417de146103d157806318160ddd146103f05780631a98b2e01461040e5780631c6ffa461461042d575f80fd5b806301e88208146102845780630659ce5c146102d757806306fdde03146102f8578063095ea7b3146103195780630cc835a314610348575b5f80fd5b34801561028f575f80fd5b506102bb61029e366004611d3a565b600b6020525f908152604090205460ff8082169161010090041682565b6040805192151583529015156020830152015b60405180910390f35b3480156102e2575f80fd5b506102f66102f1366004611d55565b610888565b005b348015610303575f80fd5b5061030c6108ca565b6040516102ce9190611de0565b348015610324575f80fd5b50610338610333366004611df2565b61095a565b60405190151581526020016102ce565b348015610353575f80fd5b506102f6610362366004611e1c565b6109c6565b348015610372575f80fd5b5061039a7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a581565b6040516001600160a01b0390911681526020016102ce565b3480156103bd575f80fd5b506102f66103cc366004611e1c565b6109f4565b3480156103dc575f80fd5b506102f66103eb366004611d3a565b610a22565b3480156103fb575f80fd5b506001545b6040519081526020016102ce565b348015610419575f80fd5b506102f6610428366004611e78565b610a6d565b348015610438575f80fd5b5061030c610b4c565b34801561044c575f80fd5b5061033861045b366004611d55565b610bd8565b34801561046b575f80fd5b5061040060095481565b348015610480575f80fd5b50610400600d5481565b348015610495575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016102ce565b3480156104d2575f80fd5b5061040060105481565b3480156104e7575f80fd5b506102f66104f6366004611e1c565b610c90565b348015610506575f80fd5b50600f5461039a906001600160a01b031681565b348015610525575f80fd5b50610400600c5481565b34801561053a575f80fd5b506102f6610549366004611df2565b610cbe565b348015610559575f80fd5b506102f6610568366004611f48565b610cf5565b6102f661057b366004611fe4565b610dd9565b34801561058b575f80fd5b50600a5461039a906001600160a01b031681565b3480156105aa575f80fd5b5061039a7f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a08271281565b3480156105dd575f80fd5b506104006105ec366004611d3a565b6001600160a01b03165f9081526004602052604090205490565b348015610611575f80fd5b505f546001600160a01b031661039a565b34801561062d575f80fd5b506102f661063c366004611e1c565b610e5c565b34801561064c575f80fd5b506102f661065b366004612027565b610e8a565b34801561066b575f80fd5b506102f661067a366004611e1c565b610edd565b34801561068a575f80fd5b5061030c610f0b565b34801561069e575f80fd5b506102f66106ad366004611d3a565b610f1a565b3480156106bd575f80fd5b506103386106cc366004611df2565b610f9c565b3480156106dc575f80fd5b50610400600e5481565b3480156106f1575f80fd5b506102f6610700366004611e1c565b610fa8565b348015610710575f80fd5b5061030c610fd6565b348015610724575f80fd5b50600f5461033890600160a81b900460ff1681565b348015610744575f80fd5b506102f661075336600461205e565b610fe3565b348015610763575f80fd5b5061040060085481565b348015610778575f80fd5b506102f6610787366004612027565b61102a565b348015610797575f80fd5b506102f66107a636600461205e565b611083565b6102f66107b9366004611fe4565b6110ca565b6102f66107cc366004611df2565b611128565b3480156107dc575f80fd5b5061040061271081565b3480156107f1575f80fd5b50610400610800366004611d55565b61139e565b348015610810575f80fd5b5061040061081f366004612079565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610854575f80fd5b506102f6610863366004611d3a565b61147b565b348015610873575f80fd5b50600f5461033890600160a01b900460ff1681565b5f546001600160a01b031633146108ba5760405162461bcd60e51b81526004016108b1906120a5565b60405180910390fd5b6108c58383836114c6565b505050565b6060600280546108d9906120d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610905906120d2565b80156109505780601f1061092757610100808354040283529160200191610950565b820191905f5260205f20905b81548152906001019060200180831161093357829003601f168201915b5050505050905090565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109b49086815260200190565b60405180910390a35060015b92915050565b5f546001600160a01b031633146109ef5760405162461bcd60e51b81526004016108b1906120a5565b600c55565b5f546001600160a01b03163314610a1d5760405162461bcd60e51b81526004016108b1906120a5565b600955565b5f546001600160a01b03163314610a4b5760405162461bcd60e51b81526004016108b1906120a5565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f8585604051610a7e92919061210a565b604051908190038120631876eed960e01b825291506001600160a01b037f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a51690631876eed990610ae2908e908e908e908e908e9089908d908d908d90600401612141565b6020604051808303815f875af1158015610afe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b22919061219f565b610b3f57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60068054610b59906120d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b85906120d2565b8015610bd05780601f10610ba757610100808354040283529160200191610bd0565b820191905f5260205f20905b815481529060010190602001808311610bb357829003601f168201915b505050505081565b6001600160a01b0383165f908152600560209081526040808320338452909152812054821115610c435760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b60448201526064016108b1565b6001600160a01b0384165f90815260056020908152604080832033845290915281208054849290610c759084906121ce565b90915550610c8690508484846115f2565b90505b9392505050565b5f546001600160a01b03163314610cb95760405162461bcd60e51b81526004016108b1906120a5565b601055565b5f546001600160a01b03163314610ce75760405162461bcd60e51b81526004016108b1906120a5565b610cf182826118e5565b5050565b5f8282604051610d0692919061210a565b604051908190038120635f6970c360e01b825291506001600160a01b037f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a51690635f6970c390610d64908b908b908b908b908b9089906004016121e1565b6020604051808303815f875af1158015610d80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da4919061219f565b610dc157604051631403112d60e21b815260040160405180910390fd5b610dcf8787878787876119bb565b5050505050505050565b604051634d23848960e01b815260048101849052602481018390526001600160a01b0382811660448301527f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827121690634d2384899034906064015b5f604051808303818588803b158015610e4a575f80fd5b505af1158015610dcf573d5f803e3d5ffd5b5f546001600160a01b03163314610e855760405162461bcd60e51b81526004016108b1906120a5565b600d55565b5f546001600160a01b03163314610eb35760405162461bcd60e51b81526004016108b1906120a5565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610f065760405162461bcd60e51b81526004016108b1906120a5565b600e55565b6060600380546108d9906120d2565b5f546001600160a01b03163314610f435760405162461bcd60e51b81526004016108b1906120a5565b5f80546040516001600160a01b03808516939216917f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73591a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610c893384846115f2565b5f546001600160a01b03163314610fd15760405162461bcd60e51b81526004016108b1906120a5565b600855565b60078054610b59906120d2565b5f546001600160a01b0316331461100c5760405162461bcd60e51b81526004016108b1906120a5565b600f8054911515600160a01b0260ff60a01b19909216919091179055565b5f546001600160a01b031633146110535760405162461bcd60e51b81526004016108b1906120a5565b6001600160a01b039091165f908152600b6020526040902080549115156101000261ff0019909216919091179055565b5f546001600160a01b031633146110ac5760405162461bcd60e51b81526004016108b1906120a5565b600f8054911515600160a81b0260ff60a81b19909216919091179055565b6040516366a19d6d60e11b815260048101849052602481018390526001600160a01b0382811660448301527f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712169063cd433ada903490606401610e33565b5f81116111475760405162461bcd60e51b81526004016108b190612221565b6001600160a01b03821661118e5760405162461bcd60e51b815260206004820152600e60248201526d16995c9bc8149958da5c1a595b9d60921b60448201526064016108b1565b60095460085461119e9190612246565b3410156111d75760405162461bcd60e51b81526020600482015260076024820152664d696e2047617360c81b60448201526064016108b1565b335f908152600460205260409020548111156112055760405162461bcd60e51b81526004016108b190612259565b600f54600160a81b900460ff16156112525760405162461bcd60e51b815260206004820152601060248201526f109c9a5919da5b99c8109b1bd8dad95960821b60448201526064016108b1565b6009541561127357600a54600954611273916001600160a01b0316906118e5565b5f6009543461128291906121ce565b905061128e3383611b0c565b604080516001600160a01b0385811660208301528183018590528251808303840181526060830193849052630c93e3bb60e01b9093527f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827121690630c93e3bb90849061130790309060069060079088903390606401612300565b5f604051808303818588803b15801561131e575f80fd5b505af1158015611330573d5f803e3d5ffd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5169350631c92115f92506113879150600690600790869060040161235d565b5f604051808303815f87803b158015610e4a575f80fd5b6001600160a01b0383165f908152600b602052604081205460ff16806113db57506001600160a01b0383165f908152600b602052604090205460ff165b156113e757505f610c89565b6001600160a01b0383165f908152600b6020526040902054610100900460ff16611460576001600160a01b0384165f908152600b6020526040902054610100900460ff1661144f57612710600e5483611440919061239f565b61144a91906123b6565b610c86565b612710600c5483611440919061239f565b612710600d5483611471919061239f565b610c8691906123b6565b5f546001600160a01b031633146114a45760405162461bcd60e51b81526004016108b1906120a5565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161152191906123d5565b5f604051808303815f865af19150503d805f811461155a576040519150601f19603f3d011682016040523d82523d5f602084013e61155f565b606091505b5091509150818015611589575080511580611589575080806020019051810190611589919061219f565b6115eb5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016108b1565b5050505050565b5f6001600160a01b0384166116375760405162461bcd60e51b815260206004820152600b60248201526a2d32b9379029b2b73232b960a91b60448201526064016108b1565b6001600160a01b03831661167e5760405162461bcd60e51b815260206004820152600e60248201526d16995c9bc8149958da5c1a595b9d60921b60448201526064016108b1565b5f821161169d5760405162461bcd60e51b81526004016108b190612221565b6001600160a01b0384165f908152600460205260409020548211156116d45760405162461bcd60e51b81526004016108b190612259565b6001600160a01b0384165f90815260046020526040812080548492906116fb9084906121ce565b909155505f905061170d85858561139e565b90505f61171a82856121ce565b90505f811161173b5760405162461bcd60e51b81526004016108b190612221565b6001600160a01b038086165f81815260046020526040908190208054850190555190918816905f805160206124638339815191529061177d9085815260200190565b60405180910390a381156118d957600f545f906001600160a01b0316158015906117b25750600f546001600160a01b03163014155b90505f816117c057306117cd565b600f546001600160a01b03165b6001600160a01b038082165f81815260046020526040908190208054890190555192935091908a16905f80516020612463833981519152906118129088815260200190565b60405180910390a3600f54600160a01b900460ff1680156118305750815b156118d657604080518082018252600981526874726967676572282960b81b60209182015281516004815260248101835290810180516001600160e01b0316630ffd91a760e31b17905290515f916001600160a01b0384169161189391906123d5565b5f604051808303815f865af19150503d805f81146118cc576040519150601f19603f3d011682016040523d82523d5f602084013e6118d1565b606091505b505050505b50505b50600195945050505050565b604080515f808252602082019092526001600160a01b03841690839060405161190e91906123d5565b5f6040518083038185875af1925050503d805f8114611948576040519150601f19603f3d011682016040523d82523d5f602084013e61194d565b606091505b50509050806108c55760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016108b1565b60066040516119ca91906123f0565b604051809103902086866040516119e292919061210a565b604051809103902014611a2e5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21029b7bab931b29021b430b4b760611b60448201526064016108b1565b6007604051611a3d91906123f0565b60405180910390208484604051611a5592919061210a565b604051809103902014611aa35760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420536f75726365204164647265737360501b60448201526064016108b1565b600f54600160a81b900460ff1615611af05760405162461bcd60e51b815260206004820152601060248201526f109c9a5919da5b99c8109b1bd8dad95960821b60448201526064016108b1565b5f80611afe83850185611df2565b91509150610dcf8282611c1d565b6001600160a01b038216611b515760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016108b1565b5f8111611b705760405162461bcd60e51b81526004016108b190612221565b6001600160a01b0382165f90815260046020526040902054811115611ba75760405162461bcd60e51b81526004016108b190612259565b6001600160a01b0382165f9081526004602052604081208054839290611bce9084906121ce565b925050819055508060015f828254611be691906121ce565b90915550506040518181525f906001600160a01b038416905f80516020612463833981519152906020015b60405180910390a35050565b6001600160a01b038216611c625760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016108b1565b5f8111611c815760405162461bcd60e51b81526004016108b190612221565b6001600160a01b0382165f908152600460205260409020805482019055600180548201908190556010541015611cf95760405162461bcd60e51b815260206004820152601860248201527f45786365656473204d617820546f74616c20537570706c79000000000000000060448201526064016108b1565b6040518181526001600160a01b038316905f905f8051602061246383398151915290602001611c11565b6001600160a01b0381168114611d37575f80fd5b50565b5f60208284031215611d4a575f80fd5b8135610c8981611d23565b5f805f60608486031215611d67575f80fd5b8335611d7281611d23565b92506020840135611d8281611d23565b929592945050506040919091013590565b5f5b83811015611dad578181015183820152602001611d95565b50505f910152565b5f8151808452611dcc816020860160208601611d93565b601f01601f19169290920160200192915050565b602081525f610c896020830184611db5565b5f8060408385031215611e03575f80fd5b8235611e0e81611d23565b946020939093013593505050565b5f60208284031215611e2c575f80fd5b5035919050565b5f8083601f840112611e43575f80fd5b50813567ffffffffffffffff811115611e5a575f80fd5b602083019150836020828501011115611e71575f80fd5b9250929050565b5f805f805f805f805f8060c08b8d031215611e91575f80fd5b8a35995060208b013567ffffffffffffffff80821115611eaf575f80fd5b611ebb8e838f01611e33565b909b50995060408d0135915080821115611ed3575f80fd5b611edf8e838f01611e33565b909950975060608d0135915080821115611ef7575f80fd5b611f038e838f01611e33565b909750955060808d0135915080821115611f1b575f80fd5b50611f288d828e01611e33565b9150809450508092505060a08b013590509295989b9194979a5092959850565b5f805f805f805f6080888a031215611f5e575f80fd5b87359650602088013567ffffffffffffffff80821115611f7c575f80fd5b611f888b838c01611e33565b909850965060408a0135915080821115611fa0575f80fd5b611fac8b838c01611e33565b909650945060608a0135915080821115611fc4575f80fd5b50611fd18a828b01611e33565b989b979a50959850939692959293505050565b5f805f60608486031215611ff6575f80fd5b8335925060208401359150604084013561200f81611d23565b809150509250925092565b8015158114611d37575f80fd5b5f8060408385031215612038575f80fd5b823561204381611d23565b915060208301356120538161201a565b809150509250929050565b5f6020828403121561206e575f80fd5b8135610c898161201a565b5f806040838503121561208a575f80fd5b823561209581611d23565b9150602083013561205381611d23565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b600181811c908216806120e657607f821691505b60208210810361210457634e487b7160e01b5f52602260045260245ffd5b50919050565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b89815260c060208201525f61215a60c083018a8c612119565b828103604084015261216d81898b612119565b90508660608401528281036080840152612188818688612119565b9150508260a08301529a9950505050505050505050565b5f602082840312156121af575f80fd5b8151610c898161201a565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109c0576109c06121ba565b868152608060208201525f6121fa608083018789612119565b828103604084015261220d818688612119565b915050826060830152979650505050505050565b6020808252600b908201526a16995c9bc8105b5bdd5b9d60aa1b604082015260600190565b808201808211156109c0576109c06121ba565b602080825260149082015273496e73756666696369656e742042616c616e636560601b604082015260600190565b5f8154612293816120d2565b8085526020600183811680156122b057600181146122ca576122f5565b60ff1985168884015283151560051b8801830195506122f5565b865f52825f205f5b858110156122ed5781548a82018601529083019084016122d2565b890184019650505b505050505092915050565b5f60018060a01b03808816835260a0602084015261232160a0840188612287565b83810360408501526123338188612287565b905083810360608501526123478187611db5565b9250508084166080840152509695505050505050565b606081525f61236f6060830186612287565b82810360208401526123818186612287565b905082810360408401526123958185611db5565b9695505050505050565b80820281158282048414176109c0576109c06121ba565b5f826123d057634e487b7160e01b5f52601260045260245ffd5b500490565b5f82516123e6818460208701611d93565b9190910192915050565b5f8083546123fd816120d2565b60018281168015612415576001811461242a57612456565b60ff1984168752821515830287019450612456565b875f526020805f205f5b8581101561244d5781548a820152908401908201612434565b50505082870194505b5092969550505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cd00dad9b63dda306c15547cddf961de6ebea9d1a66cf255bd7690d86d6056ba64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a50000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000016bcc41e900000000000000000000000000002d2171118bcef0649d6472dc5219d58be4f259ca00000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000114f7065726174696f6e2050686f656e69780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005244f504858000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000762696e616e636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a30784466334332343730366139396462394437613746396335614132303641646363373433453537396500000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : gateway_ (address): 0x4F4495243837681061C4743b74B3eEdf548D56A5
Arg [1] : gasService_ (address): 0x2d5d7d31F671F86C782533cc367F14109a082712
Arg [2] : name_ (string): Operation Phoenix
Arg [3] : symbol_ (string): $OPHX
Arg [4] : decimals_ (uint8): 18
Arg [5] : minGas_ (uint256): 600000000000000
Arg [6] : platformFee_ (uint256): 400000000000000
Arg [7] : upchargeFeeReceiver_ (address): 0x2d2171118BceF0649D6472DC5219d58bE4F259Ca
Arg [8] : sourceChain_ (string): binance
Arg [9] : sourceAddress_ (string): 0xDf3C24706a99db9D7a7F9c5aA206Adcc743E579e
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5
Arg [1] : 0000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 000000000000000000000000000000000000000000000000000221b262dd8000
Arg [6] : 00000000000000000000000000000000000000000000000000016bcc41e90000
Arg [7] : 0000000000000000000000002d2171118bcef0649d6472dc5219d58be4f259ca
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [11] : 4f7065726174696f6e2050686f656e6978000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [13] : 244f504858000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [15] : 62696e616e636500000000000000000000000000000000000000000000000000
Arg [16] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [17] : 3078446633433234373036613939646239443761374639633561413230364164
Arg [18] : 6363373433453537396500000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
34394:12970:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35461:53;;;;;;;;;;-1:-1:-1;35461:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;589:14:1;;582:22;564:41;;648:14;;641:22;636:2;621:18;;614:50;537:18;35461:53:0;;;;;;;;36969:159;;;;;;;;;;-1:-1:-1;36969:159:0;;;;;:::i;:::-;;:::i;:::-;;39117:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39425:216::-;;;;;;;;;;-1:-1:-1;39425:216:0;;;;;:::i;:::-;;:::i;:::-;;;2377:14:1;;2370:22;2352:41;;2340:2;2325:18;39425:216:0;2212:187:1;38075:90:0;;;;;;;;;;-1:-1:-1;38075:90:0;;;;;:::i;:::-;;:::i;26133:39::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2775:32:1;;;2757:51;;2745:2;2730:18;26133:39:0;2589:225:1;37371:110:0;;;;;;;;;;-1:-1:-1;37371:110:0;;;;;:::i;:::-;;:::i;37489:142::-;;;;;;;;;;-1:-1:-1;37489:142:0;;;;;:::i;:::-;;:::i;38771:88::-;;;;;;;;;;-1:-1:-1;38844:12:0;;38771:88;;;2965:25:1;;;2953:2;2938:18;38771:88:0;2819:177:1;26775:689:0;;;;;;;;;;-1:-1:-1;26775:689:0;;;;;:::i;:::-;;:::i;34975:25::-;;;;;;;;;;;;;:::i;39873:348::-;;;;;;;;;;-1:-1:-1;39873:348:0;;;;;:::i;:::-;;:::i;35231:26::-;;;;;;;;;;;;;;;;35571:29;;;;;;;;;;;;;;;;39323:94;;;;;;;;;;-1:-1:-1;39323:94:0;;4968:4:1;39400:9:0;4956:17:1;4938:36;;4926:2;4911:18;39323:94:0;4796:184:1;35869:53:0;;;;;;;;;;;;;;;;38639:124;;;;;;;;;;-1:-1:-1;38639:124:0;;;;;:::i;:::-;;:::i;35723:27::-;;;;;;;;;;-1:-1:-1;35723:27:0;;;;-1:-1:-1;;;;;35723:27:0;;;35536:28;;;;;;;;;;;;;;;;37136:129;;;;;;;;;;-1:-1:-1;37136:129:0;;;;;:::i;:::-;;:::i;26336:431::-;;;;;;;;;;-1:-1:-1;26336:431:0;;;;;:::i;:::-;;:::i;42942:237::-;;;;;;:::i;:::-;;:::i;35307:34::-;;;;;;;;;;-1:-1:-1;35307:34:0;;;;-1:-1:-1;;;;;35307:34:0;;;34859:45;;;;;;;;;;;;;;;38865:105;;;;;;;;;;-1:-1:-1;38865:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;38949:18:0;38931:7;38949:18;;;:9;:18;;;;;;;38865:105;29249:83;;;;;;;;;;-1:-1:-1;29292:7:0;29319:5;-1:-1:-1;;;;;29319:5:0;29249:83;;38173:94;;;;;;;;;;-1:-1:-1;38173:94:0;;;;;:::i;:::-;;:::i;37639:141::-;;;;;;;;;;-1:-1:-1;37639:141:0;;;;;:::i;:::-;;:::i;38275:110::-;;;;;;;;;;-1:-1:-1;38275:110:0;;;;;:::i;:::-;;:::i;39218:97::-;;;;;;;;;;;;;:::i;29023:132::-;;;;;;;;;;-1:-1:-1;29023:132:0;;;;;:::i;:::-;;:::i;39679:156::-;;;;;;;;;;-1:-1:-1;39679:156:0;;;;;:::i;:::-;;:::i;35607:30::-;;;;;;;;;;;;;;;;37273:90;;;;;;;;;;-1:-1:-1;37273:90:0;;;;;:::i;:::-;;:::i;35073:27::-;;;;;;;;;;;;;:::i;35814:::-;;;;;;;;;;-1:-1:-1;35814:27:0;;;;-1:-1:-1;;;35814:27:0;;;;;;38393:107;;;;;;;;;;-1:-1:-1;38393:107:0;;;;;:::i;:::-;;:::i;35153:21::-;;;;;;;;;;;;;;;;37788:157;;;;;;;;;;-1:-1:-1;37788:157:0;;;;;:::i;:::-;;:::i;38508:123::-;;;;;;;;;;-1:-1:-1;38508:123:0;;;;;:::i;:::-;;:::i;42248:223::-;;;;;;:::i;:::-;;:::i;40332:1456::-;;;;;;:::i;:::-;;:::i;35644:48::-;;;;;;;;;;;;35686:6;35644:48;;45089:482;;;;;;;;;;-1:-1:-1;45089:482:0;;;;;:::i;:::-;;:::i;38976:133::-;;;;;;;;;;-1:-1:-1;38976:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;39078:19:0;;;39060:7;39078:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;38976:133;37953:114;;;;;;;;;;-1:-1:-1;37953:114:0;;;;;:::i;:::-;;:::i;35757:23::-;;;;;;;;;;-1:-1:-1;35757:23:0;;;;-1:-1:-1;;;35757:23:0;;;;;;36969:159;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;;;;;;;;;37073:47:::1;37101:6;37109:2;37113:6;37073:27;:47::i;:::-;36969:159:::0;;;:::o;39117:93::-;39164:13;39197:5;39190:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39117:93;:::o;39425:216::-;39529:10;39500:4;39517:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;39517:32:0;;;;;;;;;;:41;;;39574:37;39500:4;;39517:32;;39574:37;;;;39552:6;2965:25:1;;2953:2;2938:18;;2819:177;39574:37:0;;;;;;;;-1:-1:-1;39629:4:0;39425:216;;;;;:::o;38075:90::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38141:6:::1;:16:::0;38075:90::o;37371:110::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;37447:11:::1;:26:::0;37371:110::o;37489:142::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;37581:19:::1;:42:::0;;-1:-1:-1;;;;;;37581:42:0::1;-1:-1:-1::0;;;;;37581:42:0;;;::::1;::::0;;;::::1;::::0;;37489:142::o;26775:689::-;27030:19;27062:7;;27052:18;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;27102:225:0;;27052:18;-1:-1:-1;;;;;;27102:7:0;:35;;;;:225;;27156:9;;27184:11;;;;27214:13;;;;27052:18;;27276:11;;;;27306:6;;27102:225;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27083:285;;27346:22;;-1:-1:-1;;;27346:22:0;;;;;;;;;;;27083:285;27019:445;26775:689;;;;;;;;;;:::o;34975:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39873:348::-;-1:-1:-1;;;;;40012:19:0;;39973:4;40012:19;;;:11;:19;;;;;;;;40032:10;40012:31;;;;;;;;:41;-1:-1:-1;40012:41:0;39990:113;;;;-1:-1:-1;;;39990:113:0;;10628:2:1;39990:113:0;;;10610:21:1;10667:2;10647:18;;;10640:30;-1:-1:-1;;;10686:18:1;;;10679:52;10748:18;;39990:113:0;10426:346:1;39990:113:0;-1:-1:-1;;;;;40114:19:0;;;;;;:11;:19;;;;;;;;40134:10;40114:31;;;;;;;:41;;40149:6;;40114:19;:41;;40149:6;;40114:41;:::i;:::-;;;;-1:-1:-1;40173:40:0;;-1:-1:-1;40187:6:0;40195:9;40206:6;40173:13;:40::i;:::-;40166:47;;39873:348;;;;;;:::o;38639:124::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38721:16:::1;:34:::0;38639:124::o;37136:129::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;37215:42:::1;37246:2;37250:6;37215:30;:42::i;:::-;37136:129:::0;;:::o;26336:431::-;26519:19;26551:7;;26541:18;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;26577:80:0;;26541:18;-1:-1:-1;;;;;;26577:7:0;:28;;;;:80;;26606:9;;26617:11;;;;26630:13;;;;26541:18;;26577:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26572:129;;26679:22;;-1:-1:-1;;;26679:22:0;;;;;;;;;;;26572:129;26714:45;26723:11;;26736:13;;26751:7;;26714:8;:45::i;:::-;26508:259;26336:431;;;;;;;:::o;42942:237::-;43090:81;;-1:-1:-1;;;43090:81:0;;;;;11830:25:1;;;11871:18;;;11864:34;;;-1:-1:-1;;;;;11934:32:1;;;11914:18;;;11907:60;43090:10:0;:30;;;;43128:9;;11803:18:1;;43090:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38173:94;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38241:7:::1;:18:::0;38173:94::o;37639:141::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37726:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:46;;-1:-1:-1;;37726:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37639:141::o;38275:110::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38351:11:::1;:26:::0;38275:110::o;39218:97::-;39267:13;39300:7;39293:14;;;;;:::i;29023:132::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;29104:5:::1;::::0;;29095:25:::1;::::0;-1:-1:-1;;;;;29095:25:0;;::::1;::::0;29104:5;::::1;::::0;29095:25:::1;::::0;::::1;29131:5;:16:::0;;-1:-1:-1;;;;;;29131:16:0::1;-1:-1:-1::0;;;;;29131:16:0;;;::::1;::::0;;;::::1;::::0;;29023:132::o;39679:156::-;39759:4;39783:44;39797:10;39809:9;39820:6;39783:13;:44::i;37273:90::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;37339:6:::1;:16:::0;37273:90::o;35073:27::-;;;;;;;:::i;38393:107::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38466:11:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;38466:26:0::1;-1:-1:-1::0;;;;38466:26:0;;::::1;::::0;;;::::1;::::0;;38393:107::o;37788:157::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37883:20:0;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:54;;;::::1;;;;-1:-1:-1::0;;37883:54:0;;::::1;::::0;;;::::1;::::0;;37788:157::o;38508:123::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38589:15:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;38589:34:0::1;-1:-1:-1::0;;;;38589:34:0;;::::1;::::0;;;::::1;::::0;;38508:123::o;42248:223::-;42389:74;;-1:-1:-1;;;42389:74:0;;;;;11830:25:1;;;11871:18;;;11864:34;;;-1:-1:-1;;;;;11934:32:1;;;11914:18;;;11907:60;42389:10:0;:23;;;;42420:9;;11803:18:1;;42389:74:0;11628:345:1;40332:1456:0;40464:1;40455:6;:10;40433:71;;;;-1:-1:-1;;;40433:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40537:16:0;;40515:80;;;;-1:-1:-1;;;40515:80:0;;12520:2:1;40515:80:0;;;12502:21:1;12559:2;12539:18;;;12532:30;-1:-1:-1;;;12578:18:1;;;12571:44;12632:18;;40515:80:0;12318:338:1;40515:80:0;40652:11;;40643:6;;:20;;;;:::i;:::-;40628:9;:37;;40606:94;;;;-1:-1:-1;;;40606:94:0;;12993:2:1;40606:94:0;;;12975:21:1;13032:1;13012:18;;;13005:29;-1:-1:-1;;;13050:18:1;;;13043:37;13097:18;;40606:94:0;12791:330:1;40606:94:0;40743:10;40733:21;;;;:9;:21;;;;;;:31;-1:-1:-1;40733:31:0;40711:101;;;;-1:-1:-1;;;40711:101:0;;;;;;;:::i;:::-;40845:15;;-1:-1:-1;;;40845:15:0;;;;:24;40823:90;;;;-1:-1:-1;;;40823:90:0;;13677:2:1;40823:90:0;;;13659:21:1;13716:2;13696:18;;;13689:30;-1:-1:-1;;;13735:18:1;;;13728:46;13791:18;;40823:90:0;13475:340:1;40823:90:0;40969:11;;:15;40965:112;;41032:19;;41053:11;;41001:64;;-1:-1:-1;;;;;41032:19:0;;41001:30;:64::i;:::-;41134:18;41167:11;;41155:9;:23;;;;:::i;:::-;41134:44;;41224:25;41230:10;41242:6;41224:5;:25::i;:::-;41336:22;;;-1:-1:-1;;;;;14012:32:1;;;41336:22:0;;;13994:51:1;14061:18;;;14054:34;;;41336:22:0;;;;;;;;;13967:18:1;;;41336:22:0;;;;-1:-1:-1;;;41471:198:0;;;:10;:38;;;;41517:10;;41471:198;;41552:4;;41572:11;;41598:13;;41336:22;;41648:10;;41471:198;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41723:57:0;;-1:-1:-1;;;41723:57:0;;-1:-1:-1;;;;;41723:7:0;:20;;-1:-1:-1;41723:20:0;;-1:-1:-1;41723:57:0;;-1:-1:-1;41744:11:0;;41757:13;;41772:7;;41723:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;45089:482;-1:-1:-1;;;;;45202:19:0;;45177:7;45202:19;;;:11;:19;;;;;:31;;;;:69;;-1:-1:-1;;;;;;45237:22:0;;;;;;:11;:22;;;;;:34;;;45202:69;45197:112;;;-1:-1:-1;45296:1:0;45289:8;;45197:112;-1:-1:-1;;;;;45340:22:0;;;;;;:11;:22;;;;;:38;;;;;;:223;;-1:-1:-1;;;;;45433:19:0;;;;;;:11;:19;;;;;:35;;;;;;:130;;35686:6;45533:11;;45524:6;:20;;;;:::i;:::-;45523:40;;;;:::i;:::-;45340:223;;45433:130;35686:6;45481;;45472;:15;;;;:::i;45340:223::-;35686:6;45391:7;;45382:6;:16;;;;:::i;:::-;45381:36;;;;:::i;37953:114::-;28630:5;;-1:-1:-1;;;;;28630:5:0;28616:10;:19;28608:51;;;;-1:-1:-1;;;28608:51:0;;;;;;;:::i;:::-;38031:12:::1;:28:::0;;-1:-1:-1;;;;;;38031:28:0::1;-1:-1:-1::0;;;;;38031:28:0;;;::::1;::::0;;;::::1;::::0;;37953:114::o;32765:449::-;32997:45;;;-1:-1:-1;;;;;14012:32:1;;;32997:45:0;;;13994:51:1;14061:18;;;;14054:34;;;32997:45:0;;;;;;;;;;13967:18:1;;;;32997:45:0;;;;;;;-1:-1:-1;;;;;32997:45:0;-1:-1:-1;;;32997:45:0;;;32986:57;;-1:-1:-1;;;;32986:10:0;;;;:57;;32997:45;32986:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32950:93;;;;33076:7;:57;;;;-1:-1:-1;33088:11:0;;:16;;:44;;;33119:4;33108:24;;;;;;;;;;;;:::i;:::-;33054:152;;;;-1:-1:-1;;;33054:152:0;;17084:2:1;33054:152:0;;;17066:21:1;17123:2;17103:18;;;17096:30;17162:34;17142:18;;;17135:62;-1:-1:-1;;;17213:18:1;;;17206:43;17266:19;;33054:152:0;16882:409:1;33054:152:0;32872:342;;32765:449;;;:::o;43195:1886::-;43287:4;-1:-1:-1;;;;;43326:20:0;;43304:81;;;;-1:-1:-1;;;43304:81:0;;17498:2:1;43304:81:0;;;17480:21:1;17537:2;17517:18;;;17510:30;-1:-1:-1;;;17556:18:1;;;17549:41;17607:18;;43304:81:0;17296:335:1;43304:81:0;-1:-1:-1;;;;;43418:23:0;;43396:87;;;;-1:-1:-1;;;43396:87:0;;12520:2:1;43396:87:0;;;12502:21:1;12559:2;12539:18;;;12532:30;-1:-1:-1;;;12578:18:1;;;12571:44;12632:18;;43396:87:0;12318:338:1;43396:87:0;43525:1;43516:6;:10;43494:71;;;;-1:-1:-1;;;43494:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43598:17:0;;;;;;:9;:17;;;;;;:27;-1:-1:-1;43598:27:0;43576:97;;;;-1:-1:-1;;;43576:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43731:17:0;;;;;;:9;:17;;;;;:27;;43752:6;;43731:17;:27;;43752:6;;43731:27;:::i;:::-;;;;-1:-1:-1;43804:11:0;;-1:-1:-1;43819:33:0;43826:6;43834:9;43845:6;43819;:33::i;:::-;43803:49;-1:-1:-1;43911:18:0;43932:12;43803:49;43932:6;:12;:::i;:::-;43911:33;;43976:1;43963:10;:14;43955:38;;;;-1:-1:-1;;;43955:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44060:20:0;;;;;;;:9;:20;;;;;;;:34;;;;;;44121:39;44060:20;;44121:39;;;-1:-1:-1;;;;;;;;;;;44121:39:0;;;44084:10;2965:25:1;;2953:2;2938:18;;2819:177;44121:39:0;;;;;;;;44209:7;;44205:813;;44303:12;;44279:21;;-1:-1:-1;;;;;44303:12:0;:26;;;;:59;;-1:-1:-1;44333:12:0;;-1:-1:-1;;;;;44333:12:0;44357:4;44333:29;;44303:59;44279:83;;44424:21;44448:16;:47;;44490:4;44448:47;;;44467:12;;-1:-1:-1;;;;;44467:12:0;44448:47;-1:-1:-1;;;;;44570:24:0;;;;;;;:9;:24;;;;;;;:31;;;;;;44636:36;44424:71;;-1:-1:-1;44570:24:0;44636:36;;;;-1:-1:-1;;;;;;;;;;;44636:36:0;;;44598:3;2965:25:1;;2953:2;2938:18;;2819:177;44636:36:0;;;;;;;;44774:11;;-1:-1:-1;;;44774:11:0;;;;:31;;;;;44789:16;44774:31;44770:237;;;44925:18;;;;;;;;;;;-1:-1:-1;;;44925:18:0;;;;;44885:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;44885:61:0;-1:-1:-1;;;44885:61:0;;;44844:121;;44827:12;;-1:-1:-1;;;;;44844:18:0;;;:121;;44885:61;44844:121;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;44770:237:0;44218:800;;44205:813;-1:-1:-1;45069:4:0;;43195:1886;-1:-1:-1;;;;;43195:1886:0:o;33728:217::-;33841:12;;;33801;33841;;;;;;;;;-1:-1:-1;;;;;33819:7:0;;;33834:5;;33819:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33800:54;;;33873:7;33865:72;;;;-1:-1:-1;;;33865:72:0;;17970:2:1;33865:72:0;;;17952:21:1;18009:2;17989:18;;;17982:30;18048:34;18028:18;;;18021:62;-1:-1:-1;;;18099:18:1;;;18092:50;18159:19;;33865:72:0;17768:416:1;46593:768:0;46833:11;46817:29;;;;;;:::i;:::-;;;;;;;;46799:12;;46783:30;;;;;;;:::i;:::-;;;;;;;;:63;46761:133;;;;-1:-1:-1;;;46761:133:0;;19240:2:1;46761:133:0;;;19222:21:1;19279:2;19259:18;;;19252:30;-1:-1:-1;;;19298:18:1;;;19291:50;19358:18;;46761:133:0;19038:344:1;46761:133:0;46979:13;46963:31;;;;;;:::i;:::-;;;;;;;;46943:14;;46927:32;;;;;;;:::i;:::-;;;;;;;;:67;46905:139;;;;-1:-1:-1;;;46905:139:0;;19589:2:1;46905:139:0;;;19571:21:1;19628:2;19608:18;;;19601:30;-1:-1:-1;;;19647:18:1;;;19640:52;19709:18;;46905:139:0;19387:346:1;46905:139:0;47077:15;;-1:-1:-1;;;47077:15:0;;;;:24;47055:90;;;;-1:-1:-1;;;47055:90:0;;13677:2:1;47055:90:0;;;13659:21:1;13716:2;13696:18;;;13689:30;-1:-1:-1;;;13735:18:1;;;13728:46;13791:18;;47055:90:0;13475:340:1;47055:90:0;47220:10;;47250:40;;;;47261:8;47250:40;:::i;:::-;47219:71;;;;47336:17;47342:2;47346:6;47336:5;:17::i;45579:475::-;-1:-1:-1;;;;;45669:21:0;;45647:83;;;;-1:-1:-1;;;45647:83:0;;20268:2:1;45647:83:0;;;20250:21:1;20307:2;20287:18;;;20280:30;-1:-1:-1;;;20326:18:1;;;20319:42;20378:18;;45647:83:0;20066:336:1;45647:83:0;45772:1;45763:6;:10;45741:71;;;;-1:-1:-1;;;45741:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45855:18:0;;;;;;:9;:18;;;;;;45845:28;;;45823:98;;;;-1:-1:-1;;;45823:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45932:18:0;;;;;;:9;:18;;;;;:28;;45954:6;;45932:18;:28;;45954:6;;45932:28;:::i;:::-;;;;;;;;45987:6;45971:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;46009:37:0;;2965:25:1;;;46035:1:0;;-1:-1:-1;;;;;46009:37:0;;;-1:-1:-1;;;;;;;;;;;46009:37:0;2953:2:1;2938:18;46009:37:0;;;;;;;;45579:475;;:::o;46062:523::-;-1:-1:-1;;;;;46152:21:0;;46130:83;;;;-1:-1:-1;;;46130:83:0;;20268:2:1;46130:83:0;;;20250:21:1;20307:2;20287:18;;;20280:30;-1:-1:-1;;;20326:18:1;;;20319:42;20378:18;;46130:83:0;20066:336:1;46130:83:0;46255:1;46246:6;:10;46224:71;;;;-1:-1:-1;;;46224:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46331:18:0;;;;;;:9;:18;;;;;:28;;;;;;-1:-1:-1;46374:22:0;;;;;;;;46456:16;;-1:-1:-1;46440:32:0;46418:106;;;;-1:-1:-1;;;46418:106:0;;20609:2:1;46418:106:0;;;20591:21:1;20648:2;20628:18;;;20621:30;20687:26;20667:18;;;20660:54;20731:18;;46418:106:0;20407:348:1;46418:106:0;46540:37;;2965:25:1;;;-1:-1:-1;;;;;46540:37:0;;;46557:1;;-1:-1:-1;;;;;;;;;;;46540:37:0;2953:2:1;2938:18;46540:37:0;2819:177:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:247::-;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;675:456::-;752:6;760;768;821:2;809:9;800:7;796:23;792:32;789:52;;;837:1;834;827:12;789:52;876:9;863:23;895:31;920:5;895:31;:::i;:::-;945:5;-1:-1:-1;1002:2:1;987:18;;974:32;1015:33;974:32;1015:33;:::i;:::-;675:456;;1067:7;;-1:-1:-1;;;1121:2:1;1106:18;;;;1093:32;;675:456::o;1136:250::-;1221:1;1231:113;1245:6;1242:1;1239:13;1231:113;;;1321:11;;;1315:18;1302:11;;;1295:39;1267:2;1260:10;1231:113;;;-1:-1:-1;;1378:1:1;1360:16;;1353:27;1136:250::o;1391:271::-;1433:3;1471:5;1465:12;1498:6;1493:3;1486:19;1514:76;1583:6;1576:4;1571:3;1567:14;1560:4;1553:5;1549:16;1514:76;:::i;:::-;1644:2;1623:15;-1:-1:-1;;1619:29:1;1610:39;;;;1651:4;1606:50;;1391:271;-1:-1:-1;;1391:271:1:o;1667:220::-;1816:2;1805:9;1798:21;1779:4;1836:45;1877:2;1866:9;1862:18;1854:6;1836:45;:::i;1892:315::-;1960:6;1968;2021:2;2009:9;2000:7;1996:23;1992:32;1989:52;;;2037:1;2034;2027:12;1989:52;2076:9;2063:23;2095:31;2120:5;2095:31;:::i;:::-;2145:5;2197:2;2182:18;;;;2169:32;;-1:-1:-1;;;1892:315:1:o;2404:180::-;2463:6;2516:2;2504:9;2495:7;2491:23;2487:32;2484:52;;;2532:1;2529;2522:12;2484:52;-1:-1:-1;2555:23:1;;2404:180;-1:-1:-1;2404:180:1:o;3001:348::-;3053:8;3063:6;3117:3;3110:4;3102:6;3098:17;3094:27;3084:55;;3135:1;3132;3125:12;3084:55;-1:-1:-1;3158:20:1;;3201:18;3190:30;;3187:50;;;3233:1;3230;3223:12;3187:50;3270:4;3262:6;3258:17;3246:29;;3322:3;3315:4;3306:6;3298;3294:19;3290:30;3287:39;3284:59;;;3339:1;3336;3329:12;3284:59;3001:348;;;;;:::o;3354:1437::-;3505:6;3513;3521;3529;3537;3545;3553;3561;3569;3577;3630:3;3618:9;3609:7;3605:23;3601:33;3598:53;;;3647:1;3644;3637:12;3598:53;3683:9;3670:23;3660:33;;3744:2;3733:9;3729:18;3716:32;3767:18;3808:2;3800:6;3797:14;3794:34;;;3824:1;3821;3814:12;3794:34;3863:59;3914:7;3905:6;3894:9;3890:22;3863:59;:::i;:::-;3941:8;;-1:-1:-1;3837:85:1;-1:-1:-1;4029:2:1;4014:18;;4001:32;;-1:-1:-1;4045:16:1;;;4042:36;;;4074:1;4071;4064:12;4042:36;4113:61;4166:7;4155:8;4144:9;4140:24;4113:61;:::i;:::-;4193:8;;-1:-1:-1;4087:87:1;-1:-1:-1;4281:2:1;4266:18;;4253:32;;-1:-1:-1;4297:16:1;;;4294:36;;;4326:1;4323;4316:12;4294:36;4365:61;4418:7;4407:8;4396:9;4392:24;4365:61;:::i;:::-;4445:8;;-1:-1:-1;4339:87:1;-1:-1:-1;4533:3:1;4518:19;;4505:33;;-1:-1:-1;4550:16:1;;;4547:36;;;4579:1;4576;4569:12;4547:36;;4618:61;4671:7;4660:8;4649:9;4645:24;4618:61;:::i;:::-;4592:87;;4698:8;4688:18;;;4725:8;4715:18;;;4780:3;4769:9;4765:19;4752:33;4742:43;;3354:1437;;;;;;;;;;;;;:::o;5193:1078::-;5314:6;5322;5330;5338;5346;5354;5362;5415:3;5403:9;5394:7;5390:23;5386:33;5383:53;;;5432:1;5429;5422:12;5383:53;5468:9;5455:23;5445:33;;5529:2;5518:9;5514:18;5501:32;5552:18;5593:2;5585:6;5582:14;5579:34;;;5609:1;5606;5599:12;5579:34;5648:59;5699:7;5690:6;5679:9;5675:22;5648:59;:::i;:::-;5726:8;;-1:-1:-1;5622:85:1;-1:-1:-1;5814:2:1;5799:18;;5786:32;;-1:-1:-1;5830:16:1;;;5827:36;;;5859:1;5856;5849:12;5827:36;5898:61;5951:7;5940:8;5929:9;5925:24;5898:61;:::i;:::-;5978:8;;-1:-1:-1;5872:87:1;-1:-1:-1;6066:2:1;6051:18;;6038:32;;-1:-1:-1;6082:16:1;;;6079:36;;;6111:1;6108;6101:12;6079:36;;6150:61;6203:7;6192:8;6181:9;6177:24;6150:61;:::i;:::-;5193:1078;;;;-1:-1:-1;5193:1078:1;;-1:-1:-1;5193:1078:1;;;;6124:87;;-1:-1:-1;;;5193:1078:1:o;6276:383::-;6353:6;6361;6369;6422:2;6410:9;6401:7;6397:23;6393:32;6390:52;;;6438:1;6435;6428:12;6390:52;6474:9;6461:23;6451:33;;6531:2;6520:9;6516:18;6503:32;6493:42;;6585:2;6574:9;6570:18;6557:32;6598:31;6623:5;6598:31;:::i;:::-;6648:5;6638:15;;;6276:383;;;;;:::o;6897:118::-;6983:5;6976:13;6969:21;6962:5;6959:32;6949:60;;7005:1;7002;6995:12;7020:382;7085:6;7093;7146:2;7134:9;7125:7;7121:23;7117:32;7114:52;;;7162:1;7159;7152:12;7114:52;7201:9;7188:23;7220:31;7245:5;7220:31;:::i;:::-;7270:5;-1:-1:-1;7327:2:1;7312:18;;7299:32;7340:30;7299:32;7340:30;:::i;:::-;7389:7;7379:17;;;7020:382;;;;;:::o;7407:241::-;7463:6;7516:2;7504:9;7495:7;7491:23;7487:32;7484:52;;;7532:1;7529;7522:12;7484:52;7571:9;7558:23;7590:28;7612:5;7590:28;:::i;7653:388::-;7721:6;7729;7782:2;7770:9;7761:7;7757:23;7753:32;7750:52;;;7798:1;7795;7788:12;7750:52;7837:9;7824:23;7856:31;7881:5;7856:31;:::i;:::-;7906:5;-1:-1:-1;7963:2:1;7948:18;;7935:32;7976:33;7935:32;7976:33;:::i;8046:343::-;8248:2;8230:21;;;8287:2;8267:18;;;8260:30;-1:-1:-1;;;8321:2:1;8306:18;;8299:49;8380:2;8365:18;;8046:343::o;8394:380::-;8473:1;8469:12;;;;8516;;;8537:61;;8591:4;8583:6;8579:17;8569:27;;8537:61;8644:2;8636:6;8633:14;8613:18;8610:38;8607:161;;8690:10;8685:3;8681:20;8678:1;8671:31;8725:4;8722:1;8715:15;8753:4;8750:1;8743:15;8607:161;;8394:380;;;:::o;8779:271::-;8962:6;8954;8949:3;8936:33;8918:3;8988:16;;9013:13;;;8988:16;8779:271;-1:-1:-1;8779:271:1:o;9055:267::-;9144:6;9139:3;9132:19;9196:6;9189:5;9182:4;9177:3;9173:14;9160:43;-1:-1:-1;9248:1:1;9223:16;;;9241:4;9219:27;;;9212:38;;;;9304:2;9283:15;;;-1:-1:-1;;9279:29:1;9270:39;;;9266:50;;9055:267::o;9327:844::-;9686:6;9675:9;9668:25;9729:3;9724:2;9713:9;9709:18;9702:31;9649:4;9756:63;9814:3;9803:9;9799:19;9791:6;9783;9756:63;:::i;:::-;9867:9;9859:6;9855:22;9850:2;9839:9;9835:18;9828:50;9901;9944:6;9936;9928;9901:50;:::i;:::-;9887:64;;9987:6;9982:2;9971:9;9967:18;9960:34;10043:9;10035:6;10031:22;10025:3;10014:9;10010:19;10003:51;10071:50;10114:6;10106;10098;10071:50;:::i;:::-;10063:58;;;10158:6;10152:3;10141:9;10137:19;10130:35;9327:844;;;;;;;;;;;;:::o;10176:245::-;10243:6;10296:2;10284:9;10275:7;10271:23;10267:32;10264:52;;;10312:1;10309;10302:12;10264:52;10344:9;10338:16;10363:28;10385:5;10363:28;:::i;10777:127::-;10838:10;10833:3;10829:20;10826:1;10819:31;10869:4;10866:1;10859:15;10893:4;10890:1;10883:15;10909:128;10976:9;;;10997:11;;;10994:37;;;11011:18;;:::i;11042:581::-;11315:6;11304:9;11297:25;11358:3;11353:2;11342:9;11338:18;11331:31;11278:4;11385:63;11443:3;11432:9;11428:19;11420:6;11412;11385:63;:::i;:::-;11496:9;11488:6;11484:22;11479:2;11468:9;11464:18;11457:50;11524;11567:6;11559;11551;11524:50;:::i;:::-;11516:58;;;11610:6;11605:2;11594:9;11590:18;11583:34;11042:581;;;;;;;;;:::o;11978:335::-;12180:2;12162:21;;;12219:2;12199:18;;;12192:30;-1:-1:-1;;;12253:2:1;12238:18;;12231:41;12304:2;12289:18;;11978:335::o;12661:125::-;12726:9;;;12747:10;;;12744:36;;;12760:18;;:::i;13126:344::-;13328:2;13310:21;;;13367:2;13347:18;;;13340:30;-1:-1:-1;;;13401:2:1;13386:18;;13379:50;13461:2;13446:18;;13126:344::o;14099:772::-;14149:3;14190:5;14184:12;14219:36;14245:9;14219:36;:::i;:::-;14264:19;;;14302:4;14325:1;14342:18;;;14369:146;;;;14529:1;14524:341;;;;14335:530;;14369:146;-1:-1:-1;;14411:24:1;;14397:12;;;14390:46;14483:14;;14476:22;14473:1;14469:30;14460:40;;14456:49;;;-1:-1:-1;14369:146:1;;14524:341;14555:5;14552:1;14545:16;14602:2;14599:1;14589:16;14627:1;14641:174;14655:6;14652:1;14649:13;14641:174;;;14742:14;;14724:11;;;14720:20;;14713:44;14785:16;;;;14670:10;;14641:174;;;14839:11;;14835:20;;;-1:-1:-1;;14335:530:1;;;;;;14099:772;;;;:::o;14876:755::-;15132:4;15178:1;15174;15169:3;15165:11;15161:19;15219:2;15211:6;15207:15;15196:9;15189:34;15259:3;15254:2;15243:9;15239:18;15232:31;15286:54;15335:3;15324:9;15320:19;15312:6;15286:54;:::i;:::-;15388:9;15380:6;15376:22;15371:2;15360:9;15356:18;15349:50;15422:41;15456:6;15448;15422:41;:::i;:::-;15408:55;;15511:9;15503:6;15499:22;15494:2;15483:9;15479:18;15472:50;15539:33;15565:6;15557;15539:33;:::i;:::-;15531:41;;;15621:2;15613:6;15609:15;15603:3;15592:9;15588:19;15581:44;;14876:755;;;;;;;;:::o;15636:554::-;15873:2;15862:9;15855:21;15836:4;15899:53;15948:2;15937:9;15933:18;15925:6;15899:53;:::i;:::-;16000:9;15992:6;15988:22;15983:2;15972:9;15968:18;15961:50;16034:41;16068:6;16060;16034:41;:::i;:::-;16020:55;;16123:9;16115:6;16111:22;16106:2;16095:9;16091:18;16084:50;16151:33;16177:6;16169;16151:33;:::i;:::-;16143:41;15636:554;-1:-1:-1;;;;;;15636:554:1:o;16195:168::-;16268:9;;;16299;;16316:15;;;16310:22;;16296:37;16286:71;;16337:18;;:::i;16368:217::-;16408:1;16434;16424:132;;16478:10;16473:3;16469:20;16466:1;16459:31;16513:4;16510:1;16503:15;16541:4;16538:1;16531:15;16424:132;-1:-1:-1;16570:9:1;;16368:217::o;16590:287::-;16719:3;16757:6;16751:13;16773:66;16832:6;16827:3;16820:4;16812:6;16808:17;16773:66;:::i;:::-;16855:16;;;;;16590:287;-1:-1:-1;;16590:287:1:o;18189:844::-;18319:3;18348:1;18381:6;18375:13;18411:36;18437:9;18411:36;:::i;:::-;18466:1;18483:18;;;18510:133;;;;18657:1;18652:356;;;;18476:532;;18510:133;-1:-1:-1;;18543:24:1;;18531:37;;18616:14;;18609:22;18597:35;;18588:45;;;-1:-1:-1;18510:133:1;;18652:356;18683:6;18680:1;18673:17;18713:4;18758:2;18755:1;18745:16;18783:1;18797:165;18811:6;18808:1;18805:13;18797:165;;;18889:14;;18876:11;;;18869:35;18932:16;;;;18826:10;;18797:165;;;18801:3;;;18991:6;18986:3;18982:16;18975:23;;18476:532;-1:-1:-1;19024:3:1;;18189:844;-1:-1:-1;;;;;;18189:844:1:o
Swarm Source
ipfs://cd00dad9b63dda306c15547cddf961de6ebea9d1a66cf255bd7690d86d6056ba
Loading...
Loading
Loading...
Loading
[ 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.