Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,310 transactions (+12 Pending)
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xda54d6a54af257a2a5e4ca25acf69635b00a1b2579c2a17c88dd290951a6c200 | Swap And Bridge | (pending) | 2 hrs ago | IN | 0.0008051031 ETH | (Pending) | |||
0x810ebc4857f5be2550cad50d06a2abf77296e2be261b717677cdee6f0a4a90a6 | Swap And Bridge | (pending) | 2 hrs ago | IN | 0.0009019965 ETH | (Pending) | |||
0x316d30c251094fa8eb40db04789027076cdb18bccc459e330472b0a80511ff18 | Swap And Bridge | (pending) | 6 hrs ago | IN | 0.0007523791 ETH | (Pending) | |||
0x8f6acaa7d9ab25af3697e70cd60d658d815372ce1fbbcfb493559ad848910a1b | Swap And Bridge | (pending) | 34 hrs ago | IN | 0.0005464772 ETH | (Pending) | |||
0xbf73ffb867e5ceb97b4755e50ec0a9d47e303682ffa833a34f2fa93ee694d7cd | Swap And Bridge | (pending) | 35 hrs ago | IN | 0.0006464772 ETH | (Pending) | |||
0xe61f5e4d2e8f8168f16b98761234ce38c508d5662dd3a37cc8ce4c92ce8a0a39 | Swap And Bridge | (pending) | 2 days ago | IN | 0.000902165 ETH | (Pending) | |||
0x82727dbc354d82219e953f4678b92f4cb091396a390f23eab26e0f95cc688892 | Swap And Bridge | (pending) | 3 days ago | IN | 0.0010456261 ETH | (Pending) | |||
0x26d8bd1e9c3e5b060792f289ab630a824a86c255ee685fcc963fb2b4f346dff5 | Swap And Bridge | (pending) | 3 days ago | IN | 0.0004213329 ETH | (Pending) | |||
0x7d4a863650a91a6d38b4df7aff26d6a5fe88e20652421761ec85e803f814ca92 | Swap And Bridge | (pending) | 10 days ago | IN | 0.0003988143 ETH | (Pending) | |||
0xc3f24df8d7eeabae408c54da8359381f7639e36b1df335a2fa8b036c846c1409 | Swap And Bridge | (pending) | 10 days ago | IN | 0.000448774 ETH | (Pending) | |||
0x35479af4507716e0012f6e30411ea3bbc6014cb7f1891e4068c8a37dfc7d8c51 | Swap And Bridge | (pending) | 10 days ago | IN | 0.0008522506 ETH | (Pending) | |||
0xd606cc79d67c6097201a1f7b1a08bff8c0c9bc415ab10be352df4d2c8f643a8d | Swap And Bridge | (pending) | 15 days ago | IN | 0.0006121245 ETH | (Pending) | |||
Swap And Bridge | 21482909 | 1 hr ago | IN | 0.00334527 ETH | 0.00146543 | ||||
Swap And Bridge | 21482779 | 1 hr ago | IN | 0.00734527 ETH | 0.00144021 | ||||
Swap And Bridge | 21482345 | 3 hrs ago | IN | 0.00054527 ETH | 0.00155261 | ||||
Swap And Bridge | 21482102 | 3 hrs ago | IN | 0.00184528 ETH | 0.00186538 | ||||
Swap And Bridge | 21482012 | 4 hrs ago | IN | 0.00044529 ETH | 0.0017045 | ||||
Swap And Bridge | 21481820 | 4 hrs ago | IN | 0.00334532 ETH | 0.00167406 | ||||
Swap And Bridge | 21481808 | 4 hrs ago | IN | 0.00084532 ETH | 0.00166423 | ||||
Swap And Bridge | 21481802 | 4 hrs ago | IN | 0.00063405 ETH | 0.00178468 | ||||
Swap And Bridge | 21481747 | 5 hrs ago | IN | 0.2 ETH | 0.00180375 | ||||
Swap And Bridge | 21481629 | 5 hrs ago | IN | 0.00042132 ETH | 0.0018461 | ||||
Swap And Bridge | 21481495 | 5 hrs ago | IN | 0.00134532 ETH | 0.00185566 | ||||
Swap And Bridge | 21481186 | 6 hrs ago | IN | 0.0053454 ETH | 0.00248776 | ||||
Swap And Bridge | 21480910 | 7 hrs ago | IN | 0.0103454 ETH | 0.00302874 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21482909 | 1 hr ago | 0.00034527 ETH | ||||
21482909 | 1 hr ago | 0.003 ETH | ||||
21482779 | 1 hr ago | 0.00034527 ETH | ||||
21482779 | 1 hr ago | 0.007 ETH | ||||
21482345 | 3 hrs ago | 0.00034527 ETH | ||||
21482345 | 3 hrs ago | 0.0002 ETH | ||||
21482102 | 3 hrs ago | 0.00034528 ETH | ||||
21482102 | 3 hrs ago | 0.0015 ETH | ||||
21482012 | 4 hrs ago | 0.00034529 ETH | ||||
21482012 | 4 hrs ago | 0.0001 ETH | ||||
21481820 | 4 hrs ago | 0.00034532 ETH | ||||
21481820 | 4 hrs ago | 0.003 ETH | ||||
21481808 | 4 hrs ago | 0.00034532 ETH | ||||
21481808 | 4 hrs ago | 0.0005 ETH | ||||
21481802 | 4 hrs ago | 0.00034532 ETH | ||||
21481802 | 4 hrs ago | 0.00028873 ETH | ||||
21481747 | 5 hrs ago | 0.01 ETH | ||||
21481747 | 5 hrs ago | 0.19 ETH | ||||
21481629 | 5 hrs ago | 0.00034532 ETH | ||||
21481629 | 5 hrs ago | 0.000076 ETH | ||||
21481495 | 5 hrs ago | 0.00034532 ETH | ||||
21481495 | 5 hrs ago | 0.001 ETH | ||||
21481186 | 6 hrs ago | 0.0003454 ETH | ||||
21481186 | 6 hrs ago | 0.005 ETH | ||||
21480910 | 7 hrs ago | 0.0003454 ETH |
Loading...
Loading
Contract Name:
SwappableBridgeUniswapV3
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@uniswap/universal-router/contracts/interfaces/IUniversalRouter.sol"; import "@layerzerolabs/solidity-examples/contracts/token/oft/IOFTCore.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./INativeOFT.sol"; contract SwappableBridgeUniswapV3 { uint24 public constant poolFee = 3000; // 0.3% INativeOFT public immutable nativeOft; IUniversalRouter public immutable universalRouter; address public immutable weth; IOFTCore public immutable oft; constructor(address _weth, address _oft, address _nativeOft, address _universalRouter) { require(_weth != address(0), "SwappableBridge: invalid WETH address"); require(_oft != address(0), "SwappableBridge: invalid OFT address"); require(_nativeOft != address(0), "SwappableBridge: invalid Native OFT address"); require(_universalRouter != address(0), "SwappableBridge: invalid Universal Router address"); weth = _weth; oft = IOFTCore(_oft); nativeOft = INativeOFT(_nativeOft); universalRouter = IUniversalRouter(_universalRouter); } function swapAndBridge(uint amountIn, uint amountOutMin, uint16 dstChainId, address to, address payable refundAddress, address zroPaymentAddress, bytes calldata adapterParams) external payable { require(to != address(0), "SwappableBridge: invalid to address"); require(msg.value >= amountIn, "SwappableBridge: not enough value sent"); // 1) commands // 0x0b == WRAP_ETH ... https://docs.uniswap.org/contracts/universal-router/technical-reference#wrap_eth // 0x00 == V3_SWAP_EXACT_IN... https://docs.uniswap.org/contracts/universal-router/technical-reference#v3_swap_exact_in bytes memory commands = hex"0b00"; // 2) inputs bytes[] memory inputs = new bytes[](2); // For weth deposit inputs[0] = abi.encode( address(universalRouter), // recipient amountIn // amount ); // For token swap inputs[1] = abi.encode( address(this), // recipient amountIn, // amount input amountOutMin, // min amount output // pathway(inputToken, poolFee, outputToken) abi.encodePacked(weth, poolFee, address(oft)), false ); // 3) deadline uint256 deadline = block.timestamp; // Call execute on the universal Router universalRouter.execute{value: amountIn}(commands, inputs, deadline); // check balance after to see how many tokens we received uint256 amountReceived = IERC20(address(oft)).balanceOf(address(this)); // redundant check to ensure we received enough tokens require(amountReceived >= amountOutMin, "SwappableBridge: insufficient amount received"); oft.sendFrom{value: msg.value - amountIn}( address(this), dstChainId, abi.encodePacked(to), amountReceived, refundAddress, zroPaymentAddress, adapterParams ); } function bridge(uint amountIn, uint16 dstChainId, address to, address payable refundAddress, address zroPaymentAddress, bytes calldata adapterParams) external payable { require(to != address(0), "SwappableBridge: invalid to address"); require(msg.value >= amountIn, "SwappableBridge: not enough value sent"); nativeOft.deposit{value: amountIn}(); nativeOft.sendFrom{value: msg.value - amountIn}(address(this), dstChainId, abi.encodePacked(to), amountIn, refundAddress, zroPaymentAddress, adapterParams); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // 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: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.15; import {ERC20} from 'solmate/src/tokens/ERC20.sol'; /// @title LooksRare Rewards Collector /// @notice Implements a permissionless call to fetch LooksRare rewards earned by Universal Router users /// and transfers them to an external rewards distributor contract interface IRewardsCollector { /// @notice Fetches users' LooksRare rewards and sends them to the distributor contract /// @param looksRareClaim The data required by LooksRare to claim reward tokens function collectRewards(bytes calldata looksRareClaim) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.17; import {IERC721Receiver} from '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import {IERC1155Receiver} from '@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol'; import {IRewardsCollector} from './IRewardsCollector.sol'; interface IUniversalRouter is IRewardsCollector, IERC721Receiver, IERC1155Receiver { /// @notice Thrown when a required command has failed error ExecutionFailed(uint256 commandIndex, bytes message); /// @notice Thrown when attempting to send ETH directly to the contract error ETHNotAccepted(); /// @notice Thrown when executing commands with an expired deadline error TransactionDeadlinePassed(); /// @notice Thrown when attempting to execute commands and an incorrect number of inputs are provided error LengthMismatch(); /// @notice Executes encoded commands along with provided inputs. Reverts if deadline has expired. /// @param commands A set of concatenated commands, each 1 byte in length /// @param inputs An array of byte strings containing abi encoded inputs for each command /// @param deadline The deadline by which the transaction must be executed function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Interface of the IOFT core standard */ interface IOFTCore is IERC165 { /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _amount - amount of the tokens to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` * `_from` the owner of token * `_dstChainId` the destination chain identifier * `_toAddress` can be any size depending on the `dstChainId`. * `_amount` the quantity of tokens in wei * `_refundAddress` the address LayerZero refunds if too much message fee is sent * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; /** * @dev returns the circulating amount of tokens on current chain */ function circulatingSupply() external view returns (uint); /** * @dev returns the address of the ERC20 token */ function token() external view returns (address); /** * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce */ event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount); /** * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. * `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); event SetUseCustomAdapterParams(bool _useCustomAdapterParams); }
// 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 pragma solidity ^0.8.0; import "@layerzerolabs/solidity-examples/contracts/token/oft/IOFTCore.sol"; interface INativeOFT is IOFTCore { function deposit() external payable; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_oft","type":"address"},{"internalType":"address","name":"_nativeOft","type":"address"},{"internalType":"address","name":"_universalRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"bridge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nativeOft","outputs":[{"internalType":"contract INativeOFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oft","outputs":[{"internalType":"contract IOFTCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"swapAndBridge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"universalRouter","outputs":[{"internalType":"contract IUniversalRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61010060405234801561001157600080fd5b5060405162000e7238038062000e7283398101604081905261003291610215565b6001600160a01b03841661009b5760405162461bcd60e51b815260206004820152602560248201527f537761707061626c654272696467653a20696e76616c69642057455448206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001600160a01b0383166100fd5760405162461bcd60e51b8152602060048201526024808201527f537761707061626c654272696467653a20696e76616c6964204f4654206164646044820152637265737360e01b6064820152608401610092565b6001600160a01b0382166101675760405162461bcd60e51b815260206004820152602b60248201527f537761707061626c654272696467653a20696e76616c6964204e61746976652060448201526a4f4654206164647265737360a81b6064820152608401610092565b6001600160a01b0381166101d75760405162461bcd60e51b815260206004820152603160248201527f537761707061626c654272696467653a20696e76616c696420556e6976657273604482015270616c20526f75746572206164647265737360781b6064820152608401610092565b6001600160a01b0393841660c05291831660e05282166080521660a052610269565b80516001600160a01b038116811461021057600080fd5b919050565b6000806000806080858703121561022b57600080fd5b610234856101f9565b9350610242602086016101f9565b9250610250604086016101f9565b915061025e606086016101f9565b905092959194509250565b60805160a05160c05160e051610b98620002da6000396000818161016a015281816102db01528181610429015261051001526000818161013601526102b70152600081816101020152818161025401526103a601526000818160b60152818161061c01526106900152610b986000f3fe6080604052600436106100705760003560e01c80633fc8cef31161004e5780633fc8cef3146101245780639b5215f614610158578063ae30f6ee1461018c578063b7370435146101a157600080fd5b8063089fe6aa146100755780631ab425a0146100a457806335a9e4df146100f0575b600080fd5b34801561008157600080fd5b5061008b610bb881565b60405162ffffff90911681526020015b60405180910390f35b3480156100b057600080fd5b506100d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009b565b3480156100fc57600080fd5b506100d87f000000000000000000000000000000000000000000000000000000000000000081565b34801561013057600080fd5b506100d87f000000000000000000000000000000000000000000000000000000000000000081565b34801561016457600080fd5b506100d87f000000000000000000000000000000000000000000000000000000000000000081565b61019f61019a3660046107d1565b6101b4565b005b61019f6101af366004610870565b6105d4565b6001600160a01b0385166101e35760405162461bcd60e51b81526004016101da90610906565b60405180910390fd5b873410156102035760405162461bcd60e51b81526004016101da90610949565b6040805180820182526002808252600b60f81b60208301528251818152606081019093529091600091816020015b606081526020019060019003908161023157905050604080516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660208201529081018c9052909150606001604051602081830303815290604052816000815181106102a7576102a761098f565b6020026020010181905250308a8a7f0000000000000000000000000000000000000000000000000000000000000000610bb87f000000000000000000000000000000000000000000000000000000000000000060405160200161033d93929190606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b60408051601f1981840301815290829052610360949392916000906020016109eb565b604051602081830303815290604052816001815181106103825761038261098f565b6020908102919091010152604051630d64d59360e21b815242906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633593564c908d906103e190879087908790600401610a2c565b6000604051808303818588803b1580156103fa57600080fd5b505af115801561040e573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506370a082319150602401602060405180830381865afa15801561047a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049e9190610aa7565b90508a8110156105065760405162461bcd60e51b815260206004820152602d60248201527f537761707061626c654272696467653a20696e73756666696369656e7420616d60448201526c1bdd5b9d081c9958d95a5d9959609a1b60648201526084016101da565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635190563661053f8e34610ac0565b6040516001600160601b031960608e901b16602082015230908e90603401604051602081830303815290604052868e8e8e8e6040518a63ffffffff1660e01b8152600401610594989796959493929190610ae7565b6000604051808303818588803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b5050505050505050505050505050505050565b6001600160a01b0385166105fa5760405162461bcd60e51b81526004016101da90610906565b8634101561061a5760405162461bcd60e51b81526004016101da90610949565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561067557600080fd5b505af1158015610689573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635190563688346106c99190610ac0565b6040516001600160601b031960608a901b16602082015230908a906034016040516020818303038152906040528c8a8a8a8a6040518a63ffffffff1660e01b815260040161071e989796959493929190610ae7565b6000604051808303818588803b15801561073757600080fd5b505af115801561074b573d6000803e3d6000fd5b505050505050505050505050565b803561ffff8116811461076b57600080fd5b919050565b6001600160a01b038116811461078557600080fd5b50565b60008083601f84011261079a57600080fd5b50813567ffffffffffffffff8111156107b257600080fd5b6020830191508360208285010111156107ca57600080fd5b9250929050565b60008060008060008060008060e0898b0312156107ed57600080fd5b883597506020890135965061080460408a01610759565b9550606089013561081481610770565b9450608089013561082481610770565b935060a089013561083481610770565b925060c089013567ffffffffffffffff81111561085057600080fd5b61085c8b828c01610788565b999c989b5096995094979396929594505050565b600080600080600080600060c0888a03121561088b57600080fd5b8735965061089b60208901610759565b955060408801356108ab81610770565b945060608801356108bb81610770565b935060808801356108cb81610770565b925060a088013567ffffffffffffffff8111156108e757600080fd5b6108f38a828b01610788565b989b979a50959850939692959293505050565b60208082526023908201527f537761707061626c654272696467653a20696e76616c696420746f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f537761707061626c654272696467653a206e6f7420656e6f7567682076616c7560408201526519481cd95b9d60d21b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000815180845260005b818110156109cb576020818501810151868301820152016109af565b506000602082860101526020601f19601f83011685010191505092915050565b60018060a01b038616815284602082015283604082015260a060608201526000610a1860a08301856109a5565b905082151560808301529695505050505050565b606081526000610a3f60608301866109a5565b6020838203818501528186518084528284019150828160051b85010183890160005b83811015610a8f57601f19878403018552610a7d8383516109a5565b94860194925090850190600101610a61565b50508095505050505050826040830152949350505050565b600060208284031215610ab957600080fd5b5051919050565b81810381811115610ae157634e487b7160e01b600052601160045260246000fd5b92915050565b600060018060a01b03808b16835261ffff8a16602084015260e06040840152610b1360e084018a6109a5565b886060850152818816608085015281871660a085015283810360c0850152848152848660208301376000602086830101526020601f19601f87011682010192505050999850505050505050505056fea2646970667358221220aefd643a86a14367359b10f73d78fd105c71423a02aa08ee8cc2e9a88657c4cc64736f6c63430008110033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d40000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38e0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad
Deployed Bytecode
0x6080604052600436106100705760003560e01c80633fc8cef31161004e5780633fc8cef3146101245780639b5215f614610158578063ae30f6ee1461018c578063b7370435146101a157600080fd5b8063089fe6aa146100755780631ab425a0146100a457806335a9e4df146100f0575b600080fd5b34801561008157600080fd5b5061008b610bb881565b60405162ffffff90911681526020015b60405180910390f35b3480156100b057600080fd5b506100d87f0000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38e81565b6040516001600160a01b03909116815260200161009b565b3480156100fc57600080fd5b506100d87f0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad81565b34801561013057600080fd5b506100d87f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561016457600080fd5b506100d87f000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d481565b61019f61019a3660046107d1565b6101b4565b005b61019f6101af366004610870565b6105d4565b6001600160a01b0385166101e35760405162461bcd60e51b81526004016101da90610906565b60405180910390fd5b873410156102035760405162461bcd60e51b81526004016101da90610949565b6040805180820182526002808252600b60f81b60208301528251818152606081019093529091600091816020015b606081526020019060019003908161023157905050604080516001600160a01b037f0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad1660208201529081018c9052909150606001604051602081830303815290604052816000815181106102a7576102a761098f565b6020026020010181905250308a8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610bb87f000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d460405160200161033d93929190606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b60408051601f1981840301815290829052610360949392916000906020016109eb565b604051602081830303815290604052816001815181106103825761038261098f565b6020908102919091010152604051630d64d59360e21b815242906001600160a01b037f0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad1690633593564c908d906103e190879087908790600401610a2c565b6000604051808303818588803b1580156103fa57600080fd5b505af115801561040e573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d46001600160a01b031692506370a082319150602401602060405180830381865afa15801561047a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049e9190610aa7565b90508a8110156105065760405162461bcd60e51b815260206004820152602d60248201527f537761707061626c654272696467653a20696e73756666696369656e7420616d60448201526c1bdd5b9d081c9958d95a5d9959609a1b60648201526084016101da565b6001600160a01b037f000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d416635190563661053f8e34610ac0565b6040516001600160601b031960608e901b16602082015230908e90603401604051602081830303815290604052868e8e8e8e6040518a63ffffffff1660e01b8152600401610594989796959493929190610ae7565b6000604051808303818588803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b5050505050505050505050505050505050565b6001600160a01b0385166105fa5760405162461bcd60e51b81526004016101da90610906565b8634101561061a5760405162461bcd60e51b81526004016101da90610949565b7f0000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38e6001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561067557600080fd5b505af1158015610689573d6000803e3d6000fd5b50505050507f0000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38e6001600160a01b0316635190563688346106c99190610ac0565b6040516001600160601b031960608a901b16602082015230908a906034016040516020818303038152906040528c8a8a8a8a6040518a63ffffffff1660e01b815260040161071e989796959493929190610ae7565b6000604051808303818588803b15801561073757600080fd5b505af115801561074b573d6000803e3d6000fd5b505050505050505050505050565b803561ffff8116811461076b57600080fd5b919050565b6001600160a01b038116811461078557600080fd5b50565b60008083601f84011261079a57600080fd5b50813567ffffffffffffffff8111156107b257600080fd5b6020830191508360208285010111156107ca57600080fd5b9250929050565b60008060008060008060008060e0898b0312156107ed57600080fd5b883597506020890135965061080460408a01610759565b9550606089013561081481610770565b9450608089013561082481610770565b935060a089013561083481610770565b925060c089013567ffffffffffffffff81111561085057600080fd5b61085c8b828c01610788565b999c989b5096995094979396929594505050565b600080600080600080600060c0888a03121561088b57600080fd5b8735965061089b60208901610759565b955060408801356108ab81610770565b945060608801356108bb81610770565b935060808801356108cb81610770565b925060a088013567ffffffffffffffff8111156108e757600080fd5b6108f38a828b01610788565b989b979a50959850939692959293505050565b60208082526023908201527f537761707061626c654272696467653a20696e76616c696420746f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f537761707061626c654272696467653a206e6f7420656e6f7567682076616c7560408201526519481cd95b9d60d21b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000815180845260005b818110156109cb576020818501810151868301820152016109af565b506000602082860101526020601f19601f83011685010191505092915050565b60018060a01b038616815284602082015283604082015260a060608201526000610a1860a08301856109a5565b905082151560808301529695505050505050565b606081526000610a3f60608301866109a5565b6020838203818501528186518084528284019150828160051b85010183890160005b83811015610a8f57601f19878403018552610a7d8383516109a5565b94860194925090850190600101610a61565b50508095505050505050826040830152949350505050565b600060208284031215610ab957600080fd5b5051919050565b81810381811115610ae157634e487b7160e01b600052601160045260246000fd5b92915050565b600060018060a01b03808b16835261ffff8a16602084015260e06040840152610b1360e084018a6109a5565b886060850152818816608085015281871660a085015283810360c0850152848152848660208301376000602086830101526020601f19601f87011682010192505050999850505050505050505056fea2646970667358221220aefd643a86a14367359b10f73d78fd105c71423a02aa08ee8cc2e9a88657c4cc64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d40000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38e0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _oft (address): 0xE71bDfE1Df69284f00EE185cf0d95d0c7680c0d4
Arg [2] : _nativeOft (address): 0x4f7A67464B5976d7547c860109e4432d50AfB38e
Arg [3] : _universalRouter (address): 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 000000000000000000000000e71bdfe1df69284f00ee185cf0d95d0c7680c0d4
Arg [2] : 0000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38e
Arg [3] : 0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad
Deployed Bytecode Sourcemap
296:3397:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;340:37;;;;;;;;;;;;373:4;340:37;;;;;188:8:13;176:21;;;158:40;;146:2;131:18;340:37:11;;;;;;;;392;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;391:32:13;;;373:51;;361:2;346:18;392:37:11;209:221:13;435:49:11;;;;;;;;;;;;;;;490:29;;;;;;;;;;;;;;;522;;;;;;;;;;;;;;;1165:1978;;;;;;:::i;:::-;;:::i;:::-;;3149:542;;;;;;:::i;:::-;;:::i;1165:1978::-;-1:-1:-1;;;;;1376:16:11;;1368:64;;;;-1:-1:-1;;;1368:64:11;;;;;;;:::i;:::-;;;;;;;;;1463:8;1450:9;:21;;1442:72;;;;-1:-1:-1;;;1442:72:11;;;;;;;:::i;:::-;1789:33;;;;;;;;;;;;-1:-1:-1;;;1789:33:11;;;;1878:14;;;;;;;;;;;1789:33;;-1:-1:-1;;1878:14:11;;;;;;;;;;;;;;;;;;;-1:-1:-1;1942:103:11;;;-1:-1:-1;;;;;1974:15:11;4918:32:13;1942:103:11;;;4900:51:13;4967:18;;;4960:34;;;1854:38:11;;-1:-1:-1;4873:18:13;;1942:103:11;;;;;;;;;;;;1930:6;1937:1;1930:9;;;;;;;;:::i;:::-;;;;;;:115;;;;2125:4;2157:8;2195:12;2316:4;373;2339:3;2299:45;;;;;;;;;5390:2:13;5386:15;;;-1:-1:-1;;;;;;5382:24:13;;;5370:37;;5463:3;5441:16;;;;-1:-1:-1;;;;;;5437:41:13;5432:2;5423:12;;5416:63;5513:15;;5509:24;5504:2;5495:12;;5488:46;5559:2;5550:12;;5137:431;2299:45:11;;;;-1:-1:-1;;2299:45:11;;;;;;;;;;2093:280;;;;;2358:5;;2299:45;2093:280;;:::i;:::-;;;;;;;;;;;;;2081:6;2088:1;2081:9;;;;;;;;:::i;:::-;;;;;;;;;;:292;2500:68;;-1:-1:-1;;;2500:68:11;;2426:15;;-1:-1:-1;;;;;2500:15:11;:23;;;;2531:8;;2500:68;;2541:8;;2551:6;;2426:15;;2500:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2670:45:11;;-1:-1:-1;;;2670:45:11;;2709:4;2670:45;;;373:51:13;2645:22:11;;-1:-1:-1;2685:3:11;-1:-1:-1;;;;;2670:30:11;;-1:-1:-1;2670:30:11;;-1:-1:-1;346:18:13;;2670:45:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2645:70;;2814:12;2796:14;:30;;2788:88;;;;-1:-1:-1;;;2788:88:11;;7934:2:13;2788:88:11;;;7916:21:13;7973:2;7953:18;;;7946:30;8012:34;7992:18;;;7985:62;-1:-1:-1;;;8063:18:13;;;8056:43;8116:19;;2788:88:11;7732:409:13;2788:88:11;-1:-1:-1;;;;;2887:3:11;:12;;2907:20;2919:8;2907:9;:20;:::i;:::-;2993;;-1:-1:-1;;;;;;8525:2:13;8521:15;;;8517:53;2993:20:11;;;8505:66:13;2950:4:11;;2969:10;;8587:12:13;;2993:20:11;;;;;;;;;;;;3027:14;3055:13;3082:17;3113:13;;2887:249;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1358:1785;;;;1165:1978;;;;;;;;:::o;3149:542::-;-1:-1:-1;;;;;3334:16:11;;3326:64;;;;-1:-1:-1;;;3326:64:11;;;;;;;:::i;:::-;3421:8;3408:9;:21;;3400:72;;;;-1:-1:-1;;;3400:72:11;;;;;;;:::i;:::-;3483:9;-1:-1:-1;;;;;3483:17:11;;3508:8;3483:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3529:9;-1:-1:-1;;;;;3529:18:11;;3567:8;3555:9;:20;;;;:::i;:::-;3604;;-1:-1:-1;;;;;;8525:2:13;8521:15;;;8517:53;3604:20:11;;;8505:66:13;3585:4:11;;3592:10;;8587:12:13;;3604:20:11;;;;;;;;;;;;3626:8;3636:13;3651:17;3670:13;;3529:155;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3149:542;;;;;;;:::o;1098:159:13:-;1165:20;;1225:6;1214:18;;1204:29;;1194:57;;1247:1;1244;1237:12;1194:57;1098:159;;;:::o;1262:131::-;-1:-1:-1;;;;;1337:31:13;;1327:42;;1317:70;;1383:1;1380;1373:12;1317:70;1262:131;:::o;1398:347::-;1449:8;1459:6;1513:3;1506:4;1498:6;1494:17;1490:27;1480:55;;1531:1;1528;1521:12;1480:55;-1:-1:-1;1554:20:13;;1597:18;1586:30;;1583:50;;;1629:1;1626;1619:12;1583:50;1666:4;1658:6;1654:17;1642:29;;1718:3;1711:4;1702:6;1694;1690:19;1686:30;1683:39;1680:59;;;1735:1;1732;1725:12;1680:59;1398:347;;;;;:::o;1750:1046::-;1881:6;1889;1897;1905;1913;1921;1929;1937;1990:3;1978:9;1969:7;1965:23;1961:33;1958:53;;;2007:1;2004;1997:12;1958:53;2043:9;2030:23;2020:33;;2100:2;2089:9;2085:18;2072:32;2062:42;;2123:37;2156:2;2145:9;2141:18;2123:37;:::i;:::-;2113:47;;2210:2;2199:9;2195:18;2182:32;2223:31;2248:5;2223:31;:::i;:::-;2273:5;-1:-1:-1;2330:3:13;2315:19;;2302:33;2344;2302;2344;:::i;:::-;2396:7;-1:-1:-1;2455:3:13;2440:19;;2427:33;2469;2427;2469;:::i;:::-;2521:7;-1:-1:-1;2579:3:13;2564:19;;2551:33;2607:18;2596:30;;2593:50;;;2639:1;2636;2629:12;2593:50;2678:58;2728:7;2719:6;2708:9;2704:22;2678:58;:::i;:::-;1750:1046;;;;-1:-1:-1;1750:1046:13;;-1:-1:-1;1750:1046:13;;;;;;2755:8;-1:-1:-1;;;1750:1046:13:o;2801:977::-;2923:6;2931;2939;2947;2955;2963;2971;3024:3;3012:9;3003:7;2999:23;2995:33;2992:53;;;3041:1;3038;3031:12;2992:53;3077:9;3064:23;3054:33;;3106:37;3139:2;3128:9;3124:18;3106:37;:::i;:::-;3096:47;;3193:2;3182:9;3178:18;3165:32;3206:31;3231:5;3206:31;:::i;:::-;3256:5;-1:-1:-1;3313:2:13;3298:18;;3285:32;3326:33;3285:32;3326:33;:::i;:::-;3378:7;-1:-1:-1;3437:3:13;3422:19;;3409:33;3451;3409;3451;:::i;:::-;3503:7;-1:-1:-1;3561:3:13;3546:19;;3533:33;3589:18;3578:30;;3575:50;;;3621:1;3618;3611:12;3575:50;3660:58;3710:7;3701:6;3690:9;3686:22;3660:58;:::i;:::-;2801:977;;;;-1:-1:-1;2801:977:13;;-1:-1:-1;2801:977:13;;;;3634:84;;-1:-1:-1;;;2801:977:13:o;3783:399::-;3985:2;3967:21;;;4024:2;4004:18;;;3997:30;4063:34;4058:2;4043:18;;4036:62;-1:-1:-1;;;4129:2:13;4114:18;;4107:33;4172:3;4157:19;;3783:399::o;4187:402::-;4389:2;4371:21;;;4428:2;4408:18;;;4401:30;4467:34;4462:2;4447:18;;4440:62;-1:-1:-1;;;4533:2:13;4518:18;;4511:36;4579:3;4564:19;;4187:402::o;5005:127::-;5066:10;5061:3;5057:20;5054:1;5047:31;5097:4;5094:1;5087:15;5121:4;5118:1;5111:15;5573:422;5614:3;5652:5;5646:12;5679:6;5674:3;5667:19;5704:1;5714:162;5728:6;5725:1;5722:13;5714:162;;;5790:4;5846:13;;;5842:22;;5836:29;5818:11;;;5814:20;;5807:59;5743:12;5714:162;;;5718:3;5921:1;5914:4;5905:6;5900:3;5896:16;5892:27;5885:38;5984:4;5977:2;5973:7;5968:2;5960:6;5956:15;5952:29;5947:3;5943:39;5939:50;5932:57;;;5573:422;;;;:::o;6000:540::-;6282:1;6278;6273:3;6269:11;6265:19;6257:6;6253:32;6242:9;6235:51;6322:6;6317:2;6306:9;6302:18;6295:34;6365:6;6360:2;6349:9;6345:18;6338:34;6408:3;6403:2;6392:9;6388:18;6381:31;6216:4;6429:45;6469:3;6458:9;6454:19;6446:6;6429:45;:::i;:::-;6421:53;;6525:6;6518:14;6511:22;6505:3;6494:9;6490:19;6483:51;6000:540;;;;;;;;:::o;6545:993::-;6816:2;6805:9;6798:21;6779:4;6842:44;6882:2;6871:9;6867:18;6859:6;6842:44;:::i;:::-;6905:2;6955:9;6947:6;6943:22;6938:2;6927:9;6923:18;6916:50;6986:6;7021;7015:13;7052:6;7044;7037:22;7087:2;7079:6;7075:15;7068:22;;7146:2;7136:6;7133:1;7129:14;7121:6;7117:27;7113:36;7184:2;7176:6;7172:15;7205:1;7215:251;7229:6;7226:1;7223:13;7215:251;;;7319:2;7315:7;7306:6;7298;7294:19;7290:33;7285:3;7278:46;7347:39;7379:6;7370;7364:13;7347:39;:::i;:::-;7444:12;;;;7337:49;-1:-1:-1;7409:15:13;;;;7251:1;7244:9;7215:251;;;7219:3;;7483:6;7475:14;;;;;;;7525:6;7520:2;7509:9;7505:18;7498:34;6545:993;;;;;;:::o;7543:184::-;7613:6;7666:2;7654:9;7645:7;7641:23;7637:32;7634:52;;;7682:1;7679;7672:12;7634:52;-1:-1:-1;7705:16:13;;7543:184;-1:-1:-1;7543:184:13:o;8146:225::-;8213:9;;;8234:11;;;8231:134;;;8287:10;8282:3;8278:20;8275:1;8268:31;8322:4;8319:1;8312:15;8350:4;8347:1;8340:15;8231:134;8146:225;;;;:::o;8610:991::-;8930:4;8976:1;8972;8967:3;8963:11;8959:19;9017:2;9009:6;9005:15;8994:9;8987:34;9069:6;9061;9057:19;9052:2;9041:9;9037:18;9030:47;9113:3;9108:2;9097:9;9093:18;9086:31;9140:45;9180:3;9169:9;9165:19;9157:6;9140:45;:::i;:::-;9221:6;9216:2;9205:9;9201:18;9194:34;9277:2;9269:6;9265:15;9259:3;9248:9;9244:19;9237:44;9330:2;9322:6;9318:15;9312:3;9301:9;9297:19;9290:44;9383:9;9375:6;9371:22;9365:3;9354:9;9350:19;9343:51;9418:6;9410;9403:22;9472:6;9464;9459:2;9451:6;9447:15;9434:45;9525:1;9520:2;9511:6;9503;9499:19;9495:28;9488:39;9592:2;9585;9581:7;9576:2;9568:6;9564:15;9560:29;9552:6;9548:42;9544:51;9536:59;;;;8610:991;;;;;;;;;;;:::o
Swarm Source
ipfs://aefd643a86a14367359b10f73d78fd105c71423a02aa08ee8cc2e9a88657c4cc
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.