More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 449 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap And Execute | 18131056 | 512 days ago | IN | 0.14158031 ETH | 0.00293839 | ||||
Swap And Execute | 18131053 | 512 days ago | IN | 0.14158031 ETH | 0.00317655 | ||||
Swap And Execute | 18115920 | 514 days ago | IN | 0.02963782 ETH | 0.0051829 | ||||
Swap And Execute | 18101035 | 516 days ago | IN | 0.14990032 ETH | 0.00262706 | ||||
Bridge And Execu... | 18093596 | 517 days ago | IN | 0.01274031 ETH | 0.0151965 | ||||
Swap And Execute | 18091627 | 518 days ago | IN | 0.00895082 ETH | 0.00288583 | ||||
Swap And Execute | 18091624 | 518 days ago | IN | 0.00895082 ETH | 0.00292316 | ||||
Swap And Execute | 18091438 | 518 days ago | IN | 0.43035953 ETH | 0.00405331 | ||||
Bridge And Execu... | 18086357 | 518 days ago | IN | 0.01250191 ETH | 0.01377097 | ||||
Swap And Execute | 18061472 | 522 days ago | IN | 0.18489135 ETH | 0.00306113 | ||||
Swap And Execute | 18060472 | 522 days ago | IN | 0.19468848 ETH | 0.00277766 | ||||
Swap And Execute | 18060469 | 522 days ago | IN | 0.19468848 ETH | 0.00360183 | ||||
Swap And Execute | 18054839 | 523 days ago | IN | 0.16429492 ETH | 0.00274952 | ||||
Bridge And Execu... | 18051130 | 523 days ago | IN | 0.012303 ETH | 0.00440908 | ||||
Bridge And Execu... | 18050944 | 523 days ago | IN | 0.012303 ETH | 0.00492046 | ||||
Swap And Execute | 18049489 | 524 days ago | IN | 0.1702601 ETH | 0.00347532 | ||||
Swap And Execute | 18046001 | 524 days ago | IN | 0.18707172 ETH | 0.00318362 | ||||
Swap And Execute | 18037016 | 525 days ago | IN | 0.17722202 ETH | 0.00735293 | ||||
Swap And Execute | 18036349 | 525 days ago | IN | 0.0425566 ETH | 0.00863239 | ||||
Swap And Execute | 18035246 | 526 days ago | IN | 0.17948708 ETH | 0.00608306 | ||||
Swap And Execute | 18034604 | 526 days ago | IN | 0.17683786 ETH | 0.00557375 | ||||
Swap And Execute | 18033042 | 526 days ago | IN | 0.18058256 ETH | 0.0036266 | ||||
Swap And Execute | 18032731 | 526 days ago | IN | 0.18243366 ETH | 0.00370088 | ||||
Swap And Execute | 18032615 | 526 days ago | IN | 0.18027073 ETH | 0.00343538 | ||||
Bridge And Execu... | 18029086 | 526 days ago | IN | 0.0039408 ETH | 0.01193421 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18131056 | 512 days ago | 0.14081031 ETH | ||||
18131056 | 512 days ago | 0.00077 ETH | ||||
18131053 | 512 days ago | 0.14081031 ETH | ||||
18131053 | 512 days ago | 0.00077 ETH | ||||
18115920 | 514 days ago | 0.02886782 ETH | ||||
18115920 | 514 days ago | 0.00077 ETH | ||||
18101035 | 516 days ago | 0.14913032 ETH | ||||
18101035 | 516 days ago | 0.00077 ETH | ||||
18093596 | 517 days ago | 0.00162894 ETH | ||||
18093596 | 517 days ago | 0.01034136 ETH | ||||
18093596 | 517 days ago | 0.00077 ETH | ||||
18091627 | 518 days ago | 0.00818082 ETH | ||||
18091627 | 518 days ago | 0.00077 ETH | ||||
18091624 | 518 days ago | 0.00818082 ETH | ||||
18091624 | 518 days ago | 0.00077 ETH | ||||
18091438 | 518 days ago | 0.42958953 ETH | ||||
18091438 | 518 days ago | 0.00077 ETH | ||||
18086357 | 518 days ago | 0.00139055 ETH | ||||
18086357 | 518 days ago | 0.01034136 ETH | ||||
18086357 | 518 days ago | 0.00077 ETH | ||||
18061472 | 522 days ago | 0.18412135 ETH | ||||
18061472 | 522 days ago | 0.00077 ETH | ||||
18060472 | 522 days ago | 0.19391848 ETH | ||||
18060472 | 522 days ago | 0.00077 ETH | ||||
18060469 | 522 days ago | 0.19391848 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Core
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import {ICore} from "./interfaces/ICore.sol"; import {Dispatcher} from "./base/Dispatcher.sol"; import {IERC20} from "@openzeppelin-contracts/contracts/interfaces/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; import {LzBridgeData, TokenData} from "./lib/CoreStructs.sol"; import {IStargateReceiver} from "./interfaces/stargate/IStargateReceiver.sol"; import {IStargateRouter} from "./interfaces/stargate/IStargateRouter.sol"; import {IWrappedToken} from "./interfaces/IWrappedToken.sol"; import {FeeOperator} from "./utils/FeeOperator.sol"; contract Core is ICore, FeeOperator, Dispatcher, IStargateReceiver { constructor( address _executor, address _stargateRouter, address _uniswapRouter, address _wrappedNative, address _sgETH ) Dispatcher(_executor, _stargateRouter, _uniswapRouter, _wrappedNative, _sgETH) {} /** * @dev Swaps currency from the incoming to the outgoing token and executes a transaction with payment. * @param target The address of the target contract for the payment transaction. * @param paymentOperator The operator address for payment transfers requiring erc20 approvals. * @param tokenData The token swap data and payment transaction payload */ function swapAndExecute(address target, address paymentOperator, TokenData calldata tokenData) external payable handleFees(0, tokenData.amountIn, tokenData.tokenIn) { _receiveErc20(tokenData.amountIn, tokenData.tokenIn); _swapAndExecute(msg.sender, target, paymentOperator, block.timestamp, tokenData); } /** * @dev Bridges funds in native or erc20 and a payment transaction payload to the destination chain * @param lzBridgeData The configuration for the cross bridge transaction * @param tokenData The token swap data and payment transaction payload * @param lzTxObj The configuration of gas and dust for post bridge execution */ function bridgeAndExecute( LzBridgeData calldata lzBridgeData, TokenData calldata tokenData, IStargateRouter.lzTxObj calldata lzTxObj ) external payable handleFees(lzBridgeData.fee, tokenData.amountIn, tokenData.tokenIn) { _receiveErc20(tokenData.amountIn, tokenData.tokenIn); address tokenIn = tokenData.tokenIn; if (tokenData.tokenIn == address(0)) { tokenIn = tokenData.tokenOut == SG_ETH ? SG_ETH : WRAPPED_NATIVE; IWrappedToken(tokenIn).deposit{value: tokenData.amountIn}(); } // only swap if we need to if (tokenIn != tokenData.tokenOut) { _swapExactOutput( msg.sender, tokenIn, tokenData.amountIn, tokenData.amountOut, block.timestamp, tokenData.path ); } if (tokenIn == tokenData.tokenOut && tokenData.amountOut > tokenData.amountIn) { revert BridgeOutputExceedsInput(); } _approveAndBridge(tokenData.tokenOut, tokenData.amountOut, lzBridgeData, lzTxObj, tokenData.payload); } /* * @dev Called by the Stargate Router on the destination chain upon bridging funds. * @dev unused @param _srcChainId The remote chainId sending the tokens. * @dev unused @param _srcAddress The remote Bridge address. * @dev unused @param _nonce The message ordering nonce. * @param _token The token contract on the local chain. * @param amountLD The qty of local _token contract tokens. * @param payload The bytes containing the execution paramaters. */ function sgReceive( uint16, // _srcChainid bytes memory, // _srcAddress uint256, // _nonce address _token, uint256 amountLD, bytes memory payload ) external override { if (msg.sender != address(STARGATE_ROUTER)) { revert OnlyStargateRouter(); } ( address sender, address target, address _paymentToken, address paymentOperator, uint256 _amountOutMin, bytes memory path, bytes memory callData ) = abi.decode(payload, (address, address, address, address, uint256, bytes, bytes)); TokenData memory tokenData = TokenData(amountLD, _amountOutMin, _token, _paymentToken, path, callData); _swapAndExecute(sender, target, paymentOperator, block.timestamp, tokenData); emit ReceivedOnDestination(_token, amountLD); } function withdraw(IERC20 token) external onlyOwner { SafeERC20.safeTransfer(token, msg.sender, token.balanceOf(address(this))); } function withdrawEth() external onlyOwner { (bool success,) = payable(msg.sender).call{value: address(this).balance}(""); require(success, "Could not drain ETH"); } /// @notice To receive ETH from WETH and NFT protocols receive() external payable {} }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import {LzBridgeData, TokenData} from "../lib/CoreStructs.sol"; import {IStargateRouter} from "../interfaces/stargate/IStargateRouter.sol"; interface ICore { /* * @dev Only Stargate Router can perform this operation. */ error OnlyStargateRouter(); /** * @dev Swaps currency from the incoming to the outgoing token and executes a transaction with payment. * @param target The address of the target contract for the payment transaction. * @param paymentOperator The operator address for payment transfers requiring erc20 approvals. * @param tokenData The token swap data and payment transaction payload */ function swapAndExecute(address target, address paymentOperator, TokenData calldata tokenData) external payable; /** * @dev Bridges funds in native or erc20 and a payment transaction payload to the destination chain * @param lzBridgeData The configuration for the cross bridge transaction * @param tokenData The token swap data and payment transaction payload * @param lzTxObj The configuration of gas and dust for post bridge execution */ function bridgeAndExecute( LzBridgeData calldata lzBridgeData, TokenData calldata tokenData, IStargateRouter.lzTxObj calldata lzTxObj ) external payable; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import {BoxImmutables} from "./BoxImmutables.sol"; import {IWrappedToken} from "../interfaces/IWrappedToken.sol"; import {IERC20} from "@openzeppelin-contracts/contracts/interfaces/IERC20.sol"; import {Ownable} from "@openzeppelin-contracts/contracts/access/Ownable.sol"; import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; import {SafeERC20} from "@openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; import {LzBridgeData, TokenData} from "../lib/CoreStructs.sol"; import {IStargateRouter} from "../interfaces/stargate/IStargateRouter.sol"; import {IExecutor} from "../interfaces/IExecutor.sol"; contract Dispatcher is BoxImmutables, Ownable { constructor( address _executor, address _stargateRouter, address _uniswapRouter, address _wrappedNative, address _sgEth ) BoxImmutables(_executor, _stargateRouter, _uniswapRouter, _wrappedNative, _sgEth) {} /** * @dev Internal function to handle receiving erc20 tokens for bridging and swapping. * @param amountIn The amount of native or erc20 being transferred. * @param tokenIn The address of the token being transferred. */ function _receiveErc20(uint256 amountIn, address tokenIn) internal { if (tokenIn != address(0)) { SafeERC20.safeTransferFrom(IERC20(tokenIn), msg.sender, address(this), amountIn); } } event BridgedExecutionUnsuccessful(); event RefundUnsuccessful(); error ExecutionUnsuccessful(); error SwapOutputExceedsInput(); error BridgeOutputExceedsInput(); /** * @dev Internal function to approve an erc20 token and perform a cross chain swap using Stargate Router. * @param bridgeToken The erc20 which will be approved and transferred. * @param amountOut The amount of bridge token being transferred. * @param lzBridgeData The configuration for the cross bridge transaction. * @param lzTxObj The configuration of gas and dust for post bridge execution. * @param payload The bytes containing execution parameters for post bridge execution. */ function _approveAndBridge( address bridgeToken, uint256 amountOut, LzBridgeData calldata lzBridgeData, IStargateRouter.lzTxObj calldata lzTxObj, bytes calldata payload ) internal { // approve for bridge SafeERC20.safeIncreaseAllowance(IERC20(bridgeToken), STARGATE_ROUTER, amountOut); IStargateRouter(STARGATE_ROUTER).swap{value: lzBridgeData.fee}( lzBridgeData._dstChainId, // send to LayerZero chainId lzBridgeData._srcPoolId, // source pool id lzBridgeData._dstPoolId, // dst pool id payable(msg.sender), // refund adddress. extra gas (if any) is returned to this address amountOut, // quantity to swap (amountOut * 994) / 1000, // the min qty you would accept on the destination, fee is 6 bips lzTxObj, // additional gasLimit increase, airdrop, at address abi.encodePacked(lzBridgeData._bridgeAddress), // the address to send the tokens to on the destination payload // bytes param, if you wish to send additional payload you can abi.encode() them here ); } /** * @dev Internal function to swap tokens for an exact output amount using Uniswap v3 SwapRouter. * @param sender The account receiving any refunds, typically the EOA which initiated the transaction. * @param tokenIn The input token for the swap, use zero address to convert native to erc20 wrapped native. * @param amountInMaximum The maximum amount allocated to swap for the exact amount out. * @param amountOut The exact output amount of tokens desired from the swap. * @param deadline The deadline for execution of the Uniswap transaction. * @param path The encoded sequences of pools and fees required to perform the swap. */ function _swapExactOutput( address sender, address tokenIn, uint256 amountInMaximum, uint256 amountOut, uint256 deadline, bytes memory path ) internal returns (bool success) { // deposit native into wrapped native if necessary if (tokenIn == address(0)) { IWrappedToken(WRAPPED_NATIVE).deposit{value: amountInMaximum}(); tokenIn = WRAPPED_NATIVE; } // approve router to use our wrapped native SafeERC20.safeIncreaseAllowance(IERC20(tokenIn), UNISWAP_ROUTER, amountInMaximum); // setup the parameters for multi hop swap ISwapRouter.ExactOutputParams memory params = ISwapRouter.ExactOutputParams({ path: path, recipient: address(this), deadline: deadline, amountOut: amountOut, amountInMaximum: amountInMaximum }); success = true; uint256 refund; // perform the swap and calculate any excess erc20 funds if (msg.sender == STARGATE_ROUTER) { try ISwapRouter(UNISWAP_ROUTER).exactOutput(params) returns (uint256 amountIn) { refund = amountInMaximum - amountIn; } catch { refund = amountInMaximum; success = false; } } else { uint256 amountIn = ISwapRouter(UNISWAP_ROUTER).exactOutput(params); refund = amountInMaximum - amountIn; } // refund any excess erc20 funds to sender if (refund > 0) { SafeERC20.safeDecreaseAllowance(IERC20(tokenIn), UNISWAP_ROUTER, refund); SafeERC20.safeTransfer(IERC20(tokenIn), sender, refund); } } /** * @dev Internal function to swaps currency from the incoming to the outgoing token and execute a transaction with payment. * @param sender The account receiving any refunds, typically the EOA which initiated the transaction. * @param target The address of the target contract for the payment transaction. * @param paymentOperator The operator address for payment transfers requiring erc20 approvals. * @param deadline The deadline for execution of the uniswap transaction. * @param data The token swap data and post bridge execution payload. */ function _swapAndExecute( address sender, address target, address paymentOperator, uint256 deadline, TokenData memory data ) internal { bool success = true; // confirm native currency output does not exceed native currency input if (data.tokenIn == data.tokenOut && data.amountOut > data.amountIn) { if (msg.sender == STARGATE_ROUTER) { _refund(sender, data.tokenIn, data.amountIn); success = false; } else { revert SwapOutputExceedsInput(); } } // if necessary, swap incoming and outgoing tokens and unwrap native funds if (data.tokenIn != data.tokenOut) { if (data.tokenIn == WRAPPED_NATIVE && data.tokenOut == address(0)) { // unwrap native funds IWrappedToken(WRAPPED_NATIVE).withdraw(data.amountOut); } else if (data.tokenIn != SG_ETH || data.tokenOut != address(0)) { success = _swapExactOutput(sender, data.tokenIn, data.amountIn, data.amountOut, deadline, data.path); if (data.tokenOut == address(0)) { IWrappedToken(WRAPPED_NATIVE).withdraw(data.amountOut); } } } if (success) { if (data.tokenOut == address(0)) { // complete payment transaction with native currency try IExecutor(EXECUTOR).execute{value: data.amountOut}(target, paymentOperator, data) returns ( bool executionSuccess ) { success = executionSuccess; } catch { success = false; } } else { // complete payment transaction with erc20 using executor SafeERC20.safeIncreaseAllowance(IERC20(data.tokenOut), EXECUTOR, data.amountOut); try IExecutor(EXECUTOR).execute(target, paymentOperator, data) returns (bool executionSuccess) { success = executionSuccess; } catch { success = false; } } if (!success) { if (msg.sender == STARGATE_ROUTER) { _refund(sender, data.tokenOut, data.amountOut); emit BridgedExecutionUnsuccessful(); } else { revert ExecutionUnsuccessful(); } } } } /** * @dev Internal function to handle refund transfers of native or erc20 to a recipient. * @param to The recipient of the refund transfer. * @param token The token being transferred, use zero address for native currency. * @param amount The amount of native or erc20 being transferred to the recipient. */ function _refund(address to, address token, uint256 amount) internal { if (token == address(0)) { (bool success,) = payable(to).call{value: amount}(""); if (!success) { emit RefundUnsuccessful(); } } else { SafeERC20.safeTransfer(IERC20(token), to, amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; /* * @dev A parameter object containing data for bridging funds and an between chains */ struct LzBridgeData { uint120 _srcPoolId; uint120 _dstPoolId; uint16 _dstChainId; address _bridgeAddress; uint96 fee; } /* * @dev A parameter object containing token swap data and a payment transaction payload */ struct TokenData { uint256 amountIn; uint256 amountOut; address tokenIn; address tokenOut; bytes path; bytes payload; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; interface IStargateReceiver { event ReceivedOnDestination(address token, uint256 amountLD); /* * @dev Called by the Stargate Router on the destination chain upon bridging funds * @dev unused @param _srcChainId The remote chainId sending the tokens * @dev unused @param _srcAddress The remote Bridge address * @dev unused @param _nonce The message ordering nonce * @param _token The token contract on the local chain * @param amountLD The qty of local _token contract tokens * @param payload The bytes containing the execution paramaters */ function sgReceive( uint16, // _srcChainId bytes memory, // _srcAddress uint256, // _nonce address _token, uint256 amountLD, bytes memory payload ) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; pragma abicoder v2; interface IStargateRouter { struct lzTxObj { uint256 dstGasForCall; uint256 dstNativeAmount; bytes dstNativeAddr; } function addLiquidity(uint256 _poolId, uint256 _amountLD, address _to) external; 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; function redeemRemote( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, uint256 _minAmountLD, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function instantRedeemLocal(uint16 _srcPoolId, uint256 _amountLP, address _to) external returns (uint256); function redeemLocal( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function sendCredits(uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress) external payable; function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, lzTxObj memory _lzTxParams ) external view returns (uint256, uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; interface IWrappedToken { function withdraw(uint256 wad) external; function deposit() external payable; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import "../interfaces/IFeeManager.sol"; import {Ownable} from "@openzeppelin-contracts/contracts/access/Ownable.sol"; /** * @title FeeOperator */ abstract contract FeeOperator is Ownable { /* * @dev The address of the fee manager. */ address public feeManager; /* * @dev Emitted when the fee manager is updated. * @param feeManager The address of the new fee manager. */ event FeeManagerUpdated(address feeManager); /* * @dev Insufficient funds to complete the transaction and pay fees. */ error InsufficientFees(); /* * @dev Fees were unable to be transferred to the fee manager. */ error FeeTransferFailed(); /* * @dev Excess funds were unable to be refunded to the caller. */ error RefundFailed(); /** * @dev Function modifier to handle transaction fees for bridging and swapping. * @param amountIn The amount of native or erc20 being transferred. * @param tokenIn The address of the token being transferred, zero address for native currency. */ modifier handleFees(uint256 bridgeFee, uint256 amountIn, address tokenIn) { if (feeManager != address(0)) { (uint256 fee, uint256 commission) = IFeeManager(feeManager).calculateFees(amountIn, tokenIn); uint256 boxFees = fee + commission; uint256 amountRequired = tokenIn == address(0) ? amountIn + bridgeFee + boxFees : bridgeFee + boxFees; if (msg.value < amountRequired) { revert InsufficientFees(); } _transferFees(boxFees); _transferRefund(msg.value - amountRequired); } _; } /** * @dev Updates the address of the fee manager used for calculating and collecting fees. * @param _feeManager The address of the new fee manager. */ function setFeeManager(address _feeManager) external onlyOwner { feeManager = _feeManager; emit FeeManagerUpdated(_feeManager); } /** * @dev Internal function to transfer fees to the fee manager. * @param fees The amount of fees being transferred. */ function _transferFees(uint256 fees) internal { (bool success,) = payable(feeManager).call{value: fees}(""); if (!success) { revert FeeTransferFailed(); } } /** * @dev Internal function to transfer excess funds to the caller. * @param refund The amount of funds to transfer. */ function _transferRefund(uint256 refund) internal { if (refund > 0) { (bool success,) = payable(msg.sender).call{value: refund}(""); if (!success) { revert RefundFailed(); } } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; contract BoxImmutables { address internal immutable STARGATE_ROUTER; address internal immutable UNISWAP_ROUTER; address internal immutable WRAPPED_NATIVE; address internal immutable SG_ETH; address internal immutable EXECUTOR; constructor( address _executor, address _stargateRouter, address _uniswapRouter, address _wrappedNative, address _sgEth ) { EXECUTOR = _executor; WRAPPED_NATIVE = _wrappedNative; SG_ETH = _sgEth; STARGATE_ROUTER = _stargateRouter; UNISWAP_ROUTER = _uniswapRouter; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; pragma abicoder v2; import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol'; /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface ISwapRouter is IUniswapV3SwapCallback { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import {TokenData} from "../lib/CoreStructs.sol"; interface IExecutor { error OnlyCoreAuth(); event CoreUpdated(address newCore); /** * @dev executes call from dispatcher, creating additional checks on arbitrary calldata * @param target The address of the target contract for the payment transaction. * @param paymentOperator The operator address for payment transfers requiring erc20 approvals. * @param data The token swap data and post bridge execution payload. */ function execute(address target, address paymentOperator, TokenData memory data) external payable returns (bool success); /** * @dev sets core address * @param core core implementation address */ function setCore(address core) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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://consensys.net/diligence/blog/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; interface IFeeManager { error WithdrawFailed(); function setFees(uint256 _fee, uint256 _commissionBPS) external; function calculateFees(uint256 amountIn, address tokenIn) external view returns (uint256 fee, uint256 commission); function redeemFees() external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) 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: GPL-2.0-or-later pragma solidity >=0.5.0; /// @title Callback for IUniswapV3PoolActions#swap /// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface interface IUniswapV3SwapCallback { /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. /// @dev In the implementation you must pay the pool tokens owed for the swap. /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; }
{ "remappings": [ "@openzeppelin-contracts/=lib/openzeppelin-contracts/", "@uniswap/v3-core/=lib/v3-core/", "@uniswap/v3-periphery/=lib/v3-periphery/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", "solmate/=lib/solmate/src/", "v3-core/=lib/v3-core/", "v3-periphery/=lib/v3-periphery/contracts/" ], "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":"_executor","type":"address"},{"internalType":"address","name":"_stargateRouter","type":"address"},{"internalType":"address","name":"_uniswapRouter","type":"address"},{"internalType":"address","name":"_wrappedNative","type":"address"},{"internalType":"address","name":"_sgETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BridgeOutputExceedsInput","type":"error"},{"inputs":[],"name":"ExecutionUnsuccessful","type":"error"},{"inputs":[],"name":"FeeTransferFailed","type":"error"},{"inputs":[],"name":"InsufficientFees","type":"error"},{"inputs":[],"name":"OnlyStargateRouter","type":"error"},{"inputs":[],"name":"RefundFailed","type":"error"},{"inputs":[],"name":"SwapOutputExceedsInput","type":"error"},{"anonymous":false,"inputs":[],"name":"BridgedExecutionUnsuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeManager","type":"address"}],"name":"FeeManagerUpdated","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":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"ReceivedOnDestination","type":"event"},{"anonymous":false,"inputs":[],"name":"RefundUnsuccessful","type":"event"},{"inputs":[{"components":[{"internalType":"uint120","name":"_srcPoolId","type":"uint120"},{"internalType":"uint120","name":"_dstPoolId","type":"uint120"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_bridgeAddress","type":"address"},{"internalType":"uint96","name":"fee","type":"uint96"}],"internalType":"struct LzBridgeData","name":"lzBridgeData","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct TokenData","name":"tokenData","type":"tuple"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"lzTxObj","type":"tuple"}],"name":"bridgeAndExecute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeManager","type":"address"}],"name":"setFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"sgReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"paymentOperator","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct TokenData","name":"tokenData","type":"tuple"}],"name":"swapAndExecute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b5060405162002473380380620024738339810160408190526200003591620000e8565b6001600160a01b038581166101005282811660c05281811660e052848116608052831660a05284848484846200006b336200007b565b5050505050505050505062000158565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000e357600080fd5b919050565b600080600080600060a086880312156200010157600080fd5b6200010c86620000cb565b94506200011c60208701620000cb565b93506200012c60408701620000cb565b92506200013c60608701620000cb565b91506200014c60808701620000cb565b90509295509295909350565b60805160a05160c05160e0516101005161225f62000214600039600081816112c401528181611355015261139501526000818161044f015281816104b5015261118801526000818161048f01528181610bd801528181610c4c015281816110ae0152818161111d015261122b015260008181610c7401528181610d0d01528181610db80152610e4c01526000818161082f01528181610cc801528181610e8e01528181610ebd015281816110310152611427015261225f6000f3fe6080604052600436106100955760003560e01c806399bab9531161005957806399bab95314610141578063a0ef91df14610154578063ab8236f314610169578063d0fb020314610189578063f2fde38b146101a957600080fd5b8063472d35b9146100a157806351cff8d9146100c3578063715018a6146100e357806385f0c055146100f85780638da5cb5b1461010b57600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046119c8565b6101c9565b005b3480156100cf57600080fd5b506100c16100de3660046119c8565b610225565b3480156100ef57600080fd5b506100c16102a5565b6100c1610106366004611a04565b6102b9565b34801561011757600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b6100c161014f366004611a87565b610635565b34801561016057600080fd5b506100c1610789565b34801561017557600080fd5b506100c1610184366004611be9565b610824565b34801561019557600080fd5b50600154610125906001600160a01b031681565b3480156101b557600080fd5b506100c16101c43660046119c8565b61093c565b6101d16109b2565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49060200160405180910390a150565b61022d6109b2565b6040516370a0823160e01b81523060048201526102a290829033906001600160a01b038316906370a0823190602401602060405180830381865afa158015610279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029d9190611c84565b610a0c565b50565b6102ad6109b2565b6102b76000610a74565b565b6102c960a0840160808501611c9d565b6001600160601b031682356102e460608501604086016119c8565b6001546001600160a01b0316156103f757600154604051623f992d60e81b8152600481018490526001600160a01b0383811660248301526000928392911690633f992d00906044016040805180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611cc6565b9092509050600061037d8284611d00565b905060006001600160a01b0385161561039f5761039a8288611d00565b6103b4565b816103aa8888611d00565b6103b49190611d00565b9050803410156103d757604051638d53e55360e01b815260040160405180910390fd5b6103e082610ac4565b6103f26103ed8234611d19565b610b3c565b505050505b610411853561040c60608801604089016119c8565b610bab565b600061042360608701604088016119c8565b9050600061043760608801604089016119c8565b6001600160a01b031603610530576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661047f60808801606089016119c8565b6001600160a01b0316146104b3577f00000000000000000000000000000000000000000000000000000000000000006104d5565b7f00000000000000000000000000000000000000000000000000000000000000005b9050806001600160a01b031663d0e30db087600001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b50505050505b61054060808701606088016119c8565b6001600160a01b0316816001600160a01b0316146105ae576105ac3382883560208a01354261057260808d018d611d2c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bc692505050565b505b6105be60808701606088016119c8565b6001600160a01b0316816001600160a01b03161480156105e2575085356020870135115b1561060057604051633aa8778160e21b815260040160405180910390fd5b61062c61061360808801606089016119c8565b6020880135898861062760a08c018c611d2c565b610e88565b50505050505050565b6000813561064960608401604085016119c8565b6001546001600160a01b03161561075757600154604051623f992d60e81b8152600481018490526001600160a01b0383811660248301526000928392911690633f992d00906044016040805180830381865afa1580156106ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d19190611cc6565b909250905060006106e28284611d00565b905060006001600160a01b03851615610704576106ff8288611d00565b610719565b8161070f8888611d00565b6107199190611d00565b90508034101561073c57604051638d53e55360e01b815260040160405180910390fd5b61074582610ac4565b6107526103ed8234611d19565b505050505b61076c843561040c60608701604088016119c8565b6107813387874261077c89611d7a565b610fef565b505050505050565b6107916109b2565b604051600090339047908381818185875af1925050503d80600081146107d3576040519150601f19603f3d011682016040523d82523d6000602084013e6107d8565b606091505b50509050806102a25760405162461bcd60e51b8152602060048201526013602482015272086deead8c840dcdee840c8e4c2d2dc408aa89606b1b60448201526064015b60405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461086d57604051632b74ca8360e11b815260040160405180910390fd5b60008060008060008060008780602001905181019061088c9190611e86565b965096509650965096509650965060006040518060c001604052808b81526020018581526020018c6001600160a01b03168152602001876001600160a01b031681526020018481526020018381525090506108ea8888874285610fef565b604080516001600160a01b038d168152602081018c90527f9055ece9d44a86bda76b7ffbee0015dcdd504bd121fe9d4afd5300275ee817be910160405180910390a15050505050505050505050505050565b6109446109b2565b6001600160a01b0381166109a95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081b565b6102a281610a74565b6000546001600160a01b031633146102b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081b565b6040516001600160a01b038316602482015260448101829052610a6f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114a7565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610b11576040519150601f19603f3d011682016040523d82523d6000602084013e610b16565b606091505b5050905080610b3857604051634033e4e360e01b815260040160405180910390fd5b5050565b80156102a257604051600090339083908381818185875af1925050503d8060008114610b84576040519150601f19603f3d011682016040523d82523d6000602084013e610b89565b606091505b5050905080610b3857604051633c31275160e21b815260040160405180910390fd5b6001600160a01b03811615610b3857610b388133308561157c565b60006001600160a01b038616610c6e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000095505b610c99867f0000000000000000000000000000000000000000000000000000000000000000876115ba565b506040805160a081018252828152306020820152908101839052606081018490526080810185905260019060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610d9e57604051631e51809360e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f28c049890610d42908590600401611f6e565b6020604051808303816000875af1925050508015610d7d575060408051601f3d908101601f19168201909252610d7a91810190611c84565b60015b610d8c57506000915085610e40565b610d968189611d19565b915050610e40565b604051631e51809360e31b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f28c049890610ded908690600401611f6e565b6020604051808303816000875af1158015610e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e309190611c84565b9050610e3c8189611d19565b9150505b8015610e7c57610e71887f000000000000000000000000000000000000000000000000000000000000000083611667565b610e7c888a83610a0c565b50509695505050505050565b610eb3867f0000000000000000000000000000000000000000000000000000000000000000876115ba565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639fbf10fc610ef260a0870160808801611c9d565b6001600160601b0316610f0b6060880160408901611fc6565b610f186020890189611fe1565b610f2860408a0160208b01611fe1565b338b6103e8610f39826103e261200a565b610f439190612021565b8b8d6060016020810190610f5791906119c8565b604051602001610f7f919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528c8c6040518c63ffffffff1660e01b8152600401610fb59a9998979695949392919061206c565b6000604051808303818588803b158015610fce57600080fd5b505af1158015610fe2573d6000803e3d6000fd5b5050505050505050505050565b60006001905081606001516001600160a01b031682604001516001600160a01b0316148015611022575081516020830151115b1561108b576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036110725761106a8683604001518460000151611770565b50600061108b565b60405163051af23160e31b815260040160405180910390fd5b81606001516001600160a01b031682604001516001600160a01b031614611290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682604001516001600160a01b03161480156110fc575060608201516001600160a01b0316155b15611186576020820151604051632e1a7d4d60e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561116957600080fd5b505af115801561117d573d6000803e3d6000fd5b50505050611290565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682604001516001600160a01b03161415806111d7575060608201516001600160a01b031615155b15611290576111fa86836040015184600001518560200151878760800151610bc6565b60608301519091506001600160a01b0316611290576020820151604051632e1a7d4d60e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050505b80156107815760608201516001600160a01b031661134b576020820151604051637ff8470f60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691637ff8470f916112fd90899089908890600401612159565b60206040518083038185885af193505050508015611338575060408051601f3d908101601f19168201909252611335918101906121d8565b60015b61134457506000611418565b9050611418565b61137e82606001517f000000000000000000000000000000000000000000000000000000000000000084602001516115ba565b604051637ff8470f60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637ff8470f906113ce90889088908790600401612159565b6020604051808303816000875af1925050508015611409575060408051601f3d908101601f19168201909252611406918101906121d8565b60015b61141557506000611418565b90505b80610781576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361148e576114608683606001518460200151611770565b6040517faa1ce04d3f1907473cc34d6c238c3895ca622cf6b7fbb178f12121ffb511274790600090a1610781565b6040516303057bbf60e31b815260040160405180910390fd5b60006114fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118139092919063ffffffff16565b905080516000148061151d57508080602001905181019061151d91906121d8565b610a6f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081b565b6040516001600160a01b03808516602483015283166044820152606481018290526115b49085906323b872dd60e01b90608401610a38565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa15801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e9190611c84565b90506115b48463095ea7b360e01b856116478686611d00565b6040516001600160a01b0390921660248301526044820152606401610a38565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156116b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116db9190611c84565b90508181101561173f5760405162461bcd60e51b815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e63652062604482015268656c6f77207a65726f60b81b606482015260840161081b565b6040516001600160a01b038416602482015282820360448201526115b490859063095ea7b360e01b90606401610a38565b6001600160a01b038216611808576000836001600160a01b03168260405160006040518083038185875af1925050503d80600081146117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b50509050806115b4576040517fbce4cdf514257b7ac06626c0025c56205cd6ad2a60c5528bc72f2893617aef7090600090a150505050565b610a6f828483610a0c565b6060611822848460008561182a565b949350505050565b60608247101561188b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161081b565b600080866001600160a01b031685876040516118a791906121fa565b60006040518083038185875af1925050503d80600081146118e4576040519150601f19603f3d011682016040523d82523d6000602084013e6118e9565b606091505b50915091506118fa87838387611905565b979650505050505050565b6060831561197457825160000361196d576001600160a01b0385163b61196d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081b565b5081611822565b61182283838151156119895781518083602001fd5b8060405162461bcd60e51b815260040161081b9190612216565b6001600160a01b03811681146102a257600080fd5b80356119c3816119a3565b919050565b6000602082840312156119da57600080fd5b81356119e5816119a3565b9392505050565b600060c082840312156119fe57600080fd5b50919050565b600080600083850360e0811215611a1a57600080fd5b60a0811215611a2857600080fd5b5083925060a084013567ffffffffffffffff80821115611a4757600080fd5b611a53878388016119ec565b935060c0860135915080821115611a6957600080fd5b50840160608187031215611a7c57600080fd5b809150509250925092565b600080600060608486031215611a9c57600080fd5b8335611aa7816119a3565b92506020840135611ab7816119a3565b9150604084013567ffffffffffffffff811115611ad357600080fd5b611adf868287016119ec565b9150509250925092565b803561ffff811681146119c357600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715611b3457611b34611afb565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611b6357611b63611afb565b604052919050565b600067ffffffffffffffff821115611b8557611b85611afb565b50601f01601f191660200190565b600082601f830112611ba457600080fd5b8135611bb7611bb282611b6b565b611b3a565b818152846020838601011115611bcc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215611c0257600080fd5b611c0b87611ae9565b9550602087013567ffffffffffffffff80821115611c2857600080fd5b611c348a838b01611b93565b96506040890135955060608901359150611c4d826119a3565b9093506080880135925060a08801359080821115611c6a57600080fd5b50611c7789828a01611b93565b9150509295509295509295565b600060208284031215611c9657600080fd5b5051919050565b600060208284031215611caf57600080fd5b81356001600160601b03811681146119e557600080fd5b60008060408385031215611cd957600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b80820180821115611d1357611d13611cea565b92915050565b81810381811115611d1357611d13611cea565b6000808335601e19843603018112611d4357600080fd5b83018035915067ffffffffffffffff821115611d5e57600080fd5b602001915036819003821315611d7357600080fd5b9250929050565b600060c08236031215611d8c57600080fd5b611d94611b11565b8235815260208301356020820152611dae604084016119b8565b6040820152611dbf606084016119b8565b6060820152608083013567ffffffffffffffff80821115611ddf57600080fd5b611deb36838701611b93565b608084015260a0850135915080821115611e0457600080fd5b50611e1136828601611b93565b60a08301525092915050565b60005b83811015611e38578181015183820152602001611e20565b50506000910152565b600082601f830112611e5257600080fd5b8151611e60611bb282611b6b565b818152846020838601011115611e7557600080fd5b611822826020830160208701611e1d565b600080600080600080600060e0888a031215611ea157600080fd5b8751611eac816119a3565b6020890151909750611ebd816119a3565b6040890151909650611ece816119a3565b6060890151909550611edf816119a3565b608089015160a08a0151919550935067ffffffffffffffff80821115611f0457600080fd5b611f108b838c01611e41565b935060c08a0151915080821115611f2657600080fd5b50611f338a828b01611e41565b91505092959891949750929550565b60008151808452611f5a816020860160208601611e1d565b601f01601f19169290920160200192915050565b602081526000825160a06020840152611f8a60c0840182611f42565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b600060208284031215611fd857600080fd5b6119e582611ae9565b600060208284031215611ff357600080fd5b81356001600160781b03811681146119e557600080fd5b8082028115828204841417611d1357611d13611cea565b60008261203e57634e487b7160e01b600052601260045260246000fd5b500490565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600061012061ffff8d1683526001600160781b03808d166020850152808c1660408501525060018060a01b038a1660608401528860808401528760a08401528060c08401528635818401525060208601356101408301526040860135601e198736030181126120da57600080fd5b860160208101903567ffffffffffffffff8111156120f757600080fd5b80360382131561210657600080fd5b606061016085015261211d61018085018284612043565b91505082810360e08401526121328187611f42565b9050828103610100840152612148818587612043565b9d9c50505050505050505050505050565b600060018060a01b03808616835280851660208401526060604084015283516060840152602084015160808401528060408501511660a08401528060608501511660c084015250608083015160c060e08401526121ba610120840182611f42565b905060a0840151605f19848303016101008501526118fa8282611f42565b6000602082840312156121ea57600080fd5b815180151581146119e557600080fd5b6000825161220c818460208701611e1d565b9190910192915050565b6020815260006119e56020830184611f4256fea2646970667358221220651ce927f97933ef570411a16d849fa00c999649b333235a05591643f03c276064736f6c634300081100330000000000000000000000003684e93ae82b40238911dc71c3875e08e33f4ddc0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e98000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000072e2f4830b9e45d52f80ac08cb2bec0fef72ed9c
Deployed Bytecode
0x6080604052600436106100955760003560e01c806399bab9531161005957806399bab95314610141578063a0ef91df14610154578063ab8236f314610169578063d0fb020314610189578063f2fde38b146101a957600080fd5b8063472d35b9146100a157806351cff8d9146100c3578063715018a6146100e357806385f0c055146100f85780638da5cb5b1461010b57600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046119c8565b6101c9565b005b3480156100cf57600080fd5b506100c16100de3660046119c8565b610225565b3480156100ef57600080fd5b506100c16102a5565b6100c1610106366004611a04565b6102b9565b34801561011757600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b6100c161014f366004611a87565b610635565b34801561016057600080fd5b506100c1610789565b34801561017557600080fd5b506100c1610184366004611be9565b610824565b34801561019557600080fd5b50600154610125906001600160a01b031681565b3480156101b557600080fd5b506100c16101c43660046119c8565b61093c565b6101d16109b2565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49060200160405180910390a150565b61022d6109b2565b6040516370a0823160e01b81523060048201526102a290829033906001600160a01b038316906370a0823190602401602060405180830381865afa158015610279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029d9190611c84565b610a0c565b50565b6102ad6109b2565b6102b76000610a74565b565b6102c960a0840160808501611c9d565b6001600160601b031682356102e460608501604086016119c8565b6001546001600160a01b0316156103f757600154604051623f992d60e81b8152600481018490526001600160a01b0383811660248301526000928392911690633f992d00906044016040805180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611cc6565b9092509050600061037d8284611d00565b905060006001600160a01b0385161561039f5761039a8288611d00565b6103b4565b816103aa8888611d00565b6103b49190611d00565b9050803410156103d757604051638d53e55360e01b815260040160405180910390fd5b6103e082610ac4565b6103f26103ed8234611d19565b610b3c565b505050505b610411853561040c60608801604089016119c8565b610bab565b600061042360608701604088016119c8565b9050600061043760608801604089016119c8565b6001600160a01b031603610530576001600160a01b037f00000000000000000000000072e2f4830b9e45d52f80ac08cb2bec0fef72ed9c1661047f60808801606089016119c8565b6001600160a01b0316146104b3577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26104d5565b7f00000000000000000000000072e2f4830b9e45d52f80ac08cb2bec0fef72ed9c5b9050806001600160a01b031663d0e30db087600001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b50505050505b61054060808701606088016119c8565b6001600160a01b0316816001600160a01b0316146105ae576105ac3382883560208a01354261057260808d018d611d2c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bc692505050565b505b6105be60808701606088016119c8565b6001600160a01b0316816001600160a01b03161480156105e2575085356020870135115b1561060057604051633aa8778160e21b815260040160405180910390fd5b61062c61061360808801606089016119c8565b6020880135898861062760a08c018c611d2c565b610e88565b50505050505050565b6000813561064960608401604085016119c8565b6001546001600160a01b03161561075757600154604051623f992d60e81b8152600481018490526001600160a01b0383811660248301526000928392911690633f992d00906044016040805180830381865afa1580156106ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d19190611cc6565b909250905060006106e28284611d00565b905060006001600160a01b03851615610704576106ff8288611d00565b610719565b8161070f8888611d00565b6107199190611d00565b90508034101561073c57604051638d53e55360e01b815260040160405180910390fd5b61074582610ac4565b6107526103ed8234611d19565b505050505b61076c843561040c60608701604088016119c8565b6107813387874261077c89611d7a565b610fef565b505050505050565b6107916109b2565b604051600090339047908381818185875af1925050503d80600081146107d3576040519150601f19603f3d011682016040523d82523d6000602084013e6107d8565b606091505b50509050806102a25760405162461bcd60e51b8152602060048201526013602482015272086deead8c840dcdee840c8e4c2d2dc408aa89606b1b60448201526064015b60405180910390fd5b336001600160a01b037f0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e98161461086d57604051632b74ca8360e11b815260040160405180910390fd5b60008060008060008060008780602001905181019061088c9190611e86565b965096509650965096509650965060006040518060c001604052808b81526020018581526020018c6001600160a01b03168152602001876001600160a01b031681526020018481526020018381525090506108ea8888874285610fef565b604080516001600160a01b038d168152602081018c90527f9055ece9d44a86bda76b7ffbee0015dcdd504bd121fe9d4afd5300275ee817be910160405180910390a15050505050505050505050505050565b6109446109b2565b6001600160a01b0381166109a95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081b565b6102a281610a74565b6000546001600160a01b031633146102b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081b565b6040516001600160a01b038316602482015260448101829052610a6f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114a7565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610b11576040519150601f19603f3d011682016040523d82523d6000602084013e610b16565b606091505b5050905080610b3857604051634033e4e360e01b815260040160405180910390fd5b5050565b80156102a257604051600090339083908381818185875af1925050503d8060008114610b84576040519150601f19603f3d011682016040523d82523d6000602084013e610b89565b606091505b5050905080610b3857604051633c31275160e21b815260040160405180910390fd5b6001600160a01b03811615610b3857610b388133308561157c565b60006001600160a01b038616610c6e577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc295505b610c99867f000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564876115ba565b506040805160a081018252828152306020820152908101839052606081018490526080810185905260019060007f0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e986001600160a01b03163303610d9e57604051631e51809360e31b81526001600160a01b037f000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564169063f28c049890610d42908590600401611f6e565b6020604051808303816000875af1925050508015610d7d575060408051601f3d908101601f19168201909252610d7a91810190611c84565b60015b610d8c57506000915085610e40565b610d968189611d19565b915050610e40565b604051631e51809360e31b81526000906001600160a01b037f000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564169063f28c049890610ded908690600401611f6e565b6020604051808303816000875af1158015610e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e309190611c84565b9050610e3c8189611d19565b9150505b8015610e7c57610e71887f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156483611667565b610e7c888a83610a0c565b50509695505050505050565b610eb3867f0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e98876115ba565b6001600160a01b037f0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e9816639fbf10fc610ef260a0870160808801611c9d565b6001600160601b0316610f0b6060880160408901611fc6565b610f186020890189611fe1565b610f2860408a0160208b01611fe1565b338b6103e8610f39826103e261200a565b610f439190612021565b8b8d6060016020810190610f5791906119c8565b604051602001610f7f919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528c8c6040518c63ffffffff1660e01b8152600401610fb59a9998979695949392919061206c565b6000604051808303818588803b158015610fce57600080fd5b505af1158015610fe2573d6000803e3d6000fd5b5050505050505050505050565b60006001905081606001516001600160a01b031682604001516001600160a01b0316148015611022575081516020830151115b1561108b576001600160a01b037f0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e981633036110725761106a8683604001518460000151611770565b50600061108b565b60405163051af23160e31b815260040160405180910390fd5b81606001516001600160a01b031682604001516001600160a01b031614611290577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031682604001516001600160a01b03161480156110fc575060608201516001600160a01b0316155b15611186576020820151604051632e1a7d4d60e01b815260048101919091527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561116957600080fd5b505af115801561117d573d6000803e3d6000fd5b50505050611290565b7f00000000000000000000000072e2f4830b9e45d52f80ac08cb2bec0fef72ed9c6001600160a01b031682604001516001600160a01b03161415806111d7575060608201516001600160a01b031615155b15611290576111fa86836040015184600001518560200151878760800151610bc6565b60608301519091506001600160a01b0316611290576020820151604051632e1a7d4d60e01b815260048101919091527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050505b80156107815760608201516001600160a01b031661134b576020820151604051637ff8470f60e01b81526001600160a01b037f0000000000000000000000003684e93ae82b40238911dc71c3875e08e33f4ddc1691637ff8470f916112fd90899089908890600401612159565b60206040518083038185885af193505050508015611338575060408051601f3d908101601f19168201909252611335918101906121d8565b60015b61134457506000611418565b9050611418565b61137e82606001517f0000000000000000000000003684e93ae82b40238911dc71c3875e08e33f4ddc84602001516115ba565b604051637ff8470f60e01b81526001600160a01b037f0000000000000000000000003684e93ae82b40238911dc71c3875e08e33f4ddc1690637ff8470f906113ce90889088908790600401612159565b6020604051808303816000875af1925050508015611409575060408051601f3d908101601f19168201909252611406918101906121d8565b60015b61141557506000611418565b90505b80610781576001600160a01b037f0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e9816330361148e576114608683606001518460200151611770565b6040517faa1ce04d3f1907473cc34d6c238c3895ca622cf6b7fbb178f12121ffb511274790600090a1610781565b6040516303057bbf60e31b815260040160405180910390fd5b60006114fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118139092919063ffffffff16565b905080516000148061151d57508080602001905181019061151d91906121d8565b610a6f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081b565b6040516001600160a01b03808516602483015283166044820152606481018290526115b49085906323b872dd60e01b90608401610a38565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa15801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e9190611c84565b90506115b48463095ea7b360e01b856116478686611d00565b6040516001600160a01b0390921660248301526044820152606401610a38565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156116b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116db9190611c84565b90508181101561173f5760405162461bcd60e51b815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e63652062604482015268656c6f77207a65726f60b81b606482015260840161081b565b6040516001600160a01b038416602482015282820360448201526115b490859063095ea7b360e01b90606401610a38565b6001600160a01b038216611808576000836001600160a01b03168260405160006040518083038185875af1925050503d80600081146117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b50509050806115b4576040517fbce4cdf514257b7ac06626c0025c56205cd6ad2a60c5528bc72f2893617aef7090600090a150505050565b610a6f828483610a0c565b6060611822848460008561182a565b949350505050565b60608247101561188b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161081b565b600080866001600160a01b031685876040516118a791906121fa565b60006040518083038185875af1925050503d80600081146118e4576040519150601f19603f3d011682016040523d82523d6000602084013e6118e9565b606091505b50915091506118fa87838387611905565b979650505050505050565b6060831561197457825160000361196d576001600160a01b0385163b61196d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081b565b5081611822565b61182283838151156119895781518083602001fd5b8060405162461bcd60e51b815260040161081b9190612216565b6001600160a01b03811681146102a257600080fd5b80356119c3816119a3565b919050565b6000602082840312156119da57600080fd5b81356119e5816119a3565b9392505050565b600060c082840312156119fe57600080fd5b50919050565b600080600083850360e0811215611a1a57600080fd5b60a0811215611a2857600080fd5b5083925060a084013567ffffffffffffffff80821115611a4757600080fd5b611a53878388016119ec565b935060c0860135915080821115611a6957600080fd5b50840160608187031215611a7c57600080fd5b809150509250925092565b600080600060608486031215611a9c57600080fd5b8335611aa7816119a3565b92506020840135611ab7816119a3565b9150604084013567ffffffffffffffff811115611ad357600080fd5b611adf868287016119ec565b9150509250925092565b803561ffff811681146119c357600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715611b3457611b34611afb565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611b6357611b63611afb565b604052919050565b600067ffffffffffffffff821115611b8557611b85611afb565b50601f01601f191660200190565b600082601f830112611ba457600080fd5b8135611bb7611bb282611b6b565b611b3a565b818152846020838601011115611bcc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215611c0257600080fd5b611c0b87611ae9565b9550602087013567ffffffffffffffff80821115611c2857600080fd5b611c348a838b01611b93565b96506040890135955060608901359150611c4d826119a3565b9093506080880135925060a08801359080821115611c6a57600080fd5b50611c7789828a01611b93565b9150509295509295509295565b600060208284031215611c9657600080fd5b5051919050565b600060208284031215611caf57600080fd5b81356001600160601b03811681146119e557600080fd5b60008060408385031215611cd957600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b80820180821115611d1357611d13611cea565b92915050565b81810381811115611d1357611d13611cea565b6000808335601e19843603018112611d4357600080fd5b83018035915067ffffffffffffffff821115611d5e57600080fd5b602001915036819003821315611d7357600080fd5b9250929050565b600060c08236031215611d8c57600080fd5b611d94611b11565b8235815260208301356020820152611dae604084016119b8565b6040820152611dbf606084016119b8565b6060820152608083013567ffffffffffffffff80821115611ddf57600080fd5b611deb36838701611b93565b608084015260a0850135915080821115611e0457600080fd5b50611e1136828601611b93565b60a08301525092915050565b60005b83811015611e38578181015183820152602001611e20565b50506000910152565b600082601f830112611e5257600080fd5b8151611e60611bb282611b6b565b818152846020838601011115611e7557600080fd5b611822826020830160208701611e1d565b600080600080600080600060e0888a031215611ea157600080fd5b8751611eac816119a3565b6020890151909750611ebd816119a3565b6040890151909650611ece816119a3565b6060890151909550611edf816119a3565b608089015160a08a0151919550935067ffffffffffffffff80821115611f0457600080fd5b611f108b838c01611e41565b935060c08a0151915080821115611f2657600080fd5b50611f338a828b01611e41565b91505092959891949750929550565b60008151808452611f5a816020860160208601611e1d565b601f01601f19169290920160200192915050565b602081526000825160a06020840152611f8a60c0840182611f42565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b600060208284031215611fd857600080fd5b6119e582611ae9565b600060208284031215611ff357600080fd5b81356001600160781b03811681146119e557600080fd5b8082028115828204841417611d1357611d13611cea565b60008261203e57634e487b7160e01b600052601260045260246000fd5b500490565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600061012061ffff8d1683526001600160781b03808d166020850152808c1660408501525060018060a01b038a1660608401528860808401528760a08401528060c08401528635818401525060208601356101408301526040860135601e198736030181126120da57600080fd5b860160208101903567ffffffffffffffff8111156120f757600080fd5b80360382131561210657600080fd5b606061016085015261211d61018085018284612043565b91505082810360e08401526121328187611f42565b9050828103610100840152612148818587612043565b9d9c50505050505050505050505050565b600060018060a01b03808616835280851660208401526060604084015283516060840152602084015160808401528060408501511660a08401528060608501511660c084015250608083015160c060e08401526121ba610120840182611f42565b905060a0840151605f19848303016101008501526118fa8282611f42565b6000602082840312156121ea57600080fd5b815180151581146119e557600080fd5b6000825161220c818460208701611e1d565b9190910192915050565b6020815260006119e56020830184611f4256fea2646970667358221220651ce927f97933ef570411a16d849fa00c999649b333235a05591643f03c276064736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003684e93ae82b40238911dc71c3875e08e33f4ddc0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e98000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000072e2f4830b9e45d52f80ac08cb2bec0fef72ed9c
-----Decoded View---------------
Arg [0] : _executor (address): 0x3684e93AE82b40238911DC71c3875E08e33f4ddC
Arg [1] : _stargateRouter (address): 0x8731d54E9D02c286767d56ac03e8037C07e01e98
Arg [2] : _uniswapRouter (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [3] : _wrappedNative (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _sgETH (address): 0x72E2F4830b9E45d52F80aC08CB2bEC0FeF72eD9c
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000003684e93ae82b40238911dc71c3875e08e33f4ddc
Arg [1] : 0000000000000000000000008731d54e9d02c286767d56ac03e8037c07e01e98
Arg [2] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 00000000000000000000000072e2f4830b9e45d52f80ac08cb2bec0fef72ed9c
Loading...
Loading
Loading...
Loading
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.