Source Code
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x9fbb3d238546509ebde67297809a7be19127f8d7dc04ab765c6cfc2dd301407e | Swap And Bridge | (pending) | 6 days ago | IN | 0.0005529671 ETH | (Pending) | |||
| Swap And Bridge | 24602440 | 1 hr ago | IN | 0.00061803 ETH | 0.00075742 | ||||
| Swap And Bridge | 24599000 | 12 hrs ago | IN | 0.00156803 ETH | 0.00078996 | ||||
| Swap And Bridge | 24595213 | 25 hrs ago | IN | 0.00066803 ETH | 0.00001618 | ||||
| Swap And Bridge | 24593185 | 32 hrs ago | IN | 0.00256803 ETH | 0.00003349 | ||||
| Swap And Bridge | 24589759 | 43 hrs ago | IN | 0.01056803 ETH | 0.00076587 | ||||
| Swap And Bridge | 24586684 | 2 days ago | IN | 0.00286803 ETH | 0.00077187 | ||||
| Swap And Bridge | 24584545 | 2 days ago | IN | 0.00057803 ETH | 0.0007306 | ||||
| Swap And Bridge | 24584303 | 2 days ago | IN | 0.00156803 ETH | 0.0002708 | ||||
| Swap And Bridge | 24582936 | 2 days ago | IN | 0.00156803 ETH | 0.00004594 | ||||
| Swap And Bridge | 24575253 | 3 days ago | IN | 0.00156803 ETH | 0.00001416 | ||||
| Swap And Bridge | 24575004 | 3 days ago | IN | 0.00141966 ETH | 0.00074947 | ||||
| Swap And Bridge | 24574818 | 3 days ago | IN | 0.00456803 ETH | 0.0006869 | ||||
| Swap And Bridge | 24574160 | 3 days ago | IN | 0.00756803 ETH | 0.00068721 | ||||
| Swap And Bridge | 24574150 | 3 days ago | IN | 0.00556803 ETH | 0.00076327 | ||||
| Swap And Bridge | 24573814 | 4 days ago | IN | 0.00336803 ETH | 0.00068545 | ||||
| Swap And Bridge | 24573802 | 4 days ago | IN | 0.00479999 ETH | 0.00002668 | ||||
| Swap And Bridge | 24570394 | 4 days ago | IN | 0.00210722 ETH | 0.00072889 | ||||
| Swap And Bridge | 24570359 | 4 days ago | IN | 0.00210722 ETH | 0.00071328 | ||||
| Swap And Bridge | 24570325 | 4 days ago | IN | 0.00210722 ETH | 0.00072973 | ||||
| Swap And Bridge | 24570285 | 4 days ago | IN | 0.00210722 ETH | 0.00073429 | ||||
| Swap And Bridge | 24570156 | 4 days ago | IN | 0.00190722 ETH | 0.00073718 | ||||
| Swap And Bridge | 24569972 | 4 days ago | IN | 0.00067582 ETH | 0.00004404 | ||||
| Swap And Bridge | 24569686 | 4 days ago | IN | 0.00220722 ETH | 0.00069249 | ||||
| Swap And Bridge | 24569600 | 4 days ago | IN | 0.00220722 ETH | 0.00069089 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Send From | 24602440 | 1 hr ago | 0.00056803 ETH | ||||
| Execute | 24602440 | 1 hr ago | 0.00005 ETH | ||||
| Send From | 24599000 | 12 hrs ago | 0.00056803 ETH | ||||
| Execute | 24599000 | 12 hrs ago | 0.001 ETH | ||||
| Send From | 24595213 | 25 hrs ago | 0.00056803 ETH | ||||
| Execute | 24595213 | 25 hrs ago | 0.0001 ETH | ||||
| Send From | 24593185 | 32 hrs ago | 0.00056803 ETH | ||||
| Execute | 24593185 | 32 hrs ago | 0.002 ETH | ||||
| Send From | 24589759 | 43 hrs ago | 0.00056803 ETH | ||||
| Execute | 24589759 | 43 hrs ago | 0.01 ETH | ||||
| Send From | 24586684 | 2 days ago | 0.00056803 ETH | ||||
| Execute | 24586684 | 2 days ago | 0.0023 ETH | ||||
| Send From | 24584545 | 2 days ago | 0.00056803 ETH | ||||
| Execute | 24584545 | 2 days ago | 0.00001 ETH | ||||
| Send From | 24584303 | 2 days ago | 0.00056803 ETH | ||||
| Execute | 24584303 | 2 days ago | 0.001 ETH | ||||
| Send From | 24582936 | 2 days ago | 0.00056803 ETH | ||||
| Execute | 24582936 | 2 days ago | 0.001 ETH | ||||
| Send From | 24580685 | 3 days ago | 0.00056803 ETH | ||||
| Execute | 24580685 | 3 days ago | 0.0005 ETH | ||||
| Swap And Bridge | 24580685 | 3 days ago | 0.00106803 ETH | ||||
| Send From | 24575253 | 3 days ago | 0.00056803 ETH | ||||
| Execute | 24575253 | 3 days ago | 0.001 ETH | ||||
| Send From | 24575004 | 3 days ago | 0.00056803 ETH | ||||
| Execute | 24575004 | 3 days ago | 0.00085163 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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.