Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13627301 | 1033 days ago | IN | 0 ETH | 0.42435448 |
Loading...
Loading
Contract Name:
Vault
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; contract Vault is IERC20, ReentrancyGuard, Ownable { using Math for uint256; using SafeERC20 for ERC20; event EmergencyShutdown(bool active); event SwapInProcessed(address indexed sender, uint256 amount, uint256 fee); event SwapOutProcessed(address indexed sender, uint256 amount); event RefundProcessed(address indexed sender, uint256 amount, uint256 fee); string public name; string public symbol; uint8 public decimals; uint256 public override totalSupply; // total USD amount of LP providers, decimals = 18 uint256 public totalTokens; // treasury amount stored in contract, decimals = 6 uint256 public treasuryAmount; // minimum swapin amount uint256 private _minAmountForSwap; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; bool public emergencyShutdown; ERC20 public token; address public bridge; // 50% of the fee to LP providers, 50% goes to treasury uint256 public lpFee = 5_000; uint256 constant BASIS_POINT = 10_000; uint256 public txFee; modifier onlyBridge() { require(msg.sender == bridge); _; } modifier notLocked() { require(!emergencyShutdown, "Vault is locked out"); _; } constructor( string memory _name, string memory _symbol, address _token, address _bridge, uint256 _minAmount, uint256 _txFee ) { require(_bridge != address(0)); name = _name; symbol = _symbol; decimals = 18; token = ERC20(_token); bridge = _bridge; _minAmountForSwap = _minAmount; txFee = _txFee; } /// @notice Deposit USD token and get LP tokens in exchange /// @param _amount Amount of token user wants to deposit /// @param _recipient the address that receives LP tokens function deposit(uint256 _amount, address _recipient) public nonReentrant notLocked returns (uint256) { require(_recipient != address(0)); require(_recipient != address(this)); uint256 amount = _amount; // If _amount not specified, transfer the full token balance, // up to deposit limit if (amount == type(uint256).max) amount = token.balanceOf(msg.sender); // sanity check require(amount <= token.balanceOf(msg.sender) && amount <= token.allowance(msg.sender, address(this)), "Balance or allowance not sufficient"); // Ensure we are depositing something require(amount > 0); // Issue new shares (needs to be done before taking deposit to be accurate) // Shares are issued to recipient (may be different from msg.sender) // See @dev note, above. uint256 shares = _issueSharesForAmount(_recipient, amount); // Tokens are transferred from msg.sender (may be different from _recipient) token.safeTransferFrom(msg.sender, address(this), amount); return shares; // Just in case someone wants them } /// @notice Withdraw USD tokens and burn LP tokens /// @param _amount Amount of LP token user wants to withdraw /// @param _recipient the address that receives USD tokens function withdraw(uint256 _amount, address _recipient) external nonReentrant notLocked returns (uint256) { // If _shares not specified, transfer full share balance uint256 shares = _amount; if (_amount == type(uint256).max) { shares = _balances[msg.sender]; } // Limit to only the shares they own require(shares <= _balances[msg.sender], "Amount exceeds balance"); // Ensure we are withdrawing something require(shares > 0, "Nothing to withdraw"); uint256 tokensToTransfer = (shares * totalTokens) / totalSupply; totalSupply -= shares; _balances[msg.sender] -= shares; totalTokens -= tokensToTransfer; emit Transfer(msg.sender, address(0), shares); token.safeTransfer(_recipient, (tokensToTransfer * 10**token.decimals()) / (10**decimals)); return shares; } function _issueSharesForAmount(address to, uint256 amount) internal returns (uint256) { // Issues `amount` Vault shares to `to`. // Shares must be issued prior to taking on new collateral, or // calculation will be wrong. This means that only *trusted* tokens // (with no capability for exploitative behavior) can be used. uint256 _amount = 0; _amount = (amount * (10**decimals)) / 10**token.decimals(); require(_amount != 0); // dev: division rounding resulted in zero uint256 newSupply = _amount; // maybe small amount than amount if (totalSupply > 0) { newSupply = (newSupply * totalSupply) / totalTokens; } // Mint new shares totalSupply += newSupply; totalTokens += _amount; _balances[to] += newSupply; emit Transfer(address(0), to, newSupply); return newSupply; } function _totalAssets() internal view returns (uint256) { // See note on `totalAssets()`. return token.balanceOf(address(this)); } /// @notice Returns the total quantity of all assets under control of this /// Vault, whether they're loaned out to a Strategy, or currently held in /// the Vault. /// @return The total assets under control of this Vault. function totalAssets() external view returns (uint256) { return _totalAssets(); } /// @notice Returns the min amount for swapping, default is 0 /// @return minimum token amount for swap function minAmountForSwap() external view returns (uint256) { return _minAmountForSwap; } /// @notice Set shutdown flag for emergency /// @param down Shutdown flag function setEmergencyShutdown(bool down) external onlyOwner { emergencyShutdown = down; emit EmergencyShutdown(down); } /// @notice Set minimum swap amount /// @param minAmount Minimum amount function setMinAmountForSwap(uint256 minAmount) external onlyOwner { _minAmountForSwap = minAmount; } /// @notice Set transaction fee /// @param _txFee Transaction fee in tokens function setTxFee(uint256 _txFee) external onlyOwner { txFee = _txFee; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function tokenAllocationOf(address account) public view returns (uint256) { return ((_balances[account] * totalTokens) * (10**token.decimals())) / 10**decimals / totalSupply; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /// @notice Called by bridge to transfer amount to destination user /// @param account the account to receive swapped amount /// @param amount the amount of tokens the user will receive function swapOut(address account, uint256 amount) external onlyBridge notLocked returns (bool) { require(amount <= token.balanceOf(address(this)), "Transfer amount exceeds vault balance"); token.safeTransfer(account, amount); emit SwapOutProcessed(account, amount); return true; } /// @notice Starts swapIn process /// @param account the account to receive on destination chain /// @param amount the amount user wants to send for swap(including fee) /// @param fee the fee amount needed for swap process function swapIn( address account, uint256 amount, uint256 fee ) external notLocked { require(amount >= _minAmountForSwap, "Should be bigger than minimum amount"); require(fee >= txFee, "Fee should be greater than tx fee"); token.safeTransferFrom(msg.sender, address(this), amount); uint256 redistribution = ((fee - txFee) * lpFee) / BASIS_POINT; totalTokens += (redistribution * (10**decimals)) / 10**token.decimals(); treasuryAmount += fee - redistribution; emit SwapInProcessed(account, amount, fee); } /// @notice Refund the amount waiting for swap /// @param account the account to receive on destination chain /// @param amount the amount user wanted to send for swap(including fee) /// @param fee the last fee amount that will be refunded /// @param gasFee the amount will be consumed for refund transaction function refund( address account, uint256 amount, uint256 fee, uint256 gasFee ) external onlyBridge notLocked { token.safeTransfer(account, amount); uint256 redistribution = ((fee - txFee) * lpFee) / BASIS_POINT; totalTokens -= (redistribution * (10**decimals)) / 10**token.decimals(); treasuryAmount -= fee - redistribution; treasuryAmount += gasFee; emit RefundProcessed(account, amount, fee); } function withdrawTreasury() external onlyOwner { require(treasuryAmount > 0, "Nothing to withdraw"); uint256 amount = treasuryAmount; treasuryAmount = 0; token.safeTransfer(msg.sender, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute. return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"uint256","name":"_txFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"EmergencyShutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"RefundProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SwapInProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapOutProcessed","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountForSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"gasFee","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"down","type":"bool"}],"name":"setEmergencyShutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setMinAmountForSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txFee","type":"uint256"}],"name":"setTxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"swapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokenAllocationOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","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":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052611388600d553480156200001757600080fd5b50604051620046ba380380620046ba83398181016040528101906200003d9190620003a8565b600160008190555062000065620000596200018a60201b60201c565b6200019260201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620000a057600080fd5b8560029080519060200190620000b892919062000258565b508460039080519060200190620000d192919062000258565b506012600460006101000a81548160ff021916908360ff16021790555083600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160088190555080600e8190555050505050505062000613565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000266906200054b565b90600052602060002090601f0160209004810192826200028a5760008555620002d6565b82601f10620002a557805160ff1916838001178555620002d6565b82800160010185558215620002d6579182015b82811115620002d5578251825591602001919060010190620002b8565b5b509050620002e59190620002e9565b5090565b5b8082111562000304576000816000905550600101620002ea565b5090565b60006200031f6200031984620004a4565b62000470565b9050828152602081018484840111156200033857600080fd5b6200034584828562000515565b509392505050565b6000815190506200035e81620005df565b92915050565b600082601f8301126200037657600080fd5b81516200038884826020860162000308565b91505092915050565b600081519050620003a281620005f9565b92915050565b60008060008060008060c08789031215620003c257600080fd5b600087015167ffffffffffffffff811115620003dd57600080fd5b620003eb89828a0162000364565b965050602087015167ffffffffffffffff8111156200040957600080fd5b6200041789828a0162000364565b95505060406200042a89828a016200034d565b94505060606200043d89828a016200034d565b93505060806200045089828a0162000391565b92505060a06200046389828a0162000391565b9150509295509295509295565b6000604051905081810181811067ffffffffffffffff821117156200049a5762000499620005b0565b5b8060405250919050565b600067ffffffffffffffff821115620004c257620004c1620005b0565b5b601f19601f8301169050602081019050919050565b6000620004e482620004eb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200053557808201518184015260208101905062000518565b8381111562000545576000848401525b50505050565b600060028204905060018216806200056457607f821691505b602082108114156200057b576200057a62000581565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ea81620004d7565b8114620005f657600080fd5b50565b62000604816200050b565b81146200061057600080fd5b50565b61409780620006236000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636f1a366d1161011a578063a9059cbb116100ad578063e78cea921161007c578063e78cea92146105dd578063f05d16f7146105fb578063f2fde38b14610617578063f796f81914610633578063fc0c546a14610651576101fa565b8063a9059cbb14610543578063cf82046114610573578063dd62ed3e14610591578063e3638a6b146105c1576101fa565b80637e1c0c09116100e95780637e1c0c09146104b95780638da5cb5b146104d757806395d89b41146104f5578063a457c2d714610513576101fa565b80636f1a366d14610445578063704ce43e1461046157806370a082311461047f578063715018a6146104af576101fa565b806323b872dd11610192578063368acb0911610161578063368acb091461039757806339509351146103b5578063410411bd146103e55780636e553f6514610415576101fa565b806323b872dd1461030f578063268ebd591461033f578063313ce5671461035b5780633403c2fc14610379576101fa565b806310d974ae116101ce57806310d974ae1461029b57806314c64402146102cb578063166bab95146102e757806318160ddd146102f1576101fa565b8062f714ce146101ff57806301e1d1141461022f57806306fdde031461024d578063095ea7b31461026b575b600080fd5b61021960048036038101906102149190612fa4565b61066f565b6040516102269190613b65565b60405180910390f35b610237610a8d565b6040516102449190613b65565b60405180910390f35b610255610a9c565b60405161026291906138c3565b60405180910390f35b61028560048036038101906102809190612e12565b610b2a565b604051610292919061388d565b60405180910390f35b6102b560048036038101906102b09190612e12565b610b48565b6040516102c2919061388d565b60405180910390f35b6102e560048036038101906102e09190612f00565b610d86565b005b6102ef610e56565b005b6102f9610f76565b6040516103069190613b65565b60405180910390f35b61032960048036038101906103249190612dc3565b610f7c565b604051610336919061388d565b60405180910390f35b61035960048036038101906103549190612e9d565b611074565b005b610363611320565b6040516103709190613ba9565b60405180910390f35b610381611333565b60405161038e919061388d565b60405180910390f35b61039f611346565b6040516103ac9190613b65565b60405180910390f35b6103cf60048036038101906103ca9190612e12565b61134c565b6040516103dc919061388d565b60405180910390f35b6103ff60048036038101906103fa9190612d5e565b6113f8565b60405161040c9190613b65565b60405180910390f35b61042f600480360381019061042a9190612fa4565b611537565b60405161043c9190613b65565b60405180910390f35b61045f600480360381019061045a9190612e4e565b611947565b005b610469611c0b565b6040516104769190613b65565b60405180910390f35b61049960048036038101906104949190612d5e565b611c11565b6040516104a69190613b65565b60405180910390f35b6104b7611c5a565b005b6104c1611ce2565b6040516104ce9190613b65565b60405180910390f35b6104df611ce8565b6040516104ec91906137e9565b60405180910390f35b6104fd611d12565b60405161050a91906138c3565b60405180910390f35b61052d60048036038101906105289190612e12565b611da0565b60405161053a919061388d565b60405180910390f35b61055d60048036038101906105589190612e12565b611e8b565b60405161056a919061388d565b60405180910390f35b61057b611ea9565b6040516105889190613b65565b60405180910390f35b6105ab60048036038101906105a69190612d87565b611eaf565b6040516105b89190613b65565b60405180910390f35b6105db60048036038101906105d69190612f52565b611f36565b005b6105e5611fbc565b6040516105f291906137e9565b60405180910390f35b61061560048036038101906106109190612f52565b611fe2565b005b610631600480360381019061062c9190612d5e565b612068565b005b61063b612160565b6040516106489190613b65565b60405180910390f35b61065961216a565b60405161066691906138a8565b60405180910390f35b6000600260005414156106b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ae90613b05565b60405180910390fd5b6002600081905550600b60009054906101000a900460ff161561070f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070690613ac5565b60405180910390fd5b60008390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141561077f57600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f8906138e5565b60405180910390fd5b60008111610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083b90613925565b60405180910390fd5b6000600554600654836108579190613dee565b6108619190613c4c565b905081600560008282546108759190613e48565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108cb9190613e48565b9250508190555080600660008282546108e49190613e48565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109499190613b65565b60405180910390a3610a7a84600460009054906101000a900460ff16600a6109719190613cd0565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d957600080fd5b505afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a119190612fe0565b600a610a1d9190613cd0565b84610a289190613dee565b610a329190613c4c565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b8192505050600160008190555092915050565b6000610a97612216565b905090565b60028054610aa990613f28565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad590613f28565b8015610b225780601f10610af757610100808354040283529160200191610b22565b820191906000526020600020905b815481529060010190602001808311610b0557829003601f168201915b505050505081565b6000610b3e610b376122c8565b84846122d0565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba457600080fd5b600b60009054906101000a900460ff1615610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90613ac5565b60405180910390fd5b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c4f91906137e9565b60206040518083038186803b158015610c6757600080fd5b505afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190612f7b565b821115610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890613b25565b60405180910390fd5b610d2e8383600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff167f2b402c854188010746674a5c32efa7a3329482c07f52455babb9067c7c1dae3483604051610d749190613b65565b60405180910390a26001905092915050565b610d8e6122c8565b73ffffffffffffffffffffffffffffffffffffffff16610dac611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990613a45565b60405180910390fd5b80600b60006101000a81548160ff0219169083151502179055507fba40372a3a724dca3c57156128ef1e896724b65b37a17f190b1ad5de68f3a4f381604051610e4b919061388d565b60405180910390a150565b610e5e6122c8565b73ffffffffffffffffffffffffffffffffffffffff16610e7c611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990613a45565b60405180910390fd5b600060075411610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613925565b60405180910390fd5b600060075490506000600781905550610f733382600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b50565b60055481565b6000610f8984848461249b565b6000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610fd46122c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b90613a25565b60405180910390fd5b611068856110606122c8565b8584036122d0565b60019150509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ce57600080fd5b600b60009054906101000a900460ff161561111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590613ac5565b60405180910390fd5b61116b8484600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b6000612710600d54600e54856111819190613e48565b61118b9190613dee565b6111959190613c4c565b9050600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112379190612fe0565b600a6112439190613cd0565b600460009054906101000a900460ff16600a61125f9190613cd0565b8261126a9190613dee565b6112749190613c4c565b600660008282546112859190613e48565b9250508190555080836112989190613e48565b600760008282546112a99190613e48565b9250508190555081600760008282546112c29190613bf6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff167fa5411d116afcb8415f0019792cccf595f94852ba82886dacbf756d9c3ce85f3f8585604051611311929190613b80565b60405180910390a25050505050565b600460009054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b60075481565b60006113ee6113596122c8565b8484600a60006113676122c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e99190613bf6565b6122d0565b6001905092915050565b6000600554600460009054906101000a900460ff16600a6114199190613cd0565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561148157600080fd5b505afa158015611495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b99190612fe0565b600a6114c59190613cd0565b600654600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115129190613dee565b61151c9190613dee565b6115269190613c4c565b6115309190613c4c565b9050919050565b60006002600054141561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613b05565b60405180910390fd5b6002600081905550600b60009054906101000a900460ff16156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613ac5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561164a57600080fd5b60008390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141561172557600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116d291906137e9565b60206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117229190612f7b565b90505b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161178091906137e9565b60206040518083038186803b15801561179857600080fd5b505afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d09190612f7b565b811115801561188b5750600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611837929190613804565b60206040518083038186803b15801561184f57600080fd5b505afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190612f7b565b8111155b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c1906139c5565b60405180910390fd5b600081116118d757600080fd5b60006118e38483612709565b9050611934333084600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612924909392919063ffffffff16565b8092505050600160008190555092915050565b600b60009054906101000a900460ff1615611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90613ac5565b60405180910390fd5b6008548210156119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d3906139e5565b60405180910390fd5b600e54811015611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890613a05565b60405180910390fd5b611a70333084600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612924909392919063ffffffff16565b6000612710600d54600e5484611a869190613e48565b611a909190613dee565b611a9a9190613c4c565b9050600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0457600080fd5b505afa158015611b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3c9190612fe0565b600a611b489190613cd0565b600460009054906101000a900460ff16600a611b649190613cd0565b82611b6f9190613dee565b611b799190613c4c565b60066000828254611b8a9190613bf6565b925050819055508082611b9d9190613e48565b60076000828254611bae9190613bf6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167f4c2a98579e0c6c68e3033ac75a042c9b1d0310896e7544f85690637a6e57fab78484604051611bfd929190613b80565b60405180910390a250505050565b600d5481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c626122c8565b73ffffffffffffffffffffffffffffffffffffffff16611c80611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90613a45565b60405180910390fd5b611ce060006129ad565b565b60065481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60038054611d1f90613f28565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4b90613f28565b8015611d985780601f10611d6d57610100808354040283529160200191611d98565b820191906000526020600020905b815481529060010190602001808311611d7b57829003601f168201915b505050505081565b600080600a6000611daf6122c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390613b45565b60405180910390fd5b611e80611e776122c8565b858584036122d0565b600191505092915050565b6000611e9f611e986122c8565b848461249b565b6001905092915050565b600e5481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611f3e6122c8565b73ffffffffffffffffffffffffffffffffffffffff16611f5c611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990613a45565b60405180910390fd5b8060088190555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611fea6122c8565b73ffffffffffffffffffffffffffffffffffffffff16612008611ce8565b73ffffffffffffffffffffffffffffffffffffffff161461205e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205590613a45565b60405180910390fd5b80600e8190555050565b6120706122c8565b73ffffffffffffffffffffffffffffffffffffffff1661208e611ce8565b73ffffffffffffffffffffffffffffffffffffffff16146120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90613a45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90613945565b60405180910390fd5b61215d816129ad565b50565b6000600854905090565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122118363a9059cbb60e01b84846040516024016121af929190613864565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a73565b505050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161227391906137e9565b60206040518083038186803b15801561228b57600080fd5b505afa15801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c39190612f7b565b905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233790613a85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790613965565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161248e9190613b65565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290613a65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561257b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257290613905565b60405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f990613985565b60405180910390fd5b818103600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126979190613bf6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126fb9190613b65565b60405180910390a350505050565b60008060009050600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561277857600080fd5b505afa15801561278c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b09190612fe0565b600a6127bc9190613cd0565b600460009054906101000a900460ff16600a6127d89190613cd0565b846127e39190613dee565b6127ed9190613c4c565b905060008114156127fd57600080fd5b60008190506000600554111561282b576006546005548261281e9190613dee565b6128289190613c4c565b90505b806005600082825461283d9190613bf6565b9250508190555081600660008282546128569190613bf6565b9250508190555080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ac9190613bf6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129119190613b65565b60405180910390a3809250505092915050565b6129a7846323b872dd60e01b8585856040516024016129459392919061382d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a73565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ad5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b3a9092919063ffffffff16565b9050600081511115612b355780806020019051810190612af59190612f29565b612b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2b90613ae5565b60405180910390fd5b5b505050565b6060612b498484600085612b52565b90509392505050565b606082471015612b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8e906139a5565b60405180910390fd5b612ba085612c66565b612bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd690613aa5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c0891906137d2565b60006040518083038185875af1925050503d8060008114612c45576040519150601f19603f3d011682016040523d82523d6000602084013e612c4a565b606091505b5091509150612c5a828286612c79565b92505050949350505050565b600080823b905060008111915050919050565b60608315612c8957829050612cd9565b600083511115612c9c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd091906138c3565b60405180910390fd5b9392505050565b600081359050612cef81614005565b92915050565b600081359050612d048161401c565b92915050565b600081519050612d198161401c565b92915050565b600081359050612d2e81614033565b92915050565b600081519050612d4381614033565b92915050565b600081519050612d588161404a565b92915050565b600060208284031215612d7057600080fd5b6000612d7e84828501612ce0565b91505092915050565b60008060408385031215612d9a57600080fd5b6000612da885828601612ce0565b9250506020612db985828601612ce0565b9150509250929050565b600080600060608486031215612dd857600080fd5b6000612de686828701612ce0565b9350506020612df786828701612ce0565b9250506040612e0886828701612d1f565b9150509250925092565b60008060408385031215612e2557600080fd5b6000612e3385828601612ce0565b9250506020612e4485828601612d1f565b9150509250929050565b600080600060608486031215612e6357600080fd5b6000612e7186828701612ce0565b9350506020612e8286828701612d1f565b9250506040612e9386828701612d1f565b9150509250925092565b60008060008060808587031215612eb357600080fd5b6000612ec187828801612ce0565b9450506020612ed287828801612d1f565b9350506040612ee387828801612d1f565b9250506060612ef487828801612d1f565b91505092959194509250565b600060208284031215612f1257600080fd5b6000612f2084828501612cf5565b91505092915050565b600060208284031215612f3b57600080fd5b6000612f4984828501612d0a565b91505092915050565b600060208284031215612f6457600080fd5b6000612f7284828501612d1f565b91505092915050565b600060208284031215612f8d57600080fd5b6000612f9b84828501612d34565b91505092915050565b60008060408385031215612fb757600080fd5b6000612fc585828601612d1f565b9250506020612fd685828601612ce0565b9150509250929050565b600060208284031215612ff257600080fd5b600061300084828501612d49565b91505092915050565b61301281613e7c565b82525050565b61302181613e8e565b82525050565b600061303282613bc4565b61303c8185613bda565b935061304c818560208601613ef5565b80840191505092915050565b61306181613ed1565b82525050565b600061307282613bcf565b61307c8185613be5565b935061308c818560208601613ef5565b61309581613fe7565b840191505092915050565b60006130ad601683613be5565b91507f416d6f756e7420657863656564732062616c616e6365000000000000000000006000830152602082019050919050565b60006130ed602383613be5565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613153601383613be5565b91507f4e6f7468696e6720746f207769746864726177000000000000000000000000006000830152602082019050919050565b6000613193602683613be5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131f9602283613be5565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061325f602683613be5565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132c5602683613be5565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061332b602383613be5565b91507f42616c616e6365206f7220616c6c6f77616e6365206e6f74207375666669636960008301527f656e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613391602483613be5565b91507f53686f756c6420626520626967676572207468616e206d696e696d756d20616d60008301527f6f756e74000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f7602183613be5565b91507f4665652073686f756c642062652067726561746572207468616e20747820666560008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061345d602883613be5565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134c3602083613be5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613503602583613be5565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613569602483613be5565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135cf601d83613be5565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061360f601383613be5565b91507f5661756c74206973206c6f636b6564206f7574000000000000000000000000006000830152602082019050919050565b600061364f602a83613be5565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006136b5601f83613be5565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006136f5602583613be5565b91507f5472616e7366657220616d6f756e742065786365656473207661756c7420626160008301527f6c616e63650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061375b602583613be5565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6137bd81613eba565b82525050565b6137cc81613ec4565b82525050565b60006137de8284613027565b915081905092915050565b60006020820190506137fe6000830184613009565b92915050565b60006040820190506138196000830185613009565b6138266020830184613009565b9392505050565b60006060820190506138426000830186613009565b61384f6020830185613009565b61385c60408301846137b4565b949350505050565b60006040820190506138796000830185613009565b61388660208301846137b4565b9392505050565b60006020820190506138a26000830184613018565b92915050565b60006020820190506138bd6000830184613058565b92915050565b600060208201905081810360008301526138dd8184613067565b905092915050565b600060208201905081810360008301526138fe816130a0565b9050919050565b6000602082019050818103600083015261391e816130e0565b9050919050565b6000602082019050818103600083015261393e81613146565b9050919050565b6000602082019050818103600083015261395e81613186565b9050919050565b6000602082019050818103600083015261397e816131ec565b9050919050565b6000602082019050818103600083015261399e81613252565b9050919050565b600060208201905081810360008301526139be816132b8565b9050919050565b600060208201905081810360008301526139de8161331e565b9050919050565b600060208201905081810360008301526139fe81613384565b9050919050565b60006020820190508181036000830152613a1e816133ea565b9050919050565b60006020820190508181036000830152613a3e81613450565b9050919050565b60006020820190508181036000830152613a5e816134b6565b9050919050565b60006020820190508181036000830152613a7e816134f6565b9050919050565b60006020820190508181036000830152613a9e8161355c565b9050919050565b60006020820190508181036000830152613abe816135c2565b9050919050565b60006020820190508181036000830152613ade81613602565b9050919050565b60006020820190508181036000830152613afe81613642565b9050919050565b60006020820190508181036000830152613b1e816136a8565b9050919050565b60006020820190508181036000830152613b3e816136e8565b9050919050565b60006020820190508181036000830152613b5e8161374e565b9050919050565b6000602082019050613b7a60008301846137b4565b92915050565b6000604082019050613b9560008301856137b4565b613ba260208301846137b4565b9392505050565b6000602082019050613bbe60008301846137c3565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613c0182613eba565b9150613c0c83613eba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4157613c40613f5a565b5b828201905092915050565b6000613c5782613eba565b9150613c6283613eba565b925082613c7257613c71613f89565b5b828204905092915050565b6000808291508390505b6001851115613cc757808604811115613ca357613ca2613f5a565b5b6001851615613cb25780820291505b8081029050613cc085613ff8565b9450613c87565b94509492505050565b6000613cdb82613eba565b9150613ce683613ec4565b9250613d137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d1b565b905092915050565b600082613d2b5760019050613de7565b81613d395760009050613de7565b8160018114613d4f5760028114613d5957613d88565b6001915050613de7565b60ff841115613d6b57613d6a613f5a565b5b8360020a915084821115613d8257613d81613f5a565b5b50613de7565b5060208310610133831016604e8410600b8410161715613dbd5782820a905083811115613db857613db7613f5a565b5b613de7565b613dca8484846001613c7d565b92509050818404811115613de157613de0613f5a565b5b81810290505b9392505050565b6000613df982613eba565b9150613e0483613eba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3d57613e3c613f5a565b5b828202905092915050565b6000613e5382613eba565b9150613e5e83613eba565b925082821015613e7157613e70613f5a565b5b828203905092915050565b6000613e8782613e9a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613edc82613ee3565b9050919050565b6000613eee82613e9a565b9050919050565b60005b83811015613f13578082015181840152602081019050613ef8565b83811115613f22576000848401525b50505050565b60006002820490506001821680613f4057607f821691505b60208210811415613f5457613f53613fb8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b61400e81613e7c565b811461401957600080fd5b50565b61402581613e8e565b811461403057600080fd5b50565b61403c81613eba565b811461404757600080fd5b50565b61405381613ec4565b811461405e57600080fd5b5056fea26469706673582212201b1f1c0f8ba636b5467b326da96d80a07a52a00cfebd1c91759c95bbb381988864736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000642f645bf10e7f3fc81e1701c73e4dce44daa28000000000000000000000000098a8f350853a1451d7e961480c1fbfdac39f8efc0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000aae600000000000000000000000000000000000000000000000000000000000000007666f726d55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d466f726d6174696f6e2055534400000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636f1a366d1161011a578063a9059cbb116100ad578063e78cea921161007c578063e78cea92146105dd578063f05d16f7146105fb578063f2fde38b14610617578063f796f81914610633578063fc0c546a14610651576101fa565b8063a9059cbb14610543578063cf82046114610573578063dd62ed3e14610591578063e3638a6b146105c1576101fa565b80637e1c0c09116100e95780637e1c0c09146104b95780638da5cb5b146104d757806395d89b41146104f5578063a457c2d714610513576101fa565b80636f1a366d14610445578063704ce43e1461046157806370a082311461047f578063715018a6146104af576101fa565b806323b872dd11610192578063368acb0911610161578063368acb091461039757806339509351146103b5578063410411bd146103e55780636e553f6514610415576101fa565b806323b872dd1461030f578063268ebd591461033f578063313ce5671461035b5780633403c2fc14610379576101fa565b806310d974ae116101ce57806310d974ae1461029b57806314c64402146102cb578063166bab95146102e757806318160ddd146102f1576101fa565b8062f714ce146101ff57806301e1d1141461022f57806306fdde031461024d578063095ea7b31461026b575b600080fd5b61021960048036038101906102149190612fa4565b61066f565b6040516102269190613b65565b60405180910390f35b610237610a8d565b6040516102449190613b65565b60405180910390f35b610255610a9c565b60405161026291906138c3565b60405180910390f35b61028560048036038101906102809190612e12565b610b2a565b604051610292919061388d565b60405180910390f35b6102b560048036038101906102b09190612e12565b610b48565b6040516102c2919061388d565b60405180910390f35b6102e560048036038101906102e09190612f00565b610d86565b005b6102ef610e56565b005b6102f9610f76565b6040516103069190613b65565b60405180910390f35b61032960048036038101906103249190612dc3565b610f7c565b604051610336919061388d565b60405180910390f35b61035960048036038101906103549190612e9d565b611074565b005b610363611320565b6040516103709190613ba9565b60405180910390f35b610381611333565b60405161038e919061388d565b60405180910390f35b61039f611346565b6040516103ac9190613b65565b60405180910390f35b6103cf60048036038101906103ca9190612e12565b61134c565b6040516103dc919061388d565b60405180910390f35b6103ff60048036038101906103fa9190612d5e565b6113f8565b60405161040c9190613b65565b60405180910390f35b61042f600480360381019061042a9190612fa4565b611537565b60405161043c9190613b65565b60405180910390f35b61045f600480360381019061045a9190612e4e565b611947565b005b610469611c0b565b6040516104769190613b65565b60405180910390f35b61049960048036038101906104949190612d5e565b611c11565b6040516104a69190613b65565b60405180910390f35b6104b7611c5a565b005b6104c1611ce2565b6040516104ce9190613b65565b60405180910390f35b6104df611ce8565b6040516104ec91906137e9565b60405180910390f35b6104fd611d12565b60405161050a91906138c3565b60405180910390f35b61052d60048036038101906105289190612e12565b611da0565b60405161053a919061388d565b60405180910390f35b61055d60048036038101906105589190612e12565b611e8b565b60405161056a919061388d565b60405180910390f35b61057b611ea9565b6040516105889190613b65565b60405180910390f35b6105ab60048036038101906105a69190612d87565b611eaf565b6040516105b89190613b65565b60405180910390f35b6105db60048036038101906105d69190612f52565b611f36565b005b6105e5611fbc565b6040516105f291906137e9565b60405180910390f35b61061560048036038101906106109190612f52565b611fe2565b005b610631600480360381019061062c9190612d5e565b612068565b005b61063b612160565b6040516106489190613b65565b60405180910390f35b61065961216a565b60405161066691906138a8565b60405180910390f35b6000600260005414156106b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ae90613b05565b60405180910390fd5b6002600081905550600b60009054906101000a900460ff161561070f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070690613ac5565b60405180910390fd5b60008390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141561077f57600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f8906138e5565b60405180910390fd5b60008111610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083b90613925565b60405180910390fd5b6000600554600654836108579190613dee565b6108619190613c4c565b905081600560008282546108759190613e48565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108cb9190613e48565b9250508190555080600660008282546108e49190613e48565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109499190613b65565b60405180910390a3610a7a84600460009054906101000a900460ff16600a6109719190613cd0565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d957600080fd5b505afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a119190612fe0565b600a610a1d9190613cd0565b84610a289190613dee565b610a329190613c4c565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b8192505050600160008190555092915050565b6000610a97612216565b905090565b60028054610aa990613f28565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad590613f28565b8015610b225780601f10610af757610100808354040283529160200191610b22565b820191906000526020600020905b815481529060010190602001808311610b0557829003601f168201915b505050505081565b6000610b3e610b376122c8565b84846122d0565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba457600080fd5b600b60009054906101000a900460ff1615610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90613ac5565b60405180910390fd5b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c4f91906137e9565b60206040518083038186803b158015610c6757600080fd5b505afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190612f7b565b821115610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890613b25565b60405180910390fd5b610d2e8383600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff167f2b402c854188010746674a5c32efa7a3329482c07f52455babb9067c7c1dae3483604051610d749190613b65565b60405180910390a26001905092915050565b610d8e6122c8565b73ffffffffffffffffffffffffffffffffffffffff16610dac611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990613a45565b60405180910390fd5b80600b60006101000a81548160ff0219169083151502179055507fba40372a3a724dca3c57156128ef1e896724b65b37a17f190b1ad5de68f3a4f381604051610e4b919061388d565b60405180910390a150565b610e5e6122c8565b73ffffffffffffffffffffffffffffffffffffffff16610e7c611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990613a45565b60405180910390fd5b600060075411610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613925565b60405180910390fd5b600060075490506000600781905550610f733382600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b50565b60055481565b6000610f8984848461249b565b6000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610fd46122c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b90613a25565b60405180910390fd5b611068856110606122c8565b8584036122d0565b60019150509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ce57600080fd5b600b60009054906101000a900460ff161561111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590613ac5565b60405180910390fd5b61116b8484600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121909092919063ffffffff16565b6000612710600d54600e54856111819190613e48565b61118b9190613dee565b6111959190613c4c565b9050600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112379190612fe0565b600a6112439190613cd0565b600460009054906101000a900460ff16600a61125f9190613cd0565b8261126a9190613dee565b6112749190613c4c565b600660008282546112859190613e48565b9250508190555080836112989190613e48565b600760008282546112a99190613e48565b9250508190555081600760008282546112c29190613bf6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff167fa5411d116afcb8415f0019792cccf595f94852ba82886dacbf756d9c3ce85f3f8585604051611311929190613b80565b60405180910390a25050505050565b600460009054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b60075481565b60006113ee6113596122c8565b8484600a60006113676122c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e99190613bf6565b6122d0565b6001905092915050565b6000600554600460009054906101000a900460ff16600a6114199190613cd0565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561148157600080fd5b505afa158015611495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b99190612fe0565b600a6114c59190613cd0565b600654600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115129190613dee565b61151c9190613dee565b6115269190613c4c565b6115309190613c4c565b9050919050565b60006002600054141561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690613b05565b60405180910390fd5b6002600081905550600b60009054906101000a900460ff16156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613ac5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561164a57600080fd5b60008390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141561172557600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116d291906137e9565b60206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117229190612f7b565b90505b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161178091906137e9565b60206040518083038186803b15801561179857600080fd5b505afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d09190612f7b565b811115801561188b5750600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611837929190613804565b60206040518083038186803b15801561184f57600080fd5b505afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190612f7b565b8111155b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c1906139c5565b60405180910390fd5b600081116118d757600080fd5b60006118e38483612709565b9050611934333084600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612924909392919063ffffffff16565b8092505050600160008190555092915050565b600b60009054906101000a900460ff1615611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90613ac5565b60405180910390fd5b6008548210156119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d3906139e5565b60405180910390fd5b600e54811015611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890613a05565b60405180910390fd5b611a70333084600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612924909392919063ffffffff16565b6000612710600d54600e5484611a869190613e48565b611a909190613dee565b611a9a9190613c4c565b9050600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0457600080fd5b505afa158015611b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3c9190612fe0565b600a611b489190613cd0565b600460009054906101000a900460ff16600a611b649190613cd0565b82611b6f9190613dee565b611b799190613c4c565b60066000828254611b8a9190613bf6565b925050819055508082611b9d9190613e48565b60076000828254611bae9190613bf6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167f4c2a98579e0c6c68e3033ac75a042c9b1d0310896e7544f85690637a6e57fab78484604051611bfd929190613b80565b60405180910390a250505050565b600d5481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c626122c8565b73ffffffffffffffffffffffffffffffffffffffff16611c80611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90613a45565b60405180910390fd5b611ce060006129ad565b565b60065481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60038054611d1f90613f28565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4b90613f28565b8015611d985780601f10611d6d57610100808354040283529160200191611d98565b820191906000526020600020905b815481529060010190602001808311611d7b57829003601f168201915b505050505081565b600080600a6000611daf6122c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390613b45565b60405180910390fd5b611e80611e776122c8565b858584036122d0565b600191505092915050565b6000611e9f611e986122c8565b848461249b565b6001905092915050565b600e5481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611f3e6122c8565b73ffffffffffffffffffffffffffffffffffffffff16611f5c611ce8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990613a45565b60405180910390fd5b8060088190555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611fea6122c8565b73ffffffffffffffffffffffffffffffffffffffff16612008611ce8565b73ffffffffffffffffffffffffffffffffffffffff161461205e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205590613a45565b60405180910390fd5b80600e8190555050565b6120706122c8565b73ffffffffffffffffffffffffffffffffffffffff1661208e611ce8565b73ffffffffffffffffffffffffffffffffffffffff16146120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90613a45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90613945565b60405180910390fd5b61215d816129ad565b50565b6000600854905090565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122118363a9059cbb60e01b84846040516024016121af929190613864565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a73565b505050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161227391906137e9565b60206040518083038186803b15801561228b57600080fd5b505afa15801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c39190612f7b565b905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233790613a85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790613965565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161248e9190613b65565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290613a65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561257b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257290613905565b60405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f990613985565b60405180910390fd5b818103600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126979190613bf6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126fb9190613b65565b60405180910390a350505050565b60008060009050600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561277857600080fd5b505afa15801561278c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b09190612fe0565b600a6127bc9190613cd0565b600460009054906101000a900460ff16600a6127d89190613cd0565b846127e39190613dee565b6127ed9190613c4c565b905060008114156127fd57600080fd5b60008190506000600554111561282b576006546005548261281e9190613dee565b6128289190613c4c565b90505b806005600082825461283d9190613bf6565b9250508190555081600660008282546128569190613bf6565b9250508190555080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ac9190613bf6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129119190613b65565b60405180910390a3809250505092915050565b6129a7846323b872dd60e01b8585856040516024016129459392919061382d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a73565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ad5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b3a9092919063ffffffff16565b9050600081511115612b355780806020019051810190612af59190612f29565b612b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2b90613ae5565b60405180910390fd5b5b505050565b6060612b498484600085612b52565b90509392505050565b606082471015612b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8e906139a5565b60405180910390fd5b612ba085612c66565b612bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd690613aa5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c0891906137d2565b60006040518083038185875af1925050503d8060008114612c45576040519150601f19603f3d011682016040523d82523d6000602084013e612c4a565b606091505b5091509150612c5a828286612c79565b92505050949350505050565b600080823b905060008111915050919050565b60608315612c8957829050612cd9565b600083511115612c9c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd091906138c3565b60405180910390fd5b9392505050565b600081359050612cef81614005565b92915050565b600081359050612d048161401c565b92915050565b600081519050612d198161401c565b92915050565b600081359050612d2e81614033565b92915050565b600081519050612d4381614033565b92915050565b600081519050612d588161404a565b92915050565b600060208284031215612d7057600080fd5b6000612d7e84828501612ce0565b91505092915050565b60008060408385031215612d9a57600080fd5b6000612da885828601612ce0565b9250506020612db985828601612ce0565b9150509250929050565b600080600060608486031215612dd857600080fd5b6000612de686828701612ce0565b9350506020612df786828701612ce0565b9250506040612e0886828701612d1f565b9150509250925092565b60008060408385031215612e2557600080fd5b6000612e3385828601612ce0565b9250506020612e4485828601612d1f565b9150509250929050565b600080600060608486031215612e6357600080fd5b6000612e7186828701612ce0565b9350506020612e8286828701612d1f565b9250506040612e9386828701612d1f565b9150509250925092565b60008060008060808587031215612eb357600080fd5b6000612ec187828801612ce0565b9450506020612ed287828801612d1f565b9350506040612ee387828801612d1f565b9250506060612ef487828801612d1f565b91505092959194509250565b600060208284031215612f1257600080fd5b6000612f2084828501612cf5565b91505092915050565b600060208284031215612f3b57600080fd5b6000612f4984828501612d0a565b91505092915050565b600060208284031215612f6457600080fd5b6000612f7284828501612d1f565b91505092915050565b600060208284031215612f8d57600080fd5b6000612f9b84828501612d34565b91505092915050565b60008060408385031215612fb757600080fd5b6000612fc585828601612d1f565b9250506020612fd685828601612ce0565b9150509250929050565b600060208284031215612ff257600080fd5b600061300084828501612d49565b91505092915050565b61301281613e7c565b82525050565b61302181613e8e565b82525050565b600061303282613bc4565b61303c8185613bda565b935061304c818560208601613ef5565b80840191505092915050565b61306181613ed1565b82525050565b600061307282613bcf565b61307c8185613be5565b935061308c818560208601613ef5565b61309581613fe7565b840191505092915050565b60006130ad601683613be5565b91507f416d6f756e7420657863656564732062616c616e6365000000000000000000006000830152602082019050919050565b60006130ed602383613be5565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613153601383613be5565b91507f4e6f7468696e6720746f207769746864726177000000000000000000000000006000830152602082019050919050565b6000613193602683613be5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131f9602283613be5565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061325f602683613be5565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132c5602683613be5565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061332b602383613be5565b91507f42616c616e6365206f7220616c6c6f77616e6365206e6f74207375666669636960008301527f656e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613391602483613be5565b91507f53686f756c6420626520626967676572207468616e206d696e696d756d20616d60008301527f6f756e74000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f7602183613be5565b91507f4665652073686f756c642062652067726561746572207468616e20747820666560008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061345d602883613be5565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134c3602083613be5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613503602583613be5565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613569602483613be5565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135cf601d83613be5565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061360f601383613be5565b91507f5661756c74206973206c6f636b6564206f7574000000000000000000000000006000830152602082019050919050565b600061364f602a83613be5565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006136b5601f83613be5565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006136f5602583613be5565b91507f5472616e7366657220616d6f756e742065786365656473207661756c7420626160008301527f6c616e63650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061375b602583613be5565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6137bd81613eba565b82525050565b6137cc81613ec4565b82525050565b60006137de8284613027565b915081905092915050565b60006020820190506137fe6000830184613009565b92915050565b60006040820190506138196000830185613009565b6138266020830184613009565b9392505050565b60006060820190506138426000830186613009565b61384f6020830185613009565b61385c60408301846137b4565b949350505050565b60006040820190506138796000830185613009565b61388660208301846137b4565b9392505050565b60006020820190506138a26000830184613018565b92915050565b60006020820190506138bd6000830184613058565b92915050565b600060208201905081810360008301526138dd8184613067565b905092915050565b600060208201905081810360008301526138fe816130a0565b9050919050565b6000602082019050818103600083015261391e816130e0565b9050919050565b6000602082019050818103600083015261393e81613146565b9050919050565b6000602082019050818103600083015261395e81613186565b9050919050565b6000602082019050818103600083015261397e816131ec565b9050919050565b6000602082019050818103600083015261399e81613252565b9050919050565b600060208201905081810360008301526139be816132b8565b9050919050565b600060208201905081810360008301526139de8161331e565b9050919050565b600060208201905081810360008301526139fe81613384565b9050919050565b60006020820190508181036000830152613a1e816133ea565b9050919050565b60006020820190508181036000830152613a3e81613450565b9050919050565b60006020820190508181036000830152613a5e816134b6565b9050919050565b60006020820190508181036000830152613a7e816134f6565b9050919050565b60006020820190508181036000830152613a9e8161355c565b9050919050565b60006020820190508181036000830152613abe816135c2565b9050919050565b60006020820190508181036000830152613ade81613602565b9050919050565b60006020820190508181036000830152613afe81613642565b9050919050565b60006020820190508181036000830152613b1e816136a8565b9050919050565b60006020820190508181036000830152613b3e816136e8565b9050919050565b60006020820190508181036000830152613b5e8161374e565b9050919050565b6000602082019050613b7a60008301846137b4565b92915050565b6000604082019050613b9560008301856137b4565b613ba260208301846137b4565b9392505050565b6000602082019050613bbe60008301846137c3565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613c0182613eba565b9150613c0c83613eba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4157613c40613f5a565b5b828201905092915050565b6000613c5782613eba565b9150613c6283613eba565b925082613c7257613c71613f89565b5b828204905092915050565b6000808291508390505b6001851115613cc757808604811115613ca357613ca2613f5a565b5b6001851615613cb25780820291505b8081029050613cc085613ff8565b9450613c87565b94509492505050565b6000613cdb82613eba565b9150613ce683613ec4565b9250613d137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d1b565b905092915050565b600082613d2b5760019050613de7565b81613d395760009050613de7565b8160018114613d4f5760028114613d5957613d88565b6001915050613de7565b60ff841115613d6b57613d6a613f5a565b5b8360020a915084821115613d8257613d81613f5a565b5b50613de7565b5060208310610133831016604e8410600b8410161715613dbd5782820a905083811115613db857613db7613f5a565b5b613de7565b613dca8484846001613c7d565b92509050818404811115613de157613de0613f5a565b5b81810290505b9392505050565b6000613df982613eba565b9150613e0483613eba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3d57613e3c613f5a565b5b828202905092915050565b6000613e5382613eba565b9150613e5e83613eba565b925082821015613e7157613e70613f5a565b5b828203905092915050565b6000613e8782613e9a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613edc82613ee3565b9050919050565b6000613eee82613e9a565b9050919050565b60005b83811015613f13578082015181840152602081019050613ef8565b83811115613f22576000848401525b50505050565b60006002820490506001821680613f4057607f821691505b60208210811415613f5457613f53613fb8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b61400e81613e7c565b811461401957600080fd5b50565b61402581613e8e565b811461403057600080fd5b50565b61403c81613eba565b811461404757600080fd5b50565b61405381613ec4565b811461405e57600080fd5b5056fea26469706673582212201b1f1c0f8ba636b5467b326da96d80a07a52a00cfebd1c91759c95bbb381988864736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000642f645bf10e7f3fc81e1701c73e4dce44daa28000000000000000000000000098a8f350853a1451d7e961480c1fbfdac39f8efc0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000aae600000000000000000000000000000000000000000000000000000000000000007666f726d55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d466f726d6174696f6e2055534400000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): formUSD
Arg [1] : _symbol (string): Formation USD
Arg [2] : _token (address): 0x642f645BF10e7F3FC81E1701C73e4dCe44daa280
Arg [3] : _bridge (address): 0x98A8F350853a1451D7E961480c1fBfdaC39F8efC
Arg [4] : _minAmount (uint256): 100000000
Arg [5] : _txFee (uint256): 700000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000642f645bf10e7f3fc81e1701c73e4dce44daa280
Arg [3] : 00000000000000000000000098a8f350853a1451d7e961480c1fbfdac39f8efc
Arg [4] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [5] : 00000000000000000000000000000000000000000000000000000000000aae60
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 666f726d55534400000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [9] : 466f726d6174696f6e2055534400000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.