Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Chain Target... | 17517133 | 454 days ago | IN | 0 ETH | 0.00045662 | ||||
Set Chain Target... | 17517133 | 454 days ago | IN | 0 ETH | 0.00045662 | ||||
Set Chain Target... | 17517133 | 454 days ago | IN | 0 ETH | 0.00072356 | ||||
Set Token Config | 17507372 | 455 days ago | IN | 0 ETH | 0.00371148 | ||||
Set Chain Target... | 17507372 | 455 days ago | IN | 0 ETH | 0.00092386 | ||||
Swap Out | 17503866 | 456 days ago | IN | 0.01 ETH | 0.01062705 | ||||
Set Owner | 17503860 | 456 days ago | IN | 0 ETH | 0.00081045 | ||||
Set Fee | 17503860 | 456 days ago | IN | 0 ETH | 0.00118123 | ||||
Set Token Config | 17503860 | 456 days ago | IN | 0 ETH | 0.00314922 | ||||
Set Chain Target... | 17503860 | 456 days ago | IN | 0 ETH | 0.0007839 | ||||
0x60806040 | 17503860 | 456 days ago | IN | 0 ETH | 0.03641411 |
Loading...
Loading
Contract Name:
TSAggregatorStargate
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import {SafeTransferLib} from "../lib/SafeTransferLib.sol"; import {TSAggregator} from "./TSAggregator.sol"; import {IERC20} from "./interfaces/IERC20.sol"; import {IOracle} from "./interfaces/IOracle.sol"; import {IStargateRouter} from "./interfaces/IStargateRouter.sol"; import {IThorchainRouter} from "./interfaces/IThorchainRouter.sol"; import {IUniswapRouterV2} from "./interfaces/IUniswapRouterV2.sol"; contract TSAggregatorStargate is TSAggregator { error NotAConfiguredToken(); using SafeTransferLib for address; struct TokenConfig { uint256 chainId; address token; address router; address[] path; } IStargateRouter public stargate; IUniswapRouterV2 public router; IERC20 public bridgeToken; IOracle public ethOracle; uint256 public slippage = 100; uint256 public sourcePoolId = 1; mapping(uint256 => uint256) public chainTargetPoolId; mapping(uint256 => address) public chainTargetContract; mapping(uint256 => TokenConfig) public tokens; event SetTokenConfig(uint256 indexed id, uint256 chainId, address token, address router, address[] path); event SwapIn(address from, address token, uint256 amount, uint256 out, uint256 fee, address vault, string memo); event SwapOut(address to, address token, uint256 amount, uint256 fee); constructor(address _stargate, address _router, address _bridgeToken, address _ethOracle) TSAggregator(address(0)) { stargate = IStargateRouter(_stargate); router = IUniswapRouterV2(_router); bridgeToken = IERC20(_bridgeToken); ethOracle = IOracle(_ethOracle); chainTargetPoolId[102] = 2; // BNB (USDT) chainTargetPoolId[106] = 1; // Avalanche chainTargetPoolId[109] = 1; // Polygon chainTargetPoolId[110] = 1; // Arbitrum chainTargetPoolId[111] = 1; // Optimism chainTargetPoolId[112] = 1; // Fantom } function setSlippage(uint256 _slippage) external isOwner { slippage = _slippage; } function setChainTargetContract(uint256 chainId, address targetContract) external isOwner { chainTargetContract[chainId] = targetContract; } function setChainTargetPoolId(uint256 chainId, uint256 poolId) external isOwner { chainTargetPoolId[chainId] = poolId; } function setTokenConfig(uint256 id, uint256 chainId, address token, address router, address[] calldata path) external isOwner { tokens[id] = TokenConfig({chainId: chainId, token: token, router: router, path: path}); emit SetTokenConfig(id, chainId, token, router, path); } function sgReceive(uint16, bytes memory, uint256, address bridgeToken, uint256 bridgeAmount, bytes memory payload) external { require(msg.sender == address(stargate), "!stargate"); (address tcRouter, address vault, string memory memo, address from, uint256 deadline) = abi.decode(payload, (address, address, string, address, uint256)); uint256 price = uint256(ethOracle.latestAnswer()) * 1e18 / ethOracle.decimals(); uint256 minAmtOut = _slip(bridgeAmount) * (10 ** IERC20(bridgeToken).decimals()) / price; IERC20(bridgeToken).approve(address(router), bridgeAmount); address[] memory path = new address[](2); path[0] = bridgeToken; path[1] = router.WETH(); try router.swapExactTokensForETH(bridgeAmount, minAmtOut, path, address(this), deadline) { uint256 out = address(this).balance; uint256 outMinusFee = skimFee(out); IThorchainRouter(tcRouter).depositWithExpiry{value: outMinusFee}( payable(vault), address(0), outMinusFee, memo, deadline ); emit SwapIn(msg.sender, bridgeToken, bridgeAmount, out, out - outMinusFee, vault, memo); } catch { IERC20(bridgeToken).transfer(from, bridgeAmount); } } function swapOut(address token, address to, uint256 amountOutMin) public payable nonReentrant { IStargateRouter.lzTxObj memory txObj = IStargateRouter.lzTxObj(500000, 0, "0x"); TokenConfig memory tokenConfig = tokens[amountOutMin % 1000]; if (tokenConfig.token == address(0)) revert NotAConfiguredToken(); bytes memory data = abi.encode(tokenConfig.token, tokenConfig.router, tokenConfig.path, to, amountOutMin); address targetContract = chainTargetContract[tokenConfig.chainId]; uint256 amount = skimFee(msg.value); (uint256 fee,) = stargate.quoteLayerZeroFee( uint16(tokenConfig.chainId), uint8(1), abi.encodePacked(targetContract), data, txObj ); { uint256 price = uint256(ethOracle.latestAnswer()) * 1e18 / ethOracle.decimals(); uint256 minAmtOut = _slip(amount - fee) * (10 ** bridgeToken.decimals()) / price; address[] memory path = new address[](2); path[0] = address(router.WETH()); path[1] = address(bridgeToken); router.swapExactETHForTokens{value: amount - fee}(minAmtOut, path, address(this), type(uint256).max); } uint256 tokenAmount = bridgeToken.balanceOf(address(this)); bridgeToken.approve(address(stargate), tokenAmount); stargate.swap{value: fee}( uint16(tokenConfig.chainId), sourcePoolId, chainTargetPoolId[tokenConfig.chainId], payable(to), tokenAmount, _slip(tokenAmount), txObj, abi.encodePacked(targetContract), data ); emit SwapOut(to, token, msg.value, msg.value - amount); } function _slip(uint256 amount) internal view returns (uint256) { return amount * (10000 - slippage) / 10000; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Gas optimized reentrancy protection for smart contracts. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol) /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol) abstract contract ReentrancyGuard { uint256 private locked = 1; modifier nonReentrant() { require(locked == 1, "REENTRANCY"); locked = 2; _; locked = 1; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. library SafeTransferLib { /*/////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool callStatus; assembly { // Transfer the ETH and store if it succeeded or not. callStatus := call(gas(), to, amount, 0, 0, 0, 0) } require(callStatus, "ETH_TRANSFER_FAILED"); } /*/////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( address token, address from, address to, uint256 amount ) internal { bool callStatus; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata to memory piece by piece: mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector. mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument. mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value. // Call the token and store if it succeeded or not. // We use 100 because the calldata length is 4 + 32 * 3. callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0) } require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED"); } function safeTransfer( address token, address to, uint256 amount ) internal { bool callStatus; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata to memory piece by piece: mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector. mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value. // Call the token and store if it succeeded or not. // We use 68 because the calldata length is 4 + 32 * 2. callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0) } require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED"); } function safeApprove( address token, address to, uint256 amount ) internal { bool callStatus; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata to memory piece by piece: mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector. mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value. // Call the token and store if it succeeded or not. // We use 68 because the calldata length is 4 + 32 * 2. callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0) } require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED"); } /*/////////////////////////////////////////////////////////////// INTERNAL HELPER LOGIC //////////////////////////////////////////////////////////////*/ function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) { assembly { // Get how many bytes the call returned. let returnDataSize := returndatasize() // If the call reverted: if iszero(callStatus) { // Copy the revert message into memory. returndatacopy(0, 0, returnDataSize) // Revert with the same message. revert(0, returnDataSize) } switch returnDataSize case 32 { // Copy the return data into memory. returndatacopy(0, 0, returnDataSize) // Set success to whether it returned true. success := iszero(iszero(mload(0))) } case 0 { // There was no return data. success := 1 } default { // It returned some malformed input. success := 0 } } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; abstract contract Owners { event OwnerSet(address indexed owner, bool active); mapping(address => bool) public owners; modifier isOwner() { require(owners[msg.sender], "Unauthorized"); _; } function _setOwner(address owner, bool active) internal virtual { owners[owner] = active; emit OwnerSet(owner, active); } function setOwner(address owner, bool active) external virtual isOwner { _setOwner(owner, active); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import { SafeTransferLib } from "../lib/SafeTransferLib.sol"; import { ReentrancyGuard } from "../lib/ReentrancyGuard.sol"; import { Owners } from "./Owners.sol"; import { TSAggregatorTokenTransferProxy } from './TSAggregatorTokenTransferProxy.sol'; abstract contract TSAggregator is Owners, ReentrancyGuard { using SafeTransferLib for address; event FeeSet(uint256 fee, address feeRecipient); uint256 public fee; address public feeRecipient; TSAggregatorTokenTransferProxy public tokenTransferProxy; constructor(address _tokenTransferProxy) { _setOwner(msg.sender, true); tokenTransferProxy = TSAggregatorTokenTransferProxy(_tokenTransferProxy); } // Needed for the swap router to be able to send back ETH receive() external payable {} function setFee(uint256 _fee, address _feeRecipient) external isOwner { require(_fee <= 1000, "fee can not be more than 10%"); fee = _fee; feeRecipient = _feeRecipient; emit FeeSet(_fee, _feeRecipient); } function skimFee(uint256 amount) internal returns (uint256) { uint256 amountFee = getFee(amount); if (amountFee > 0) { feeRecipient.safeTransferETH(amountFee); amount -= amountFee; } return amount; } function getFee(uint256 amount) internal view returns (uint256) { if (fee != 0 && feeRecipient != address(0)) { return (amount * fee) / 10000; } return 0; } // Parse amountOutMin treating the last 2 digits as an exponent // So 1504 = 150000. This allows for compressed memos on chains // with limited space like Bitcoin function _parseAmountOutMin(uint256 amount) internal pure returns (uint256) { return amount / 100 * (10 ** (amount % 100)); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import { SafeTransferLib } from "../lib/SafeTransferLib.sol"; import { Owners } from "./Owners.sol"; contract TSAggregatorTokenTransferProxy is Owners { using SafeTransferLib for address; constructor() { _setOwner(msg.sender, true); } function transferTokens(address token, address from, address to, uint256 amount) external isOwner { require(from == tx.origin || _isContract(from), "Invalid from address"); token.safeTransferFrom(from, to, amount); } 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; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IOracle { function latestAnswer() external view returns (int256); function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IStargateRouter { struct lzTxObj { uint256 dstGasForCall; uint256 dstNativeAmount; bytes dstNativeAddr; } function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, lzTxObj memory _lzTxParams ) external view returns (uint256, uint256); function swap( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLD, uint256 _minAmountLD, lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IThorchainRouter { function depositWithExpiry( address payable vault, address asset, uint amount, string memory memo, uint expiration ) external payable; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IUniswapRouterV2 { function WETH() external view returns (address); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; }
{ "remappings": [ "hardhat/=node_modules/hardhat/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stargate","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_bridgeToken","type":"address"},{"internalType":"address","name":"_ethOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotAConfiguredToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeRecipient","type":"address"}],"name":"FeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SetTokenConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"string","name":"memo","type":"string"}],"name":"SwapIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SwapOut","type":"event"},{"inputs":[],"name":"bridgeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainTargetContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainTargetPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethOracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"targetContract","type":"address"}],"name":"setChainTargetContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"setChainTargetPoolId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"setSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"setTokenConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"bridgeToken","type":"address"},{"internalType":"uint256","name":"bridgeAmount","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"sgReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sourcePoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stargate","outputs":[{"internalType":"contract IStargateRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapOut","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tokenTransferProxy","outputs":[{"internalType":"contract TSAggregatorTokenTransferProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"router","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526001805560646009556001600a553480156200001f57600080fd5b50604051620022963803806200229683398101604081905262000042916200020e565b60006200005133600162000194565b600480546001600160a01b03199081166001600160a01b0393841617909155600580548216968316969096179095556006805486169482169490941790935560078054851692841692909217909155600880549093169116179055600b60205260027f9b93b1f278920c61d89dbcb374ecb76190cc66519824442e7c3630b16c7fd3fd5560017f883a43708262222a5f4103b2729e693d0d260c9091529ffea5b2c6052e27079d8190557f16757982cec2e76367d24b1ee22be04293cd58bf58a7b9210e806e7cbbdf91d68190557f3f66b79e6cea089826bc2d7f021279da7964b63d233d1b391586ae93e28c6cfd8190557f292192bd49f2fa44a81729592d90aeef661920e714d545fd98668aba437b5fcd81905560706000527f1f537741004a97447e4a16c811d85127837078aee8fb4c3628b899f84fac08e8556200026b565b6001600160a01b03821660008181526020818152604091829020805460ff191685151590811790915591519182527ff74826f11048fa8ecf33e91132bf280f6582ed97548a84e426b56e98526b9316910160405180910390a25050565b80516001600160a01b03811681146200020957600080fd5b919050565b600080600080608085870312156200022557600080fd5b6200023085620001f1565b93506200024060208601620001f1565b92506200025060408601620001f1565b91506200026060608601620001f1565b905092959194509250565b61201b806200027b6000396000f3fe60806040526004361061012e5760003560e01c806370bfe3cb116100ab578063b96574021161006f578063b9657402146103a9578063ddca3f43146103c9578063e094230a146103df578063f0fa55a91461040c578063f4734b0c1461042c578063f887ea401461044c57600080fd5b806370bfe3cb1461031357806374436853146103295780639c8762e114610349578063ab8236f314610369578063b4f2e8b81461038957600080fd5b80634f64b2be116100f25780634f64b2be146102105780635000eda31461027d578063516c731c146102b357806369d16790146102d35780636c099dee146102f357600080fd5b8063022914a71461013a5780630eefdbad1461017f5780633e032a3b146101b757806346904840146101db57806348c314f4146101fb57600080fd5b3661013557005b600080fd5b34801561014657600080fd5b5061016a61015536600461164c565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561018b57600080fd5b5060045461019f906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b3480156101c357600080fd5b506101cd60095481565b604051908152602001610176565b3480156101e757600080fd5b5060035461019f906001600160a01b031681565b61020e610209366004611670565b61046c565b005b34801561021c57600080fd5b5061025861022b3660046116b1565b600d6020526000908152604090208054600182015460029092015490916001600160a01b03908116911683565b604080519384526001600160a01b039283166020850152911690820152606001610176565b34801561028957600080fd5b5061019f6102983660046116b1565b600c602052600090815260409020546001600160a01b031681565b3480156102bf57600080fd5b5061020e6102ce3660046116d8565b610c17565b3480156102df57600080fd5b5061020e6102ee366004611711565b610c54565b3480156102ff57600080fd5b5060055461019f906001600160a01b031681565b34801561031f57600080fd5b506101cd600a5481565b34801561033557600080fd5b5061020e6103443660046117be565b610d9c565b34801561035557600080fd5b5060085461019f906001600160a01b031681565b34801561037557600080fd5b5061020e6103843660046118a5565b610ddd565b34801561039557600080fd5b5061020e6103a4366004611949565b6112ea565b3480156103b557600080fd5b5061020e6103c4366004611949565b6113cc565b3480156103d557600080fd5b506101cd60025481565b3480156103eb57600080fd5b506101cd6103fa3660046116b1565b600b6020526000908152604090205481565b34801561041857600080fd5b5061020e6104273660046116b1565b611429565b34801561043857600080fd5b5060075461019f906001600160a01b031681565b34801561045857600080fd5b5060065461019f906001600160a01b031681565b6001546001146104b05760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b60026001819055604080516060810182526207a1208152600060208083018290528351808501855294855261060f60f31b9085015291810192909252600d816104fb6103e886611984565b8152602080820192909252604090810160002081516080810183528154815260018201546001600160a01b03908116828601526002830154168184015260038201805484518187028101870190955280855291949293606086019390929083018282801561059257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610574575b5050509190925250505060208101519091506001600160a01b03166105ca576040516338183a0960e11b815260040160405180910390fd5b600081602001518260400151836060015187876040516020016105f19594939291906119dc565b60408051601f1981840301815291815283516000908152600c602052908120549192506001600160a01b03909116906106293461145d565b600554855160408051606087901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052630a51236960e01b9092529394506000936001600160a01b0390931692630a51236992610696929091600191908a908d90603801611aa6565b6040805180830381865afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190611afe565b5090506000600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107529190611b22565b60ff16600860009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc9190611b45565b6107de90670de0b6b3a7640000611b74565b6107e89190611b93565b9050600081600760009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108649190611b22565b61086f90600a611c8b565b61088161087c8688611c9a565b61149b565b61088b9190611b74565b6108959190611b93565b60408051600280825260608201835292935060009290916020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109289190611cb1565b8160008151811061093b5761093b611cce565b6001600160a01b03928316602091820292909201015260075482519116908290600190811061096c5761096c611cce565b6001600160a01b03928316602091820292909201015260065416637ff36ab56109958688611c9a565b8484306000196040518663ffffffff1660e01b81526004016109ba9493929190611ce4565b6000604051808303818588803b1580156109d357600080fd5b505af11580156109e7573d6000803e3d6000fd5b50506007546040516370a0823160e01b8152306004820152600097506001600160a01b0390911695506370a0823194506024019250610a24915050565b602060405180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a659190611b45565b60075460055460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af1158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190611d19565b506005548651600a546000828152600b60205260409020546001600160a01b0390931692639fbf10fc92869290918e87610b198161149b565b8f8d604051602001610b43919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528f6040518b63ffffffff1660e01b8152600401610b7799989796959493929190611d36565b6000604051808303818588803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b50505050507f61fad1e4996f793deb2a6b2d07c7fe999e0ce4a95e1ca4662fd430f1c5244019898b348634610bd99190611c9a565b604080516001600160a01b03958616815294909316602085015291830152606082015260800160405180910390a15050600180555050505050505050565b3360009081526020819052604090205460ff16610c465760405162461bcd60e51b81526004016104a790611db3565b610c5082826114ca565b5050565b3360009081526020819052604090205460ff16610c835760405162461bcd60e51b81526004016104a790611db3565b6040518060800160405280868152602001856001600160a01b03168152602001846001600160a01b031681526020018383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050888152600d602090815260409182902084518155848201516001820180546001600160a01b03199081166001600160a01b03938416179091559386015160028301805490951691161790925560608401518051929350610d5092600385019291909101906115ba565b50905050857f1839008b989326c7f237e534e95a923c8f6766c3c60ac6935260aa7ac3c727ba8686868686604051610d8c959493929190611dd9565b60405180910390a2505050505050565b3360009081526020819052604090205460ff16610dcb5760405162461bcd60e51b81526004016104a790611db3565b6000918252600b602052604090912055565b6005546001600160a01b03163314610e235760405162461bcd60e51b815260206004820152600960248201526821737461726761746560b81b60448201526064016104a7565b600080600080600085806020019051810190610e3f9190611e58565b945094509450945094506000600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190611b22565b60ff16600860009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3c9190611b45565b610f4e90670de0b6b3a7640000611b74565b610f589190611b93565b90506000818a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190611b22565b610fca90600a611c8b565b610fd38b61149b565b610fdd9190611b74565b610fe79190611b93565b60065460405163095ea7b360e01b81526001600160a01b039182166004820152602481018c90529192508b169063095ea7b3906044016020604051808303816000875af115801561103c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110609190611d19565b506040805160028082526060820183526000926020830190803683370190505090508a8160008151811061109657611096611cce565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156110ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111139190611cb1565b8160018151811061112657611126611cce565b6001600160a01b0392831660209182029290920101526006546040516318cbafe560e01b81529116906318cbafe59061116b908d908690869030908b90600401611f12565b600060405180830381600087803b15801561118557600080fd5b505af1925050508015611196575060015b6112135760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018c90528c169063a9059cbb906044016020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190611d19565b506112da565b47600061121f8261145d565b9050896001600160a01b03166344bc937b828b6000858d8c6040518763ffffffff1660e01b8152600401611257959493929190611f4e565b6000604051808303818588803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b50505050507fd0905d621f104066424412dcaf4dd7189ca00660fc08a026e5927026b8afa82c338e8e8585876112ba9190611c9a565b8e8e6040516112cf9796959493929190611f93565b60405180910390a150505b5050505050505050505050505050565b3360009081526020819052604090205460ff166113195760405162461bcd60e51b81526004016104a790611db3565b6103e882111561136b5760405162461bcd60e51b815260206004820152601c60248201527f6665652063616e206e6f74206265206d6f7265207468616e203130250000000060448201526064016104a7565b6002829055600380546001600160a01b0319166001600160a01b0383169081179091556040805184815260208101929092527fc8242dc5446855370b781abbfc5d882af1d1a3cc29143216aba3558feb0ce925910160405180910390a15050565b3360009081526020819052604090205460ff166113fb5760405162461bcd60e51b81526004016104a790611db3565b6000918252600c602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b3360009081526020819052604090205460ff166114585760405162461bcd60e51b81526004016104a790611db3565b600955565b60008061146983611527565b9050801561149457600354611487906001600160a01b031682611564565b6114918184611c9a565b92505b5090919050565b60006127106009546127106114b09190611c9a565b6114ba9084611b74565b6114c49190611b93565b92915050565b6001600160a01b03821660008181526020818152604091829020805460ff191685151590811790915591519182527ff74826f11048fa8ecf33e91132bf280f6582ed97548a84e426b56e98526b9316910160405180910390a25050565b600060025460001415801561154657506003546001600160a01b031615155b1561155c57612710600254836114ba9190611b74565b506000919050565b600080600080600085875af19050806115b55760405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b60448201526064016104a7565b505050565b82805482825590600052602060002090810192821561160f579160200282015b8281111561160f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906115da565b5061161b92915061161f565b5090565b5b8082111561161b5760008155600101611620565b6001600160a01b038116811461164957600080fd5b50565b60006020828403121561165e57600080fd5b813561166981611634565b9392505050565b60008060006060848603121561168557600080fd5b833561169081611634565b925060208401356116a081611634565b929592945050506040919091013590565b6000602082840312156116c357600080fd5b5035919050565b801515811461164957600080fd5b600080604083850312156116eb57600080fd5b82356116f681611634565b91506020830135611706816116ca565b809150509250929050565b60008060008060008060a0878903121561172a57600080fd5b8635955060208701359450604087013561174381611634565b9350606087013561175381611634565b9250608087013567ffffffffffffffff8082111561177057600080fd5b818901915089601f83011261178457600080fd5b81358181111561179357600080fd5b8a60208260051b85010111156117a857600080fd5b6020830194508093505050509295509295509295565b600080604083850312156117d157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561181f5761181f6117e0565b604052919050565b600067ffffffffffffffff821115611841576118416117e0565b50601f01601f191660200190565b600082601f83011261186057600080fd5b813561187361186e82611827565b6117f6565b81815284602083860101111561188857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156118be57600080fd5b863561ffff811681146118d057600080fd5b9550602087013567ffffffffffffffff808211156118ed57600080fd5b6118f98a838b0161184f565b9650604089013595506060890135915061191282611634565b9093506080880135925060a0880135908082111561192f57600080fd5b5061193c89828a0161184f565b9150509295509295509295565b6000806040838503121561195c57600080fd5b82359150602083013561170681611634565b634e487b7160e01b600052601260045260246000fd5b6000826119935761199361196e565b500690565b600081518084526020808501945080840160005b838110156119d15781516001600160a01b0316875295820195908201906001016119ac565b509495945050505050565b600060018060a01b038088168352808716602084015260a06040840152611a0660a0840187611998565b9416606083015250608001529392505050565b60005b83811015611a34578181015183820152602001611a1c565b83811115611a43576000848401525b50505050565b60008151808452611a61816020860160208601611a19565b601f01601f19169290920160200192915050565b80518252602081015160208301526000604082015160606040850152611a9e6060850182611a49565b949350505050565b61ffff8616815260ff8516602082015260a060408201526000611acc60a0830186611a49565b8281036060840152611ade8186611a49565b90508281036080840152611af28185611a75565b98975050505050505050565b60008060408385031215611b1157600080fd5b505080516020909101519092909150565b600060208284031215611b3457600080fd5b815160ff8116811461166957600080fd5b600060208284031215611b5757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611b8e57611b8e611b5e565b500290565b600082611ba257611ba261196e565b500490565b600181815b80851115611be2578160001904821115611bc857611bc8611b5e565b80851615611bd557918102915b93841c9390800290611bac565b509250929050565b600082611bf9575060016114c4565b81611c06575060006114c4565b8160018114611c1c5760028114611c2657611c42565b60019150506114c4565b60ff841115611c3757611c37611b5e565b50506001821b6114c4565b5060208310610133831016604e8410600b8410161715611c65575081810a6114c4565b611c6f8383611ba7565b8060001904821115611c8357611c83611b5e565b029392505050565b600061166960ff841683611bea565b600082821015611cac57611cac611b5e565b500390565b600060208284031215611cc357600080fd5b815161166981611634565b634e487b7160e01b600052603260045260246000fd5b848152608060208201526000611cfd6080830186611998565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215611d2b57600080fd5b8151611669816116ca565b600061012061ffff8c1683528a602084015289604084015260018060a01b03891660608401528760808401528660a08401528060c0840152611d7a81840187611a75565b905082810360e0840152611d8e8186611a49565b9050828103610100840152611da38185611a49565b9c9b505050505050505050505050565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b8581526001600160a01b038581166020808401919091528582166040840152608060608401819052830184905260009185919060a08501845b87811015611e39578435611e2581611634565b831682529383019390830190600101611e12565b509a9950505050505050505050565b8051611e5381611634565b919050565b600080600080600060a08688031215611e7057600080fd5b8551611e7b81611634565b6020870151909550611e8c81611634565b604087015190945067ffffffffffffffff811115611ea957600080fd5b8601601f81018813611eba57600080fd5b8051611ec861186e82611827565b818152896020838501011115611edd57600080fd5b611eee826020830160208601611a19565b9450611eff91505060608701611e48565b9150608086015190509295509295909350565b85815284602082015260a060408201526000611f3160a0830186611998565b6001600160a01b0394909416606083015250608001529392505050565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090611f8190830185611a49565b90508260808301529695505050505050565b600060018060a01b03808a168352808916602084015287604084015286606084015285608084015280851660a08401525060e060c0830152611fd860e0830184611a49565b999850505050505050505056fea2646970667358221220b526ff5f0754f3ea6a8e0e07a7f1184c59e757b9a6a1c3c06ea2a90f177eff3564736f6c634300080a00330000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e980000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode
0x60806040526004361061012e5760003560e01c806370bfe3cb116100ab578063b96574021161006f578063b9657402146103a9578063ddca3f43146103c9578063e094230a146103df578063f0fa55a91461040c578063f4734b0c1461042c578063f887ea401461044c57600080fd5b806370bfe3cb1461031357806374436853146103295780639c8762e114610349578063ab8236f314610369578063b4f2e8b81461038957600080fd5b80634f64b2be116100f25780634f64b2be146102105780635000eda31461027d578063516c731c146102b357806369d16790146102d35780636c099dee146102f357600080fd5b8063022914a71461013a5780630eefdbad1461017f5780633e032a3b146101b757806346904840146101db57806348c314f4146101fb57600080fd5b3661013557005b600080fd5b34801561014657600080fd5b5061016a61015536600461164c565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561018b57600080fd5b5060045461019f906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b3480156101c357600080fd5b506101cd60095481565b604051908152602001610176565b3480156101e757600080fd5b5060035461019f906001600160a01b031681565b61020e610209366004611670565b61046c565b005b34801561021c57600080fd5b5061025861022b3660046116b1565b600d6020526000908152604090208054600182015460029092015490916001600160a01b03908116911683565b604080519384526001600160a01b039283166020850152911690820152606001610176565b34801561028957600080fd5b5061019f6102983660046116b1565b600c602052600090815260409020546001600160a01b031681565b3480156102bf57600080fd5b5061020e6102ce3660046116d8565b610c17565b3480156102df57600080fd5b5061020e6102ee366004611711565b610c54565b3480156102ff57600080fd5b5060055461019f906001600160a01b031681565b34801561031f57600080fd5b506101cd600a5481565b34801561033557600080fd5b5061020e6103443660046117be565b610d9c565b34801561035557600080fd5b5060085461019f906001600160a01b031681565b34801561037557600080fd5b5061020e6103843660046118a5565b610ddd565b34801561039557600080fd5b5061020e6103a4366004611949565b6112ea565b3480156103b557600080fd5b5061020e6103c4366004611949565b6113cc565b3480156103d557600080fd5b506101cd60025481565b3480156103eb57600080fd5b506101cd6103fa3660046116b1565b600b6020526000908152604090205481565b34801561041857600080fd5b5061020e6104273660046116b1565b611429565b34801561043857600080fd5b5060075461019f906001600160a01b031681565b34801561045857600080fd5b5060065461019f906001600160a01b031681565b6001546001146104b05760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b60026001819055604080516060810182526207a1208152600060208083018290528351808501855294855261060f60f31b9085015291810192909252600d816104fb6103e886611984565b8152602080820192909252604090810160002081516080810183528154815260018201546001600160a01b03908116828601526002830154168184015260038201805484518187028101870190955280855291949293606086019390929083018282801561059257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610574575b5050509190925250505060208101519091506001600160a01b03166105ca576040516338183a0960e11b815260040160405180910390fd5b600081602001518260400151836060015187876040516020016105f19594939291906119dc565b60408051601f1981840301815291815283516000908152600c602052908120549192506001600160a01b03909116906106293461145d565b600554855160408051606087901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052630a51236960e01b9092529394506000936001600160a01b0390931692630a51236992610696929091600191908a908d90603801611aa6565b6040805180830381865afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190611afe565b5090506000600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107529190611b22565b60ff16600860009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc9190611b45565b6107de90670de0b6b3a7640000611b74565b6107e89190611b93565b9050600081600760009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108649190611b22565b61086f90600a611c8b565b61088161087c8688611c9a565b61149b565b61088b9190611b74565b6108959190611b93565b60408051600280825260608201835292935060009290916020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109289190611cb1565b8160008151811061093b5761093b611cce565b6001600160a01b03928316602091820292909201015260075482519116908290600190811061096c5761096c611cce565b6001600160a01b03928316602091820292909201015260065416637ff36ab56109958688611c9a565b8484306000196040518663ffffffff1660e01b81526004016109ba9493929190611ce4565b6000604051808303818588803b1580156109d357600080fd5b505af11580156109e7573d6000803e3d6000fd5b50506007546040516370a0823160e01b8152306004820152600097506001600160a01b0390911695506370a0823194506024019250610a24915050565b602060405180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a659190611b45565b60075460055460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af1158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190611d19565b506005548651600a546000828152600b60205260409020546001600160a01b0390931692639fbf10fc92869290918e87610b198161149b565b8f8d604051602001610b43919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528f6040518b63ffffffff1660e01b8152600401610b7799989796959493929190611d36565b6000604051808303818588803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b50505050507f61fad1e4996f793deb2a6b2d07c7fe999e0ce4a95e1ca4662fd430f1c5244019898b348634610bd99190611c9a565b604080516001600160a01b03958616815294909316602085015291830152606082015260800160405180910390a15050600180555050505050505050565b3360009081526020819052604090205460ff16610c465760405162461bcd60e51b81526004016104a790611db3565b610c5082826114ca565b5050565b3360009081526020819052604090205460ff16610c835760405162461bcd60e51b81526004016104a790611db3565b6040518060800160405280868152602001856001600160a01b03168152602001846001600160a01b031681526020018383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050888152600d602090815260409182902084518155848201516001820180546001600160a01b03199081166001600160a01b03938416179091559386015160028301805490951691161790925560608401518051929350610d5092600385019291909101906115ba565b50905050857f1839008b989326c7f237e534e95a923c8f6766c3c60ac6935260aa7ac3c727ba8686868686604051610d8c959493929190611dd9565b60405180910390a2505050505050565b3360009081526020819052604090205460ff16610dcb5760405162461bcd60e51b81526004016104a790611db3565b6000918252600b602052604090912055565b6005546001600160a01b03163314610e235760405162461bcd60e51b815260206004820152600960248201526821737461726761746560b81b60448201526064016104a7565b600080600080600085806020019051810190610e3f9190611e58565b945094509450945094506000600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190611b22565b60ff16600860009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3c9190611b45565b610f4e90670de0b6b3a7640000611b74565b610f589190611b93565b90506000818a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190611b22565b610fca90600a611c8b565b610fd38b61149b565b610fdd9190611b74565b610fe79190611b93565b60065460405163095ea7b360e01b81526001600160a01b039182166004820152602481018c90529192508b169063095ea7b3906044016020604051808303816000875af115801561103c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110609190611d19565b506040805160028082526060820183526000926020830190803683370190505090508a8160008151811061109657611096611cce565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156110ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111139190611cb1565b8160018151811061112657611126611cce565b6001600160a01b0392831660209182029290920101526006546040516318cbafe560e01b81529116906318cbafe59061116b908d908690869030908b90600401611f12565b600060405180830381600087803b15801561118557600080fd5b505af1925050508015611196575060015b6112135760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018c90528c169063a9059cbb906044016020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190611d19565b506112da565b47600061121f8261145d565b9050896001600160a01b03166344bc937b828b6000858d8c6040518763ffffffff1660e01b8152600401611257959493929190611f4e565b6000604051808303818588803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b50505050507fd0905d621f104066424412dcaf4dd7189ca00660fc08a026e5927026b8afa82c338e8e8585876112ba9190611c9a565b8e8e6040516112cf9796959493929190611f93565b60405180910390a150505b5050505050505050505050505050565b3360009081526020819052604090205460ff166113195760405162461bcd60e51b81526004016104a790611db3565b6103e882111561136b5760405162461bcd60e51b815260206004820152601c60248201527f6665652063616e206e6f74206265206d6f7265207468616e203130250000000060448201526064016104a7565b6002829055600380546001600160a01b0319166001600160a01b0383169081179091556040805184815260208101929092527fc8242dc5446855370b781abbfc5d882af1d1a3cc29143216aba3558feb0ce925910160405180910390a15050565b3360009081526020819052604090205460ff166113fb5760405162461bcd60e51b81526004016104a790611db3565b6000918252600c602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b3360009081526020819052604090205460ff166114585760405162461bcd60e51b81526004016104a790611db3565b600955565b60008061146983611527565b9050801561149457600354611487906001600160a01b031682611564565b6114918184611c9a565b92505b5090919050565b60006127106009546127106114b09190611c9a565b6114ba9084611b74565b6114c49190611b93565b92915050565b6001600160a01b03821660008181526020818152604091829020805460ff191685151590811790915591519182527ff74826f11048fa8ecf33e91132bf280f6582ed97548a84e426b56e98526b9316910160405180910390a25050565b600060025460001415801561154657506003546001600160a01b031615155b1561155c57612710600254836114ba9190611b74565b506000919050565b600080600080600085875af19050806115b55760405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b60448201526064016104a7565b505050565b82805482825590600052602060002090810192821561160f579160200282015b8281111561160f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906115da565b5061161b92915061161f565b5090565b5b8082111561161b5760008155600101611620565b6001600160a01b038116811461164957600080fd5b50565b60006020828403121561165e57600080fd5b813561166981611634565b9392505050565b60008060006060848603121561168557600080fd5b833561169081611634565b925060208401356116a081611634565b929592945050506040919091013590565b6000602082840312156116c357600080fd5b5035919050565b801515811461164957600080fd5b600080604083850312156116eb57600080fd5b82356116f681611634565b91506020830135611706816116ca565b809150509250929050565b60008060008060008060a0878903121561172a57600080fd5b8635955060208701359450604087013561174381611634565b9350606087013561175381611634565b9250608087013567ffffffffffffffff8082111561177057600080fd5b818901915089601f83011261178457600080fd5b81358181111561179357600080fd5b8a60208260051b85010111156117a857600080fd5b6020830194508093505050509295509295509295565b600080604083850312156117d157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561181f5761181f6117e0565b604052919050565b600067ffffffffffffffff821115611841576118416117e0565b50601f01601f191660200190565b600082601f83011261186057600080fd5b813561187361186e82611827565b6117f6565b81815284602083860101111561188857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156118be57600080fd5b863561ffff811681146118d057600080fd5b9550602087013567ffffffffffffffff808211156118ed57600080fd5b6118f98a838b0161184f565b9650604089013595506060890135915061191282611634565b9093506080880135925060a0880135908082111561192f57600080fd5b5061193c89828a0161184f565b9150509295509295509295565b6000806040838503121561195c57600080fd5b82359150602083013561170681611634565b634e487b7160e01b600052601260045260246000fd5b6000826119935761199361196e565b500690565b600081518084526020808501945080840160005b838110156119d15781516001600160a01b0316875295820195908201906001016119ac565b509495945050505050565b600060018060a01b038088168352808716602084015260a06040840152611a0660a0840187611998565b9416606083015250608001529392505050565b60005b83811015611a34578181015183820152602001611a1c565b83811115611a43576000848401525b50505050565b60008151808452611a61816020860160208601611a19565b601f01601f19169290920160200192915050565b80518252602081015160208301526000604082015160606040850152611a9e6060850182611a49565b949350505050565b61ffff8616815260ff8516602082015260a060408201526000611acc60a0830186611a49565b8281036060840152611ade8186611a49565b90508281036080840152611af28185611a75565b98975050505050505050565b60008060408385031215611b1157600080fd5b505080516020909101519092909150565b600060208284031215611b3457600080fd5b815160ff8116811461166957600080fd5b600060208284031215611b5757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611b8e57611b8e611b5e565b500290565b600082611ba257611ba261196e565b500490565b600181815b80851115611be2578160001904821115611bc857611bc8611b5e565b80851615611bd557918102915b93841c9390800290611bac565b509250929050565b600082611bf9575060016114c4565b81611c06575060006114c4565b8160018114611c1c5760028114611c2657611c42565b60019150506114c4565b60ff841115611c3757611c37611b5e565b50506001821b6114c4565b5060208310610133831016604e8410600b8410161715611c65575081810a6114c4565b611c6f8383611ba7565b8060001904821115611c8357611c83611b5e565b029392505050565b600061166960ff841683611bea565b600082821015611cac57611cac611b5e565b500390565b600060208284031215611cc357600080fd5b815161166981611634565b634e487b7160e01b600052603260045260246000fd5b848152608060208201526000611cfd6080830186611998565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215611d2b57600080fd5b8151611669816116ca565b600061012061ffff8c1683528a602084015289604084015260018060a01b03891660608401528760808401528660a08401528060c0840152611d7a81840187611a75565b905082810360e0840152611d8e8186611a49565b9050828103610100840152611da38185611a49565b9c9b505050505050505050505050565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b8581526001600160a01b038581166020808401919091528582166040840152608060608401819052830184905260009185919060a08501845b87811015611e39578435611e2581611634565b831682529383019390830190600101611e12565b509a9950505050505050505050565b8051611e5381611634565b919050565b600080600080600060a08688031215611e7057600080fd5b8551611e7b81611634565b6020870151909550611e8c81611634565b604087015190945067ffffffffffffffff811115611ea957600080fd5b8601601f81018813611eba57600080fd5b8051611ec861186e82611827565b818152896020838501011115611edd57600080fd5b611eee826020830160208601611a19565b9450611eff91505060608701611e48565b9150608086015190509295509295909350565b85815284602082015260a060408201526000611f3160a0830186611998565b6001600160a01b0394909416606083015250608001529392505050565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090611f8190830185611a49565b90508260808301529695505050505050565b600060018060a01b03808a168352808916602084015287604084015286606084015285608084015280851660a08401525060e060c0830152611fd860e0830184611a49565b999850505050505050505056fea2646970667358221220b526ff5f0754f3ea6a8e0e07a7f1184c59e757b9a6a1c3c06ea2a90f177eff3564736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e980000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
-----Decoded View---------------
Arg [0] : _stargate (address): 0x8731d54E9D02c286767d56ac03e8037C07e01e98
Arg [1] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _bridgeToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [3] : _ethOracle (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e98
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.