Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 1,461 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Send OFT Adapter... | 23344582 | 96 days ago | IN | 0.00000489 ETH | 0.00004313 | ||||
| Send OFT Adapter... | 23341244 | 97 days ago | IN | 0.00000532 ETH | 0.00016218 | ||||
| Send OFT Adapter... | 23341160 | 97 days ago | IN | 0.00000543 ETH | 0.0002565 | ||||
| Send OFT Adapter... | 23340982 | 97 days ago | IN | 0.00000754 ETH | 0.00019183 | ||||
| Send OFT Adapter... | 23339456 | 97 days ago | IN | 0.00149171 ETH | 0.00032659 | ||||
| Send OFT Adapter... | 23338783 | 97 days ago | IN | 0.00000571 ETH | 0.00038986 | ||||
| Send OFT Adapter... | 23333753 | 98 days ago | IN | 0.00022129 ETH | 0.00103059 | ||||
| Send OFT Adapter... | 23330931 | 98 days ago | IN | 0.00001385 ETH | 0.00037614 | ||||
| Send OFT Adapter... | 23329744 | 99 days ago | IN | 0.00009807 ETH | 0.00038219 | ||||
| Send OFT Adapter... | 23329734 | 99 days ago | IN | 0.00001307 ETH | 0.00023043 | ||||
| Send OFT Adapter... | 23326696 | 99 days ago | IN | 0.00007826 ETH | 0.00062732 | ||||
| Send OFT Adapter... | 23326202 | 99 days ago | IN | 0.00073152 ETH | 0.00096619 | ||||
| Send OFT Adapter... | 23324770 | 99 days ago | IN | 0.00001382 ETH | 0.00025152 | ||||
| Send OFT Adapter... | 23323975 | 99 days ago | IN | 0.00001533 ETH | 0.0003397 | ||||
| Send OFT Adapter... | 23323501 | 99 days ago | IN | 0.00000567 ETH | 0.00037866 | ||||
| Send OFT Adapter... | 23323086 | 99 days ago | IN | 0.00000534 ETH | 0.00038446 | ||||
| Send OFT Adapter... | 23319374 | 100 days ago | IN | 0.00001301 ETH | 0.00066756 | ||||
| Send OFT Adapter... | 23319341 | 100 days ago | IN | 0.00000562 ETH | 0.00048725 | ||||
| Send OFT Adapter... | 23319088 | 100 days ago | IN | 0.00000613 ETH | 0.00075178 | ||||
| Send OFT Adapter... | 23318983 | 100 days ago | IN | 0.00000937 ETH | 0.00086206 | ||||
| Send OFT Adapter... | 23317012 | 100 days ago | IN | 0.00000619 ETH | 0.00023008 | ||||
| Send OFT Adapter... | 23316360 | 100 days ago | IN | 0.00000513 ETH | 0.00004553 | ||||
| Send OFT Adapter... | 23316196 | 100 days ago | IN | 0.00000884 ETH | 0.00038074 | ||||
| Send OFT Adapter... | 23316082 | 100 days ago | IN | 0.00002407 ETH | 0.0002241 | ||||
| Send OFT Adapter... | 23315792 | 100 days ago | IN | 0.00000513 ETH | 0.00037086 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Send | 23344582 | 96 days ago | 0.00000489 ETH | ||||
| Transfer* | 23341244 | 97 days ago | 0.00000532 ETH | ||||
| Transfer* | 23341160 | 97 days ago | 0.00000543 ETH | ||||
| Send | 23340982 | 97 days ago | 0.00000754 ETH | ||||
| Send | 23339456 | 97 days ago | 0.00149171 ETH | ||||
| Send | 23338783 | 97 days ago | 0.00000571 ETH | ||||
| Send | 23333753 | 98 days ago | 0.00022129 ETH | ||||
| Send | 23330931 | 98 days ago | 0.00001385 ETH | ||||
| Send | 23329744 | 99 days ago | 0.00009807 ETH | ||||
| Send | 23329734 | 99 days ago | 0.00001307 ETH | ||||
| Send | 23326696 | 99 days ago | 0.00007826 ETH | ||||
| Send | 23326202 | 99 days ago | 0.00073152 ETH | ||||
| Send | 23324770 | 99 days ago | 0.00001382 ETH | ||||
| Send | 23323975 | 99 days ago | 0.00001533 ETH | ||||
| Send | 23323501 | 99 days ago | 0.00000567 ETH | ||||
| Send | 23323086 | 99 days ago | 0.00000534 ETH | ||||
| Send | 23319374 | 100 days ago | 0.00001301 ETH | ||||
| Send | 23319341 | 100 days ago | 0.00000562 ETH | ||||
| Send | 23319088 | 100 days ago | 0.00000613 ETH | ||||
| Send | 23318983 | 100 days ago | 0.00000937 ETH | ||||
| Send | 23317012 | 100 days ago | 0.00000619 ETH | ||||
| Send | 23316360 | 100 days ago | 0.00000513 ETH | ||||
| Send | 23316196 | 100 days ago | 0.00000884 ETH | ||||
| Send | 23316082 | 100 days ago | 0.00002407 ETH | ||||
| Send | 23315792 | 100 days ago | 0.00000513 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HyperliquidOFTWrapper
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {OFTWrapper} from "@stargatefinance/stg-evm-v2/src/peripheral/oft-wrapper/OFTWrapper.sol";
/**
* @title HyperliquidOFTWrapper
* @dev A contract that exports the OFTWrapper to provide specific functionality for Hyperliquid.
* @dev This contract is used to wrap the OFT functionality for Hyperliquid.
*
* @dev OFT on EndpointV2 have the following functions:
* @dev - sendOFTEpv2(address, SendParam, MessagingFee, address, FeeObj)
* @dev - sendOFTAdapterEpv2(address, SendParam, MessagingFee, address, FeeObj)
* @dev - estimateSendFeeEpv2(address, SendParam, bool, FeeObj)
* where
*
* struct FeeObj {
* uint256 callerBps; // <- 0
* address caller; // <- msg.sender
* bytes2 partnerId; // <- "0x0001"
* }
*
* @notice Source Code of the Base Contract found here:
* @notice https://github.com/stargate-protocol/stargate-v2/blob/main/packages/stg-evm-v2/src/peripheral/oft-wrapper/OFTWrapper.sol
*/
contract HyperliquidOFTWrapper is OFTWrapper {
constructor(uint256 _defaultBps, uint256 _callerBpsCap) OFTWrapper(_defaultBps, _callerBpsCap) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
/**
* @title IOAppCore
*/
interface IOAppCore {
// Custom error messages
error OnlyPeer(uint32 eid, bytes32 sender);
error NoPeer(uint32 eid);
error InvalidEndpointCall();
error InvalidDelegate();
// Event emitted when a peer (OApp) is set for a corresponding endpoint
event PeerSet(uint32 eid, bytes32 peer);
/**
* @notice Retrieves the OApp version information.
* @return senderVersion The version of the OAppSender.sol contract.
* @return receiverVersion The version of the OAppReceiver.sol contract.
*/
function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);
/**
* @notice Retrieves the LayerZero endpoint associated with the OApp.
* @return iEndpoint The LayerZero endpoint as an interface.
*/
function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);
/**
* @notice Retrieves the peer (OApp) associated with a corresponding endpoint.
* @param _eid The endpoint ID.
* @return peer The peer address (OApp instance) associated with the corresponding endpoint.
*/
function peers(uint32 _eid) external view returns (bytes32 peer);
/**
* @notice Sets the peer address (OApp instance) for a corresponding endpoint.
* @param _eid The endpoint ID.
* @param _peer The address of the peer to be associated with the corresponding endpoint.
*/
function setPeer(uint32 _eid, bytes32 _peer) external;
/**
* @notice Sets the delegate address for the OApp Core.
* @param _delegate The address of the delegate to be set.
*/
function setDelegate(address _delegate) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { IOAppCore, ILayerZeroEndpointV2 } from "./interfaces/IOAppCore.sol";
/**
* @title OAppCore
* @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.
*/
abstract contract OAppCore is IOAppCore, Ownable {
// The LayerZero endpoint associated with the given OApp
ILayerZeroEndpointV2 public immutable endpoint;
// Mapping to store peers associated with corresponding endpoints
mapping(uint32 eid => bytes32 peer) public peers;
/**
* @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.
* @param _endpoint The address of the LOCAL Layer Zero endpoint.
* @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
*
* @dev The delegate typically should be set as the owner of the contract.
*/
constructor(address _endpoint, address _delegate) {
endpoint = ILayerZeroEndpointV2(_endpoint);
if (_delegate == address(0)) revert InvalidDelegate();
endpoint.setDelegate(_delegate);
}
/**
* @notice Sets the peer address (OApp instance) for a corresponding endpoint.
* @param _eid The endpoint ID.
* @param _peer The address of the peer to be associated with the corresponding endpoint.
*
* @dev Only the owner/admin of the OApp can call this function.
* @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.
* @dev Set this to bytes32(0) to remove the peer address.
* @dev Peer is a bytes32 to accommodate non-evm chains.
*/
function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyOwner {
_setPeer(_eid, _peer);
}
/**
* @notice Sets the peer address (OApp instance) for a corresponding endpoint.
* @param _eid The endpoint ID.
* @param _peer The address of the peer to be associated with the corresponding endpoint.
*
* @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.
* @dev Set this to bytes32(0) to remove the peer address.
* @dev Peer is a bytes32 to accommodate non-evm chains.
*/
function _setPeer(uint32 _eid, bytes32 _peer) internal virtual {
peers[_eid] = _peer;
emit PeerSet(_eid, _peer);
}
/**
* @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.
* ie. the peer is set to bytes32(0).
* @param _eid The endpoint ID.
* @return peer The address of the peer associated with the specified endpoint.
*/
function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {
bytes32 peer = peers[_eid];
if (peer == bytes32(0)) revert NoPeer(_eid);
return peer;
}
/**
* @notice Sets the delegate address for the OApp.
* @param _delegate The address of the delegate to be set.
*
* @dev Only the owner/admin of the OApp can call this function.
* @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.
*/
function setDelegate(address _delegate) public onlyOwner {
endpoint.setDelegate(_delegate);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { MessagingParams, MessagingFee, MessagingReceipt } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
import { OAppCore } from "./OAppCore.sol";
/**
* @title OAppSender
* @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.
*/
abstract contract OAppSender is OAppCore {
using SafeERC20 for IERC20;
// Custom error messages
error NotEnoughNative(uint256 msgValue);
error LzTokenUnavailable();
// @dev The version of the OAppSender implementation.
// @dev Version is bumped when changes are made to this contract.
uint64 internal constant SENDER_VERSION = 1;
/**
* @notice Retrieves the OApp version information.
* @return senderVersion The version of the OAppSender.sol contract.
* @return receiverVersion The version of the OAppReceiver.sol contract.
*
* @dev Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented.
* ie. this is a SEND only OApp.
* @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions
*/
function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {
return (SENDER_VERSION, 0);
}
/**
* @dev Internal function to interact with the LayerZero EndpointV2.quote() for fee calculation.
* @param _dstEid The destination endpoint ID.
* @param _message The message payload.
* @param _options Additional options for the message.
* @param _payInLzToken Flag indicating whether to pay the fee in LZ tokens.
* @return fee The calculated MessagingFee for the message.
* - nativeFee: The native fee for the message.
* - lzTokenFee: The LZ token fee for the message.
*/
function _quote(
uint32 _dstEid,
bytes memory _message,
bytes memory _options,
bool _payInLzToken
) internal view virtual returns (MessagingFee memory fee) {
return
endpoint.quote(
MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _payInLzToken),
address(this)
);
}
/**
* @dev Internal function to interact with the LayerZero EndpointV2.send() for sending a message.
* @param _dstEid The destination endpoint ID.
* @param _message The message payload.
* @param _options Additional options for the message.
* @param _fee The calculated LayerZero fee for the message.
* - nativeFee: The native fee.
* - lzTokenFee: The lzToken fee.
* @param _refundAddress The address to receive any excess fee values sent to the endpoint.
* @return receipt The receipt for the sent message.
* - guid: The unique identifier for the sent message.
* - nonce: The nonce of the sent message.
* - fee: The LayerZero fee incurred for the message.
*/
function _lzSend(
uint32 _dstEid,
bytes memory _message,
bytes memory _options,
MessagingFee memory _fee,
address _refundAddress
) internal virtual returns (MessagingReceipt memory receipt) {
// @dev Push corresponding fees to the endpoint, any excess is sent back to the _refundAddress from the endpoint.
uint256 messageValue = _payNative(_fee.nativeFee);
if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);
return
// solhint-disable-next-line check-send-result
endpoint.send{ value: messageValue }(
MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _fee.lzTokenFee > 0),
_refundAddress
);
}
/**
* @dev Internal function to pay the native fee associated with the message.
* @param _nativeFee The native fee to be paid.
* @return nativeFee The amount of native currency paid.
*
* @dev If the OApp needs to initiate MULTIPLE LayerZero messages in a single transaction,
* this will need to be overridden because msg.value would contain multiple lzFees.
* @dev Should be overridden in the event the LayerZero endpoint requires a different native currency.
* @dev Some EVMs use an ERC20 as a method for paying transactions/gasFees.
* @dev The endpoint is EITHER/OR, ie. it will NOT support both types of native payment at a time.
*/
function _payNative(uint256 _nativeFee) internal virtual returns (uint256 nativeFee) {
if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);
return _nativeFee;
}
/**
* @dev Internal function to pay the LZ token fee associated with the message.
* @param _lzTokenFee The LZ token fee to be paid.
*
* @dev If the caller is trying to pay in the specified lzToken, then the lzTokenFee is passed to the endpoint.
* @dev Any excess sent, is passed back to the specified _refundAddress in the _lzSend().
*/
function _payLzToken(uint256 _lzTokenFee) internal virtual {
// @dev Cannot cache the token because it is not immutable in the endpoint.
address lzToken = endpoint.lzToken();
if (lzToken == address(0)) revert LzTokenUnavailable();
// Pay LZ token fee by sending tokens to the endpoint.
IERC20(lzToken).safeTransferFrom(msg.sender, address(endpoint), _lzTokenFee);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { MessagingReceipt, MessagingFee } from "../../oapp/OAppSender.sol";
/**
* @dev Struct representing token parameters for the OFT send() operation.
*/
struct SendParam {
uint32 dstEid; // Destination endpoint ID.
bytes32 to; // Recipient address.
uint256 amountLD; // Amount to send in local decimals.
uint256 minAmountLD; // Minimum amount to send in local decimals.
bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.
bytes composeMsg; // The composed message for the send() operation.
bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations.
}
/**
* @dev Struct representing OFT limit information.
* @dev These amounts can change dynamically and are up the the specific oft implementation.
*/
struct OFTLimit {
uint256 minAmountLD; // Minimum amount in local decimals that can be sent to the recipient.
uint256 maxAmountLD; // Maximum amount in local decimals that can be sent to the recipient.
}
/**
* @dev Struct representing OFT receipt information.
*/
struct OFTReceipt {
uint256 amountSentLD; // Amount of tokens ACTUALLY debited from the sender in local decimals.
// @dev In non-default implementations, the amountReceivedLD COULD differ from this value.
uint256 amountReceivedLD; // Amount of tokens to be received on the remote side.
}
/**
* @dev Struct representing OFT fee details.
* @dev Future proof mechanism to provide a standardized way to communicate fees to things like a UI.
*/
struct OFTFeeDetail {
int256 feeAmountLD; // Amount of the fee in local decimals.
string description; // Description of the fee.
}
/**
* @title IOFT
* @dev Interface for the OftChain (OFT) token.
* @dev Does not inherit ERC20 to accommodate usage by OFTAdapter as well.
* @dev This specific interface ID is '0x02e49c2c'.
*/
interface IOFT {
// Custom error messages
error InvalidLocalDecimals();
error SlippageExceeded(uint256 amountLD, uint256 minAmountLD);
// Events
event OFTSent(
bytes32 indexed guid, // GUID of the OFT message.
uint32 dstEid, // Destination Endpoint ID.
address indexed fromAddress, // Address of the sender on the src chain.
uint256 amountSentLD, // Amount of tokens sent in local decimals.
uint256 amountReceivedLD // Amount of tokens received in local decimals.
);
event OFTReceived(
bytes32 indexed guid, // GUID of the OFT message.
uint32 srcEid, // Source Endpoint ID.
address indexed toAddress, // Address of the recipient on the dst chain.
uint256 amountReceivedLD // Amount of tokens received in local decimals.
);
/**
* @notice Retrieves interfaceID and the version of the OFT.
* @return interfaceId The interface ID.
* @return version The version.
*
* @dev interfaceId: This specific interface ID is '0x02e49c2c'.
* @dev version: Indicates a cross-chain compatible msg encoding with other OFTs.
* @dev If a new feature is added to the OFT cross-chain msg encoding, the version will be incremented.
* ie. localOFT version(x,1) CAN send messages to remoteOFT version(x,1)
*/
function oftVersion() external view returns (bytes4 interfaceId, uint64 version);
/**
* @notice Retrieves the address of the token associated with the OFT.
* @return token The address of the ERC20 token implementation.
*/
function token() external view returns (address);
/**
* @notice Indicates whether the OFT contract requires approval of the 'token()' to send.
* @return requiresApproval Needs approval of the underlying token implementation.
*
* @dev Allows things like wallet implementers to determine integration requirements,
* without understanding the underlying token implementation.
*/
function approvalRequired() external view returns (bool);
/**
* @notice Retrieves the shared decimals of the OFT.
* @return sharedDecimals The shared decimals of the OFT.
*/
function sharedDecimals() external view returns (uint8);
/**
* @notice Provides a quote for OFT-related operations.
* @param _sendParam The parameters for the send operation.
* @return limit The OFT limit information.
* @return oftFeeDetails The details of OFT fees.
* @return receipt The OFT receipt information.
*/
function quoteOFT(
SendParam calldata _sendParam
) external view returns (OFTLimit memory, OFTFeeDetail[] memory oftFeeDetails, OFTReceipt memory);
/**
* @notice Provides a quote for the send() operation.
* @param _sendParam The parameters for the send() operation.
* @param _payInLzToken Flag indicating whether the caller is paying in the LZ token.
* @return fee The calculated LayerZero messaging fee from the send() operation.
*
* @dev MessagingFee: LayerZero msg fee
* - nativeFee: The native fee.
* - lzTokenFee: The lzToken fee.
*/
function quoteSend(SendParam calldata _sendParam, bool _payInLzToken) external view returns (MessagingFee memory);
/**
* @notice Executes the send() operation.
* @param _sendParam The parameters for the send operation.
* @param _fee The fee information supplied by the caller.
* - nativeFee: The native fee.
* - lzTokenFee: The lzToken fee.
* @param _refundAddress The address to receive any excess funds from fees etc. on the src.
* @return receipt The LayerZero messaging receipt from the send() operation.
* @return oftReceipt The OFT receipt information.
*
* @dev MessagingReceipt: LayerZero msg receipt
* - guid: The unique identifier for the sent message.
* - nonce: The nonce of the sent message.
* - fee: The LayerZero fee incurred for the message.
*/
function send(
SendParam calldata _sendParam,
MessagingFee calldata _fee,
address _refundAddress
) external payable returns (MessagingReceipt memory, OFTReceipt memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { IMessageLibManager } from "./IMessageLibManager.sol";
import { IMessagingComposer } from "./IMessagingComposer.sol";
import { IMessagingChannel } from "./IMessagingChannel.sol";
import { IMessagingContext } from "./IMessagingContext.sol";
struct MessagingParams {
uint32 dstEid;
bytes32 receiver;
bytes message;
bytes options;
bool payInLzToken;
}
struct MessagingReceipt {
bytes32 guid;
uint64 nonce;
MessagingFee fee;
}
struct MessagingFee {
uint256 nativeFee;
uint256 lzTokenFee;
}
struct Origin {
uint32 srcEid;
bytes32 sender;
uint64 nonce;
}
interface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {
event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);
event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);
event PacketDelivered(Origin origin, address receiver);
event LzReceiveAlert(
address indexed receiver,
address indexed executor,
Origin origin,
bytes32 guid,
uint256 gas,
uint256 value,
bytes message,
bytes extraData,
bytes reason
);
event LzTokenSet(address token);
event DelegateSet(address sender, address delegate);
function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);
function send(
MessagingParams calldata _params,
address _refundAddress
) external payable returns (MessagingReceipt memory);
function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;
function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);
function initializable(Origin calldata _origin, address _receiver) external view returns (bool);
function lzReceive(
Origin calldata _origin,
address _receiver,
bytes32 _guid,
bytes calldata _message,
bytes calldata _extraData
) external payable;
// oapp can burn messages partially by calling this function with its own business logic if messages are verified in order
function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;
function setLzToken(address _lzToken) external;
function lzToken() external view returns (address);
function nativeToken() external view returns (address);
function setDelegate(address _delegate) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
struct SetConfigParam {
uint32 eid;
uint32 configType;
bytes config;
}
interface IMessageLibManager {
struct Timeout {
address lib;
uint256 expiry;
}
event LibraryRegistered(address newLib);
event DefaultSendLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
event SendLibrarySet(address sender, uint32 eid, address newLib);
event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);
event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);
function registerLibrary(address _lib) external;
function isRegisteredLibrary(address _lib) external view returns (bool);
function getRegisteredLibraries() external view returns (address[] memory);
function setDefaultSendLibrary(uint32 _eid, address _newLib) external;
function defaultSendLibrary(uint32 _eid) external view returns (address);
function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _gracePeriod) external;
function defaultReceiveLibrary(uint32 _eid) external view returns (address);
function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;
function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);
function isSupportedEid(uint32 _eid) external view returns (bool);
function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);
/// ------------------- OApp interfaces -------------------
function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;
function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);
function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);
function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;
function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);
function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _expiry) external;
function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);
function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;
function getConfig(
address _oapp,
address _lib,
uint32 _eid,
uint32 _configType
) external view returns (bytes memory config);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
interface IMessagingChannel {
event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
function eid() external view returns (uint32);
// this is an emergency function if a message cannot be verified for some reasons
// required to provide _nextNonce to avoid race condition
function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;
function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);
function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);
function inboundPayloadHash(
address _receiver,
uint32 _srcEid,
bytes32 _sender,
uint64 _nonce
) external view returns (bytes32);
function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
interface IMessagingComposer {
event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
event LzComposeAlert(
address indexed from,
address indexed to,
address indexed executor,
bytes32 guid,
uint16 index,
uint256 gas,
uint256 value,
bytes message,
bytes extraData,
bytes reason
);
function composeQueue(
address _from,
address _to,
bytes32 _guid,
uint16 _index
) external view returns (bytes32 messageHash);
function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;
function lzCompose(
address _from,
address _to,
bytes32 _guid,
uint16 _index,
bytes calldata _message,
bytes calldata _extraData
) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
interface IMessagingContext {
function isSendingMessage() external view returns (bool);
function getSendContext() external view returns (uint32 dstEid, address sender);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./IOFTCore.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
* @dev Interface of the OFT standard
*/
interface IOFT is IOFTCore, IERC20 {
}// 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
pragma solidity >=0.5.0;
import "../interfaces/ICommonOFT.sol";
/**
* @dev Interface of the IOFT core standard
*/
interface IOFTWithFee is ICommonOFT {
/**
* @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
* `_minAmount` the minimum amount of tokens to receive on dstChain
* `_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, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) external payable;
function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) 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 ICommonOFT is IERC165 {
struct LzCallParams {
address payable refundAddress;
address zroPaymentAddress;
bytes adapterParams;
}
/**
* @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, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./ICommonOFT.sol";
/**
* @dev Interface of the IOFT core standard
*/
interface IOFTV2 is ICommonOFT {
/**
* @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, bytes32 _toAddress, uint _amount, LzCallParams calldata _callParams) external payable;
function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// 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
pragma solidity ^0.8.0;
interface INativeOFT {
function deposit() external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IOFTV2 } from "@layerzerolabs/solidity-examples/contracts/token/oft/v2/interfaces/IOFTV2.sol";
import { MessagingFee as MessagingFeeEpv2, SendParam as SendParamEpv2 } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol";
interface IOFTWrapper {
event CallerBpsCapSet(uint256 bps);
event DefaultBpsSet(uint256 bps);
event OFTBpsSet(address indexed token, uint256 bps);
event WrapperFees(bytes2 indexed partnerId, address token, uint256 wrapperFee, uint256 callerFee);
event WrapperFeeWithdrawn(address indexed oft, address to, uint256 amount);
struct FeeObj {
uint256 callerBps;
address caller;
bytes2 partnerId;
}
function sendOFT(
address _oft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint _amount,
uint256 _minAmount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external payable;
function sendProxyOFT(
address _proxyOft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint256 _amount,
uint256 _minAmount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external payable;
function sendNativeOFT(
address _nativeOft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint _amount,
uint256 _minAmount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external payable;
function sendOFTV2(
address _oft,
uint16 _dstChainId,
bytes32 _toAddress,
uint _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable;
function sendOFTFeeV2(
address _oft,
uint16 _dstChainId,
bytes32 _toAddress,
uint256 _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable;
function sendProxyOFTV2(
address _proxyOft,
uint16 _dstChainId,
bytes32 _toAddress,
uint _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable;
function sendProxyOFTFeeV2(
address _proxyOft,
uint16 _dstChainId,
bytes32 _toAddress,
uint _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable;
function sendNativeOFTFeeV2(
address _nativeOft,
uint16 _dstChainId,
bytes32 _toAddress,
uint _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable;
function sendOFTEpv2(
address _oft,
SendParamEpv2 calldata _sendParam,
MessagingFeeEpv2 calldata _fee,
address _refundAddress,
FeeObj calldata _feeObj
) external payable;
function sendOFTAdapterEpv2(
address _adapterOFT,
SendParamEpv2 calldata _sendParam,
MessagingFeeEpv2 calldata _fee,
address _refundAddress,
FeeObj calldata _feeObj
) external payable;
function getAmountAndFees(
address _oft,
uint256 _amount,
uint256 _callerBps
) external view returns (uint256 amount, uint256 wrapperFee, uint256 callerFee);
function estimateSendFee(
address _oft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint _amount,
bool _useZro,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external view returns (uint nativeFee, uint zroFee);
function estimateSendFeeV2(
address _oft,
uint16 _dstChainId,
bytes32 _toAddress,
uint _amount,
bool _useZro,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external view returns (uint nativeFee, uint zroFee);
function estimateSendFeeEpv2(
address _oft,
SendParamEpv2 calldata _sendParam,
bool _payInLzToken,
FeeObj calldata _feeObj
) external view returns (MessagingFeeEpv2 memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { IERC20, SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { IOFTV2 } from "@layerzerolabs/solidity-examples/contracts/token/oft/v2/interfaces/IOFTV2.sol";
import { IOFTWithFee } from "@layerzerolabs/solidity-examples/contracts/token/oft/v2/fee/IOFTWithFee.sol";
import { IOFT } from "@layerzerolabs/solidity-examples/contracts/token/oft/v1/interfaces/IOFT.sol";
import { IOFTWrapper } from "./interfaces/IOFTWrapper.sol";
import { INativeOFT } from "./interfaces/INativeOFT.sol";
import { IOFT as IOFTEpv2, MessagingFee as MessagingFeeEpv2, SendParam as SendParamEpv2 } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol";
contract OFTWrapper is IOFTWrapper, Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
using SafeERC20 for IOFT;
uint256 public constant BPS_DENOMINATOR = 10000;
uint256 public constant MAX_UINT = 2 ** 256 - 1; // indicates a bp fee of 0 that overrides the default bps
uint256 public defaultBps;
mapping(address => uint256) public oftBps;
uint256 public callerBpsCap;
constructor(uint256 _defaultBps, uint256 _callerBpsCap) {
require(_defaultBps < BPS_DENOMINATOR, "OFTWrapper: defaultBps >= 100%");
defaultBps = _defaultBps;
callerBpsCap = _callerBpsCap;
}
function setDefaultBps(uint256 _defaultBps) external onlyOwner {
require(_defaultBps < BPS_DENOMINATOR, "OFTWrapper: defaultBps >= 100%");
defaultBps = _defaultBps;
emit DefaultBpsSet(_defaultBps);
}
function setOFTBps(address _token, uint256 _bps) external onlyOwner {
require(_bps < BPS_DENOMINATOR || _bps == MAX_UINT, "OFTWrapper: oftBps[_oft] >= 100%");
oftBps[_token] = _bps;
emit OFTBpsSet(_token, _bps);
}
function setCallerBpsCap(uint256 _callerBpsCap) external onlyOwner {
require(_callerBpsCap <= BPS_DENOMINATOR, "OFTWrapper: callerBpsCap > 100%");
callerBpsCap = _callerBpsCap;
emit CallerBpsCapSet(_callerBpsCap);
}
function withdrawFees(address _oft, address _to, uint256 _amount) external onlyOwner {
IOFT(_oft).safeTransfer(_to, _amount);
emit WrapperFeeWithdrawn(_oft, _to, _amount);
}
function sendOFT(
address _oft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint256 _amount,
uint256 _minAmount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
uint256 amountToSwap = _getAmountAndPayFee(_oft, _amount, _minAmount, _feeObj);
IOFT(_oft).sendFrom{ value: msg.value }(
msg.sender,
_dstChainId,
_toAddress,
amountToSwap,
_refundAddress,
_zroPaymentAddress,
_adapterParams
);
}
function sendProxyOFT(
address _proxyOft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint256 _amount,
uint256 _minAmount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
address token = IOFTV2(_proxyOft).token();
{
uint256 amountToSwap = _getAmountAndPayFeeProxy(token, _amount, _minAmount, _feeObj);
// approve proxy to spend tokens
IOFT(token).safeApprove(_proxyOft, amountToSwap);
IOFT(_proxyOft).sendFrom{ value: msg.value }(
address(this),
_dstChainId,
_toAddress,
amountToSwap,
_refundAddress,
_zroPaymentAddress,
_adapterParams
);
}
// reset allowance if sendFrom() does not consume full amount
if (IOFT(token).allowance(address(this), _proxyOft) > 0) IOFT(token).safeApprove(_proxyOft, 0);
}
function sendNativeOFT(
address _nativeOft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint _amount,
uint256 _minAmount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
require(msg.value >= _amount, "OFTWrapper: not enough value sent");
INativeOFT(_nativeOft).deposit{ value: _amount }();
uint256 amountToSwap = _getAmountAndPayFeeNative(_nativeOft, _amount, _minAmount, _feeObj);
IOFT(_nativeOft).sendFrom{ value: msg.value - _amount }(
address(this),
_dstChainId,
_toAddress,
amountToSwap,
_refundAddress,
_zroPaymentAddress,
_adapterParams
);
}
function sendOFTV2(
address _oft,
uint16 _dstChainId,
bytes32 _toAddress,
uint256 _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
uint256 amountToSwap = _getAmountAndPayFee(_oft, _amount, _minAmount, _feeObj);
IOFTV2(_oft).sendFrom{ value: msg.value }(msg.sender, _dstChainId, _toAddress, amountToSwap, _callParams);
}
function sendOFTFeeV2(
address _oft,
uint16 _dstChainId,
bytes32 _toAddress,
uint256 _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
uint256 amountToSwap = _getAmountAndPayFee(_oft, _amount, _minAmount, _feeObj);
IOFTWithFee(_oft).sendFrom{ value: msg.value }(
msg.sender,
_dstChainId,
_toAddress,
amountToSwap,
_minAmount,
_callParams
);
}
function sendProxyOFTV2(
address _proxyOft,
uint16 _dstChainId,
bytes32 _toAddress,
uint256 _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
address token = IOFTV2(_proxyOft).token();
uint256 amountToSwap = _getAmountAndPayFeeProxy(token, _amount, _minAmount, _feeObj);
// approve proxy to spend tokens
IOFT(token).safeApprove(_proxyOft, amountToSwap);
IOFTV2(_proxyOft).sendFrom{ value: msg.value }(
address(this),
_dstChainId,
_toAddress,
amountToSwap,
_callParams
);
// reset allowance if sendFrom() does not consume full amount
if (IOFT(token).allowance(address(this), _proxyOft) > 0) IOFT(token).safeApprove(_proxyOft, 0);
}
function sendProxyOFTFeeV2(
address _proxyOft,
uint16 _dstChainId,
bytes32 _toAddress,
uint256 _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
address token = IOFTV2(_proxyOft).token();
uint256 amountToSwap = _getAmountAndPayFeeProxy(token, _amount, _minAmount, _feeObj);
// approve proxy to spend tokens
IOFT(token).safeApprove(_proxyOft, amountToSwap);
IOFTWithFee(_proxyOft).sendFrom{ value: msg.value }(
address(this),
_dstChainId,
_toAddress,
amountToSwap,
_minAmount,
_callParams
);
// reset allowance if sendFrom() does not consume full amount
if (IOFT(token).allowance(address(this), _proxyOft) > 0) IOFT(token).safeApprove(_proxyOft, 0);
}
function sendNativeOFTFeeV2(
address _nativeOft,
uint16 _dstChainId,
bytes32 _toAddress,
uint _amount,
uint256 _minAmount,
IOFTV2.LzCallParams calldata _callParams,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
require(msg.value >= _amount, "OFTWrapper: not enough value sent");
INativeOFT(_nativeOft).deposit{ value: _amount }();
uint256 amountToSwap = _getAmountAndPayFeeNative(_nativeOft, _amount, _minAmount, _feeObj);
IOFTWithFee(_nativeOft).sendFrom{ value: msg.value - _amount }(
address(this),
_dstChainId,
_toAddress,
amountToSwap,
_minAmount,
_callParams
);
}
function sendOFTEpv2(
address _oft,
SendParamEpv2 calldata _sendParam,
MessagingFeeEpv2 calldata _fee,
address _refundAddress,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
uint256 amountToSwap = _getAmountAndPayFeeProxy(_oft, _sendParam.amountLD, _sendParam.minAmountLD, _feeObj);
IOFTEpv2(_oft).send{ value: msg.value }(
SendParamEpv2(
_sendParam.dstEid,
_sendParam.to,
amountToSwap,
_sendParam.minAmountLD,
_sendParam.extraOptions,
_sendParam.composeMsg,
_sendParam.oftCmd
),
_fee,
_refundAddress
);
}
function sendOFTAdapterEpv2(
address _adapterOFT,
SendParamEpv2 calldata _sendParam,
MessagingFeeEpv2 calldata _fee,
address _refundAddress,
FeeObj calldata _feeObj
) external payable nonReentrant {
_assertCallerBps(_feeObj.callerBps);
address token = IOFT(_adapterOFT).token();
uint256 amountToSwap = _getAmountAndPayFeeProxy(token, _sendParam.amountLD, _sendParam.minAmountLD, _feeObj);
IERC20(token).safeApprove(_adapterOFT, amountToSwap);
IOFTEpv2(_adapterOFT).send{ value: msg.value }(
SendParamEpv2(
_sendParam.dstEid,
_sendParam.to,
amountToSwap,
_sendParam.minAmountLD,
_sendParam.extraOptions,
_sendParam.composeMsg,
_sendParam.oftCmd
),
_fee,
_refundAddress
);
if (IERC20(token).allowance(address(this), _adapterOFT) > 0) IERC20(token).safeApprove(_adapterOFT, 0);
}
function _getAmountAndPayFeeProxy(
address _token,
uint256 _amount,
uint256 _minAmount,
FeeObj calldata _feeObj
) internal returns (uint256) {
(uint256 amountToSwap, uint256 wrapperFee, uint256 callerFee) = _getAmountAndFees(
_token,
_amount,
_feeObj.callerBps
);
require(amountToSwap >= _minAmount && amountToSwap > 0, "OFTWrapper: not enough amountToSwap");
IOFT(_token).safeTransferFrom(msg.sender, address(this), amountToSwap + wrapperFee); // pay wrapper and move proxy tokens to contract
if (callerFee > 0) IOFT(_token).safeTransferFrom(msg.sender, _feeObj.caller, callerFee); // pay caller
emit WrapperFees(_feeObj.partnerId, _token, wrapperFee, callerFee);
return amountToSwap;
}
function _getAmountAndPayFee(
address _token,
uint256 _amount,
uint256 _minAmount,
FeeObj calldata _feeObj
) internal returns (uint256) {
(uint256 amountToSwap, uint256 wrapperFee, uint256 callerFee) = _getAmountAndFees(
_token,
_amount,
_feeObj.callerBps
);
require(amountToSwap >= _minAmount && amountToSwap > 0, "OFTWrapper: not enough amountToSwap");
if (wrapperFee > 0) IOFT(_token).safeTransferFrom(msg.sender, address(this), wrapperFee); // pay wrapper
if (callerFee > 0) IOFT(_token).safeTransferFrom(msg.sender, _feeObj.caller, callerFee); // pay caller
emit WrapperFees(_feeObj.partnerId, _token, wrapperFee, callerFee);
return amountToSwap;
}
function _getAmountAndPayFeeNative(
address _nativeOft,
uint256 _amount,
uint256 _minAmount,
FeeObj calldata _feeObj
) internal returns (uint256) {
(uint256 amountToSwap, uint256 wrapperFee, uint256 callerFee) = _getAmountAndFees(
_nativeOft,
_amount,
_feeObj.callerBps
);
require(amountToSwap >= _minAmount && amountToSwap > 0, "OFTWrapper: not enough amountToSwap");
// pay fee in NativeOFT token as the caller might not be able to receive ETH
// wrapper fee is already in the contract after calling NativeOFT.deposit()
if (callerFee > 0) IOFT(_nativeOft).safeTransfer(_feeObj.caller, callerFee); // pay caller
emit WrapperFees(_feeObj.partnerId, _nativeOft, wrapperFee, callerFee);
return amountToSwap;
}
function getAmountAndFees(
address _token, // will be the token on proxies, and the oft on non-proxy
uint256 _amount,
uint256 _callerBps
) public view override returns (uint256 amount, uint256 wrapperFee, uint256 callerFee) {
_assertCallerBps(_callerBps);
return _getAmountAndFees(_token, _amount, _callerBps);
}
function _getAmountAndFees(
address _token, // will be the token on proxies, and the oft on non-proxy
uint256 _amount,
uint256 _callerBps
) internal view returns (uint256 amount, uint256 wrapperFee, uint256 callerFee) {
uint256 wrapperBps;
uint256 tokenBps = oftBps[_token];
if (tokenBps == MAX_UINT) {
wrapperBps = 0;
} else if (tokenBps > 0) {
wrapperBps = tokenBps;
} else {
wrapperBps = defaultBps;
}
require(wrapperBps + _callerBps < BPS_DENOMINATOR, "OFTWrapper: Fee bps >= 100%");
wrapperFee = wrapperBps > 0 ? (_amount * wrapperBps) / BPS_DENOMINATOR : 0;
callerFee = _callerBps > 0 ? (_amount * _callerBps) / BPS_DENOMINATOR : 0;
amount = wrapperFee > 0 || callerFee > 0 ? _amount - wrapperFee - callerFee : _amount;
}
function estimateSendFee(
address _oft,
uint16 _dstChainId,
bytes calldata _toAddress,
uint256 _amount,
bool _useZro,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external view override returns (uint nativeFee, uint zroFee) {
_assertCallerBps(_feeObj.callerBps);
(uint256 amount, , ) = _getAmountAndFees(IOFT(_oft).token(), _amount, _feeObj.callerBps);
return IOFT(_oft).estimateSendFee(_dstChainId, _toAddress, amount, _useZro, _adapterParams);
}
function estimateSendFeeV2(
address _oft,
uint16 _dstChainId,
bytes32 _toAddress,
uint256 _amount,
bool _useZro,
bytes calldata _adapterParams,
FeeObj calldata _feeObj
) external view override returns (uint nativeFee, uint zroFee) {
_assertCallerBps(_feeObj.callerBps);
(uint256 amount, , ) = _getAmountAndFees(IOFTV2(_oft).token(), _amount, _feeObj.callerBps);
return IOFTV2(_oft).estimateSendFee(_dstChainId, _toAddress, amount, _useZro, _adapterParams);
}
function estimateSendFeeEpv2(
address _oft,
SendParamEpv2 calldata _sendParam,
bool _payInLzToken,
FeeObj calldata _feeObj
) external view returns (MessagingFeeEpv2 memory) {
_assertCallerBps(_feeObj.callerBps);
(uint256 amount, , ) = _getAmountAndFees(IOFTEpv2(_oft).token(), _sendParam.amountLD, _feeObj.callerBps);
return
IOFTEpv2(_oft).quoteSend(
SendParamEpv2(
_sendParam.dstEid,
_sendParam.to,
amount,
_sendParam.minAmountLD,
_sendParam.extraOptions,
_sendParam.composeMsg,
_sendParam.oftCmd
),
_payInLzToken
);
}
function _assertCallerBps(uint256 _callerBps) internal view {
require(_callerBps <= callerBpsCap, "OFTWrapper: callerBps > callerBpsCap");
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"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":"uint256","name":"_defaultBps","type":"uint256"},{"internalType":"uint256","name":"_callerBpsCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"CallerBpsCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"DefaultBpsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"OFTBpsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oft","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WrapperFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes2","name":"partnerId","type":"bytes2"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"wrapperFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callerFee","type":"uint256"}],"name":"WrapperFees","type":"event"},{"inputs":[],"name":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_UINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerBpsCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"estimateSendFeeEpv2","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"estimateSendFeeV2","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_callerBps","type":"uint256"}],"name":"getAmountAndFees","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"wrapperFee","type":"uint256"},{"internalType":"uint256","name":"callerFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"oftBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nativeOft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendNativeOFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_nativeOft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendNativeOFTFeeV2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendOFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_adapterOFT","type":"address"},{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendOFTAdapterEpv2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendOFTEpv2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendOFTFeeV2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendOFTV2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyOft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendProxyOFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyOft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendProxyOFTFeeV2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyOft","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"},{"components":[{"internalType":"uint256","name":"callerBps","type":"uint256"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes2","name":"partnerId","type":"bytes2"}],"internalType":"struct IOFTWrapper.FeeObj","name":"_feeObj","type":"tuple"}],"name":"sendProxyOFTV2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callerBpsCap","type":"uint256"}],"name":"setCallerBpsCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultBps","type":"uint256"}],"name":"setDefaultBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"setOFTBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oft","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002d3138038062002d318339810160408190526200003491620000fd565b81816200004133620000ad565b6001805561271082106200009b5760405162461bcd60e51b815260206004820152601e60248201527f4f4654577261707065723a2064656661756c74427073203e3d20313030250000604482015260640160405180910390fd5b60029190915560045550620001229050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156200011157600080fd5b505080516020909101519092909150565b612bff80620001326000396000f3fe6080604052600436106101815760003560e01c8063a8198c00116100d1578063e1a452181161008a578063e5b5019a11610064578063e5b5019a14610402578063e90d5fc914610418578063f2fde38b14610453578063fdb80c811461047357600080fd5b8063e1a45218146103ac578063e1bafc80146103c2578063e55dc4e6146103e257600080fd5b8063a8198c0014610334578063ab03b5fd14610347578063c3c8032a1461035d578063ca3e534c14610370578063d1b308dc14610383578063dda16a101461039957600080fd5b80637a7511821161013e5780638bcb586c116101185780638bcb586c146102a45780638d8c915c146102b75780638da5cb5b146102ec578063a46d74bc1461031457600080fd5b80637a7511821461024357806383e166381461027e578063851548491461029157600080fd5b80630c3d27561461018657806317696f64146101a857806336739d3d146101e8578063498eff641461020857806362bf7c9e1461021b578063715018a61461022e575b600080fd5b34801561019257600080fd5b506101a66101a1366004611fdb565b610486565b005b3480156101b457600080fd5b506101c86101c3366004612007565b610549565b604080519384526020840192909252908201526060015b60405180910390f35b3480156101f457600080fd5b506101a661020336600461203c565b610571565b6101a66102163660046120c8565b610607565b6101a66102293660046121be565b6106af565b34801561023a57600080fd5b506101a661087b565b34801561024f57600080fd5b5061027061025e366004612250565b60036020526000908152604090205481565b6040519081526020016101df565b6101a661028c3660046121be565b61088f565b6101a661029f366004612274565b610b5e565b6101a66102b2366004612274565b610bfc565b3480156102c357600080fd5b506102d76102d2366004612312565b610d9b565b604080519283526020830191909152016101df565b3480156102f857600080fd5b506000546040516001600160a01b0390911681526020016101df565b34801561032057600080fd5b506101a661032f36600461203c565b610ea4565b6101a6610342366004612274565b610f32565b34801561035357600080fd5b5061027060045481565b6101a661036b3660046120c8565b610f89565b6101a661037e366004612274565b611140565b34801561038f57600080fd5b5061027060025481565b6101a66103a7366004612274565b611216565b3480156103b857600080fd5b5061027061271081565b3480156103ce57600080fd5b506102d76103dd3660046123b1565b6112e8565b3480156103ee57600080fd5b506101a66103fd366004612474565b6113c8565b34801561040e57600080fd5b5061027060001981565b34801561042457600080fd5b506104386104333660046124b5565b61142f565b604080518251815260209283015192810192909252016101df565b34801561045f57600080fd5b506101a661046e366004612250565b611659565b6101a66104813660046120c8565b6116d2565b61048e6117ae565b61271081108061049f575060001981145b6104f05760405162461bcd60e51b815260206004820181905260248201527f4f4654577261707065723a206f66744270735b5f6f66745d203e3d203130302560448201526064015b60405180910390fd5b6001600160a01b03821660008181526003602052604090819020839055517ff51611cfa84d1f2df6840c4651ba5b8f3f45d66811e43567dfe472a6b5a7ffb89061053d9084815260200190565b60405180910390a25050565b600080600061055784611808565b610562868686611866565b92509250925093509350939050565b6105796117ae565b6127108111156105cb5760405162461bcd60e51b815260206004820152601f60248201527f4f4654577261707065723a2063616c6c6572427073436170203e20313030250060448201526064016104e7565b60048190556040518181527fb474bfee9176a4392a746f7432e2daa216a9db2234f881770e4096bddeefaeb2906020015b60405180910390a150565b61060f61198f565b6106198135611808565b60006106278c8989856119e8565b90508b6001600160a01b0316635190563634338e8e8e878d8d8d8d6040518b63ffffffff1660e01b815260040161066699989796959493929190612552565b6000604051808303818588803b15801561067f57600080fd5b505af1158015610693573d6000803e3d6000fd5b5050505050506106a260018055565b5050505050505050505050565b6106b761198f565b6106c18135611808565b60006106d7868660400135876060013585611ae6565b9050856001600160a01b031663c7c7f5b3346040518060e0016040528089600001602081019061070791906125b9565b63ffffffff168152602001896020013581526020018581526020018960600135815260200189806080019061073c91906125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161078360a08b018b6125df565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016107ca60c08b018b6125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e085901b1681526108259190899089906004016126f5565b60c06040518083038185885af1158015610843573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108689190612791565b50505061087460018055565b5050505050565b6108836117ae565b61088d6000611b4a565b565b61089761198f565b6108a18135611808565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109059190612833565b9050600061091d828760400135886060013586611ae6565b90506109336001600160a01b0383168883611b9a565b866001600160a01b031663c7c7f5b3346040518060e001604052808a600001602081019061096191906125b9565b63ffffffff1681526020018a6020013581526020018581526020018a6060013581526020018a806080019061099691906125df565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016109dd60a08c018c6125df565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001610a2460c08c018c6125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e085901b168152610a7f91908a908a906004016126f5565b60c06040518083038185885af1158015610a9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ac29190612791565b5050604051636eb1769f60e11b81523060048201526001600160a01b0388811660248301526000919084169063dd62ed3e90604401602060405180830381865afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190612850565b1115610b5357610b536001600160a01b038316886000611b9a565b505061087460018055565b610b6661198f565b610b708135611808565b6000610b7e888686856119e8565b9050876001600160a01b0316632cdf0b9534338a8a868a8a6040518863ffffffff1660e01b8152600401610bb7969594939291906128f1565b6000604051808303818588803b158015610bd057600080fd5b505af1158015610be4573d6000803e3d6000fd5b505050505050610bf360018055565b50505050505050565b610c0461198f565b610c0e8135611808565b6000876001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c729190612833565b90506000610c8282878786611ae6565b9050610c986001600160a01b0383168a83611b9a565b604051632cdf0b9560e01b81526001600160a01b038a1690632cdf0b95903490610cd09030908d908d9088908d908d906004016128f1565b6000604051808303818588803b158015610ce957600080fd5b505af1158015610cfd573d6000803e3d6000fd5b5050604051636eb1769f60e11b81523060048201526001600160a01b038d81166024830152600094508616925063dd62ed3e9150604401602060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d759190612850565b1115610d9057610d906001600160a01b0383168a6000611b9a565b5050610bf360018055565b600080610da88335611808565b6000610e178b6001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612833565b898635611866565b5050604051630d94982d60e21b81529091506001600160a01b038c169063365260b490610e52908d908d9086908d908d908d9060040161293a565b6040805180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e92919061296c565b92509250509850989650505050505050565b610eac6117ae565b6127108110610efd5760405162461bcd60e51b815260206004820152601e60248201527f4f4654577261707065723a2064656661756c74427073203e3d2031303025000060448201526064016104e7565b60028190556040518181527f935f0caa3a542ed0e18e9116cee6e58fc0e502596c9a47909aa4af65fd69b991906020016105fc565b610f3a61198f565b610f448135611808565b6000610f52888686856119e8565b9050876001600160a01b031663695ef6bf34338a8a86896040518763ffffffff1660e01b8152600401610bb7959493929190612990565b610f9161198f565b610f9b8135611808565b60008b6001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190612833565b9050600061100f828a8a86611ae6565b90506110256001600160a01b0383168e83611b9a565b8c6001600160a01b0316635190563634308f8f8f878e8e8e8e6040518b63ffffffff1660e01b815260040161106299989796959493929190612552565b6000604051808303818588803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050506000816001600160a01b031663dd62ed3e308f6040518363ffffffff1660e01b81526004016110da9291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190612850565b1115611136576111366001600160a01b0382168d6000611b9a565b506106a260018055565b61114861198f565b6111528135611808565b833410156111725760405162461bcd60e51b81526004016104e7906129c7565b866001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111ad57600080fd5b505af11580156111c1573d6000803e3d6000fd5b505050505060006111d488868685611ce7565b90506001600160a01b038816632cdf0b956111ef8734612a1e565b308a8a868a8a6040518863ffffffff1660e01b8152600401610bb7969594939291906128f1565b61121e61198f565b6112288135611808565b6000876001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c9190612833565b9050600061129c82878786611ae6565b90506112b26001600160a01b0383168a83611b9a565b60405163695ef6bf60e01b81526001600160a01b038a169063695ef6bf903490610cd09030908d908d9088908c90600401612990565b6000806112f58335611808565b60006113388c6001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610deb573d6000803e3d6000fd5b5050604051632a205e3d60e01b81529091506001600160a01b038d1690632a205e3d90611375908e908e908e9087908e908e908e90600401612a37565b6040805180830381865afa158015611391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b5919061296c565b9250925050995099975050505050505050565b6113d06117ae565b6113e46001600160a01b0384168383611d50565b604080516001600160a01b038481168252602082018490528516917ff6514f9f283faac4cf3f3a6a702c116227ad0f2c727fb336e4c10b418bc6d613910160405180910390a2505050565b604080518082019091526000808252602082015261144d8235611808565b60006114c0866001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b49190612833565b60408701358535611866565b50509050856001600160a01b0316633b6f743b6040518060e001604052808860000160208101906114f191906125b9565b63ffffffff168152602001886020013581526020018481526020018860600135815260200188806080019061152691906125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161156d60a08a018a6125df565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016115b460c08a018a6125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e084901b16815261160d91908890600401612a84565b6040805180830381865afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190612aa8565b9150505b949350505050565b6116616117ae565b6001600160a01b0381166116c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104e7565b6116cf81611b4a565b50565b6116da61198f565b6116e48135611808565b863410156117045760405162461bcd60e51b81526004016104e7906129c7565b8a6001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561173f57600080fd5b505af1158015611753573d6000803e3d6000fd5b505050505060006117668c898985611ce7565b90506001600160a01b038c1663519056366117818a34612a1e565b308e8e8e878d8d8d8d6040518b63ffffffff1660e01b815260040161066699989796959493929190612552565b6000546001600160a01b0316331461088d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104e7565b6004548111156116cf5760405162461bcd60e51b8152602060048201526024808201527f4f4654577261707065723a2063616c6c6572427073203e2063616c6c657242706044820152630734361760e41b60648201526084016104e7565b6001600160a01b0383166000908152600360205260408120548190819081906001810161189657600091506118aa565b80156118a4578091506118aa565b60025491505b6127106118b78784612ac4565b106119045760405162461bcd60e51b815260206004820152601b60248201527f4f4654577261707065723a2046656520627073203e3d2031303025000000000060448201526064016104e7565b6000821161191357600061192a565b6127106119208389612ad7565b61192a9190612aee565b93506000861161193b576000611952565b6127106119488789612ad7565b6119529190612aee565b925060008411806119635750600083115b61196d5786611982565b826119788589612a1e565b6119829190612a1e565b9450505093509350939050565b6002600154036119e15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104e7565b6002600155565b60008080806119f988888735611866565b925092509250858310158015611a0f5750600083115b611a2b5760405162461bcd60e51b81526004016104e790612b10565b8115611a4657611a466001600160a01b038916333085611d80565b8015611a7257611a7233611a606040880160208901612250565b6001600160a01b038b16919084611d80565b611a826060860160408701612b53565b604080516001600160a01b038b168152602081018590529081018390526001600160f01b031991909116907f97bcdc1dd7ab82ef93280983f23d391afea463d0333fddd1a4617693b9ccfeea9060600160405180910390a250909695505050505050565b6000808080611af788888735611866565b925092509250858310158015611b0d5750600083115b611b295760405162461bcd60e51b81526004016104e790612b10565b611a463330611b388587612ac4565b6001600160a01b038c16929190611d80565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580611c145750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611bee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c129190612850565b155b611c7f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016104e7565b6040516001600160a01b038316602482015260448101829052611ce290849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dbe565b505050565b6000808080611cf888888735611866565b925092509250858310158015611d0e5750600083115b611d2a5760405162461bcd60e51b81526004016104e790612b10565b8015611a7257611a72611d436040870160208801612250565b6001600160a01b038a1690835b6040516001600160a01b038316602482015260448101829052611ce290849063a9059cbb60e01b90606401611cab565b6040516001600160a01b0380851660248301528316604482015260648101829052611db89085906323b872dd60e01b90608401611cab565b50505050565b6000611e13826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e939092919063ffffffff16565b9050805160001480611e34575080806020019051810190611e349190612b7d565b611ce25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104e7565b6060611651848460008585600080866001600160a01b03168587604051611eba9190612b9a565b60006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b5091509150611f0d87838387611f18565b979650505050505050565b60608315611f87578251600003611f80576001600160a01b0385163b611f805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104e7565b5081611651565b6116518383815115611f9c5781518083602001fd5b8060405162461bcd60e51b81526004016104e79190612bb6565b6001600160a01b03811681146116cf57600080fd5b8035611fd681611fb6565b919050565b60008060408385031215611fee57600080fd5b8235611ff981611fb6565b946020939093013593505050565b60008060006060848603121561201c57600080fd5b833561202781611fb6565b95602085013595506040909401359392505050565b60006020828403121561204e57600080fd5b5035919050565b803561ffff81168114611fd657600080fd5b60008083601f84011261207957600080fd5b50813567ffffffffffffffff81111561209157600080fd5b6020830191508360208285010111156120a957600080fd5b9250929050565b6000606082840312156120c257600080fd5b50919050565b60008060008060008060008060008060006101608c8e0312156120ea57600080fd5b6120f48c35611fb6565b8b359a5061210460208d01612055565b995067ffffffffffffffff8060408e0135111561212057600080fd5b6121308e60408f01358f01612067565b909a50985060608d0135975060808d0135965061215060a08e0135611fb6565b60a08d0135955061216360c08e01611fcb565b94508060e08e0135111561217657600080fd5b506121878d60e08e01358e01612067565b909350915061219a8d6101008e016120b0565b90509295989b509295989b9093969950565b600060e082840312156120c257600080fd5b60008060008060008587036101008112156121d857600080fd5b86356121e381611fb6565b9550602087013567ffffffffffffffff8111156121ff57600080fd5b61220b89828a016121ac565b9550506040603f198201121561222057600080fd5b50604086019250608086013561223581611fb6565b91506122448760a088016120b0565b90509295509295909350565b60006020828403121561226257600080fd5b813561226d81611fb6565b9392505050565b6000806000806000806000610120888a03121561229057600080fd5b873561229b81611fb6565b96506122a960208901612055565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156122da57600080fd5b6122e68a828b016120b0565b9250506122f68960c08a016120b0565b905092959891949750929550565b80151581146116cf57600080fd5b600080600080600080600080610120898b03121561232f57600080fd5b883561233a81611fb6565b975061234860208a01612055565b96506040890135955060608901359450608089013561236681612304565b935060a089013567ffffffffffffffff81111561238257600080fd5b61238e8b828c01612067565b90945092506123a290508a60c08b016120b0565b90509295985092959890939650565b60008060008060008060008060006101208a8c0312156123d057600080fd5b89356123db81611fb6565b98506123e960208b01612055565b975060408a013567ffffffffffffffff8082111561240657600080fd5b6124128d838e01612067565b909950975060608c0135965060808c0135915061242e82612304565b90945060a08b0135908082111561244457600080fd5b506124518c828d01612067565b909450925061246590508b60c08c016120b0565b90509295985092959850929598565b60008060006060848603121561248957600080fd5b833561249481611fb6565b925060208401356124a481611fb6565b929592945050506040919091013590565b60008060008060c085870312156124cb57600080fd5b84356124d681611fb6565b9350602085013567ffffffffffffffff8111156124f257600080fd5b6124fe878288016121ac565b935050604085013561250f81612304565b915061251e86606087016120b0565b905092959194509250565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600060018060a01b03808c16835261ffff8b16602084015260e0604084015261257f60e084018a8c612529565b886060850152818816608085015281871660a085015283810360c08501526125a8818688612529565b9d9c50505050505050505050505050565b6000602082840312156125cb57600080fd5b813563ffffffff8116811461226d57600080fd5b6000808335601e198436030181126125f657600080fd5b83018035915067ffffffffffffffff82111561261157600080fd5b6020019150368190038213156120a957600080fd5b60005b83811015612641578181015183820152602001612629565b50506000910152565b60008151808452612662816020860160208601612626565b601f01601f19169290920160200192915050565b63ffffffff81511682526020810151602083015260408101516040830152606081015160608301526000608082015160e060808501526126b960e085018261264a565b905060a083015184820360a08601526126d2828261264a565b91505060c083015184820360c08601526126ec828261264a565b95945050505050565b6080815260006127086080830186612676565b8435602084810191909152909401356040830152506001600160a01b0391909116606090910152919050565b60006040828403121561274657600080fd5b6040516040810181811067ffffffffffffffff8211171561277757634e487b7160e01b600052604160045260246000fd5b604052825181526020928301519281019290925250919050565b60008082840360c08112156127a557600080fd5b60808112156127b357600080fd5b506040516060810167ffffffffffffffff82821081831117156127e657634e487b7160e01b600052604160045260246000fd5b816040528551835260208601519150808216821461280357600080fd5b5060208201526128168560408601612734565b6040820152915061282a8460808501612734565b90509250929050565b60006020828403121561284557600080fd5b815161226d81611fb6565b60006020828403121561286257600080fd5b5051919050565b6000813561287681611fb6565b6001600160a01b03908116845260208301359061289282611fb6565b166020840152604082013536839003601e190181126128b057600080fd5b820160208101903567ffffffffffffffff8111156128cd57600080fd5b8036038213156128dc57600080fd5b606060408601526126ec606086018284612529565b60018060a01b038716815261ffff8616602082015284604082015283606082015282608082015260c060a0820152600061292e60c0830184612869565b98975050505050505050565b61ffff87168152856020820152846040820152831515606082015260a06080820152600061292e60a083018486612529565b6000806040838503121561297f57600080fd5b505080516020909101519092909150565b60018060a01b038616815261ffff8516602082015283604082015282606082015260a060808201526000611f0d60a0830184612869565b60208082526021908201527f4f4654577261707065723a206e6f7420656e6f7567682076616c75652073656e6040820152601d60fa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612a3157612a31612a08565b92915050565b61ffff8816815260a060208201526000612a5560a08301888a612529565b86604084015285151560608401528281036080840152612a76818587612529565b9a9950505050505050505050565b604081526000612a976040830185612676565b905082151560208301529392505050565b600060408284031215612aba57600080fd5b61226d8383612734565b80820180821115612a3157612a31612a08565b8082028115828204841417612a3157612a31612a08565b600082612b0b57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526023908201527f4f4654577261707065723a206e6f7420656e6f75676820616d6f756e74546f5360408201526207761760ec1b606082015260800190565b600060208284031215612b6557600080fd5b81356001600160f01b03198116811461226d57600080fd5b600060208284031215612b8f57600080fd5b815161226d81612304565b60008251612bac818460208701612626565b9190910192915050565b60208152600061226d602083018461264a56fea2646970667358221220e1af997aecbb6b0a65238fe239c1de91209ddf1cf301ee1b274fd934ba3e905764736f6c6343000816003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101815760003560e01c8063a8198c00116100d1578063e1a452181161008a578063e5b5019a11610064578063e5b5019a14610402578063e90d5fc914610418578063f2fde38b14610453578063fdb80c811461047357600080fd5b8063e1a45218146103ac578063e1bafc80146103c2578063e55dc4e6146103e257600080fd5b8063a8198c0014610334578063ab03b5fd14610347578063c3c8032a1461035d578063ca3e534c14610370578063d1b308dc14610383578063dda16a101461039957600080fd5b80637a7511821161013e5780638bcb586c116101185780638bcb586c146102a45780638d8c915c146102b75780638da5cb5b146102ec578063a46d74bc1461031457600080fd5b80637a7511821461024357806383e166381461027e578063851548491461029157600080fd5b80630c3d27561461018657806317696f64146101a857806336739d3d146101e8578063498eff641461020857806362bf7c9e1461021b578063715018a61461022e575b600080fd5b34801561019257600080fd5b506101a66101a1366004611fdb565b610486565b005b3480156101b457600080fd5b506101c86101c3366004612007565b610549565b604080519384526020840192909252908201526060015b60405180910390f35b3480156101f457600080fd5b506101a661020336600461203c565b610571565b6101a66102163660046120c8565b610607565b6101a66102293660046121be565b6106af565b34801561023a57600080fd5b506101a661087b565b34801561024f57600080fd5b5061027061025e366004612250565b60036020526000908152604090205481565b6040519081526020016101df565b6101a661028c3660046121be565b61088f565b6101a661029f366004612274565b610b5e565b6101a66102b2366004612274565b610bfc565b3480156102c357600080fd5b506102d76102d2366004612312565b610d9b565b604080519283526020830191909152016101df565b3480156102f857600080fd5b506000546040516001600160a01b0390911681526020016101df565b34801561032057600080fd5b506101a661032f36600461203c565b610ea4565b6101a6610342366004612274565b610f32565b34801561035357600080fd5b5061027060045481565b6101a661036b3660046120c8565b610f89565b6101a661037e366004612274565b611140565b34801561038f57600080fd5b5061027060025481565b6101a66103a7366004612274565b611216565b3480156103b857600080fd5b5061027061271081565b3480156103ce57600080fd5b506102d76103dd3660046123b1565b6112e8565b3480156103ee57600080fd5b506101a66103fd366004612474565b6113c8565b34801561040e57600080fd5b5061027060001981565b34801561042457600080fd5b506104386104333660046124b5565b61142f565b604080518251815260209283015192810192909252016101df565b34801561045f57600080fd5b506101a661046e366004612250565b611659565b6101a66104813660046120c8565b6116d2565b61048e6117ae565b61271081108061049f575060001981145b6104f05760405162461bcd60e51b815260206004820181905260248201527f4f4654577261707065723a206f66744270735b5f6f66745d203e3d203130302560448201526064015b60405180910390fd5b6001600160a01b03821660008181526003602052604090819020839055517ff51611cfa84d1f2df6840c4651ba5b8f3f45d66811e43567dfe472a6b5a7ffb89061053d9084815260200190565b60405180910390a25050565b600080600061055784611808565b610562868686611866565b92509250925093509350939050565b6105796117ae565b6127108111156105cb5760405162461bcd60e51b815260206004820152601f60248201527f4f4654577261707065723a2063616c6c6572427073436170203e20313030250060448201526064016104e7565b60048190556040518181527fb474bfee9176a4392a746f7432e2daa216a9db2234f881770e4096bddeefaeb2906020015b60405180910390a150565b61060f61198f565b6106198135611808565b60006106278c8989856119e8565b90508b6001600160a01b0316635190563634338e8e8e878d8d8d8d6040518b63ffffffff1660e01b815260040161066699989796959493929190612552565b6000604051808303818588803b15801561067f57600080fd5b505af1158015610693573d6000803e3d6000fd5b5050505050506106a260018055565b5050505050505050505050565b6106b761198f565b6106c18135611808565b60006106d7868660400135876060013585611ae6565b9050856001600160a01b031663c7c7f5b3346040518060e0016040528089600001602081019061070791906125b9565b63ffffffff168152602001896020013581526020018581526020018960600135815260200189806080019061073c91906125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161078360a08b018b6125df565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016107ca60c08b018b6125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e085901b1681526108259190899089906004016126f5565b60c06040518083038185885af1158015610843573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108689190612791565b50505061087460018055565b5050505050565b6108836117ae565b61088d6000611b4a565b565b61089761198f565b6108a18135611808565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109059190612833565b9050600061091d828760400135886060013586611ae6565b90506109336001600160a01b0383168883611b9a565b866001600160a01b031663c7c7f5b3346040518060e001604052808a600001602081019061096191906125b9565b63ffffffff1681526020018a6020013581526020018581526020018a6060013581526020018a806080019061099691906125df565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016109dd60a08c018c6125df565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001610a2460c08c018c6125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e085901b168152610a7f91908a908a906004016126f5565b60c06040518083038185885af1158015610a9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ac29190612791565b5050604051636eb1769f60e11b81523060048201526001600160a01b0388811660248301526000919084169063dd62ed3e90604401602060405180830381865afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190612850565b1115610b5357610b536001600160a01b038316886000611b9a565b505061087460018055565b610b6661198f565b610b708135611808565b6000610b7e888686856119e8565b9050876001600160a01b0316632cdf0b9534338a8a868a8a6040518863ffffffff1660e01b8152600401610bb7969594939291906128f1565b6000604051808303818588803b158015610bd057600080fd5b505af1158015610be4573d6000803e3d6000fd5b505050505050610bf360018055565b50505050505050565b610c0461198f565b610c0e8135611808565b6000876001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c729190612833565b90506000610c8282878786611ae6565b9050610c986001600160a01b0383168a83611b9a565b604051632cdf0b9560e01b81526001600160a01b038a1690632cdf0b95903490610cd09030908d908d9088908d908d906004016128f1565b6000604051808303818588803b158015610ce957600080fd5b505af1158015610cfd573d6000803e3d6000fd5b5050604051636eb1769f60e11b81523060048201526001600160a01b038d81166024830152600094508616925063dd62ed3e9150604401602060405180830381865afa158015610d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d759190612850565b1115610d9057610d906001600160a01b0383168a6000611b9a565b5050610bf360018055565b600080610da88335611808565b6000610e178b6001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612833565b898635611866565b5050604051630d94982d60e21b81529091506001600160a01b038c169063365260b490610e52908d908d9086908d908d908d9060040161293a565b6040805180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e92919061296c565b92509250509850989650505050505050565b610eac6117ae565b6127108110610efd5760405162461bcd60e51b815260206004820152601e60248201527f4f4654577261707065723a2064656661756c74427073203e3d2031303025000060448201526064016104e7565b60028190556040518181527f935f0caa3a542ed0e18e9116cee6e58fc0e502596c9a47909aa4af65fd69b991906020016105fc565b610f3a61198f565b610f448135611808565b6000610f52888686856119e8565b9050876001600160a01b031663695ef6bf34338a8a86896040518763ffffffff1660e01b8152600401610bb7959493929190612990565b610f9161198f565b610f9b8135611808565b60008b6001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190612833565b9050600061100f828a8a86611ae6565b90506110256001600160a01b0383168e83611b9a565b8c6001600160a01b0316635190563634308f8f8f878e8e8e8e6040518b63ffffffff1660e01b815260040161106299989796959493929190612552565b6000604051808303818588803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050506000816001600160a01b031663dd62ed3e308f6040518363ffffffff1660e01b81526004016110da9291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190612850565b1115611136576111366001600160a01b0382168d6000611b9a565b506106a260018055565b61114861198f565b6111528135611808565b833410156111725760405162461bcd60e51b81526004016104e7906129c7565b866001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111ad57600080fd5b505af11580156111c1573d6000803e3d6000fd5b505050505060006111d488868685611ce7565b90506001600160a01b038816632cdf0b956111ef8734612a1e565b308a8a868a8a6040518863ffffffff1660e01b8152600401610bb7969594939291906128f1565b61121e61198f565b6112288135611808565b6000876001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c9190612833565b9050600061129c82878786611ae6565b90506112b26001600160a01b0383168a83611b9a565b60405163695ef6bf60e01b81526001600160a01b038a169063695ef6bf903490610cd09030908d908d9088908c90600401612990565b6000806112f58335611808565b60006113388c6001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610deb573d6000803e3d6000fd5b5050604051632a205e3d60e01b81529091506001600160a01b038d1690632a205e3d90611375908e908e908e9087908e908e908e90600401612a37565b6040805180830381865afa158015611391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b5919061296c565b9250925050995099975050505050505050565b6113d06117ae565b6113e46001600160a01b0384168383611d50565b604080516001600160a01b038481168252602082018490528516917ff6514f9f283faac4cf3f3a6a702c116227ad0f2c727fb336e4c10b418bc6d613910160405180910390a2505050565b604080518082019091526000808252602082015261144d8235611808565b60006114c0866001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b49190612833565b60408701358535611866565b50509050856001600160a01b0316633b6f743b6040518060e001604052808860000160208101906114f191906125b9565b63ffffffff168152602001886020013581526020018481526020018860600135815260200188806080019061152691906125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161156d60a08a018a6125df565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016115b460c08a018a6125df565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e084901b16815261160d91908890600401612a84565b6040805180830381865afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190612aa8565b9150505b949350505050565b6116616117ae565b6001600160a01b0381166116c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104e7565b6116cf81611b4a565b50565b6116da61198f565b6116e48135611808565b863410156117045760405162461bcd60e51b81526004016104e7906129c7565b8a6001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561173f57600080fd5b505af1158015611753573d6000803e3d6000fd5b505050505060006117668c898985611ce7565b90506001600160a01b038c1663519056366117818a34612a1e565b308e8e8e878d8d8d8d6040518b63ffffffff1660e01b815260040161066699989796959493929190612552565b6000546001600160a01b0316331461088d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104e7565b6004548111156116cf5760405162461bcd60e51b8152602060048201526024808201527f4f4654577261707065723a2063616c6c6572427073203e2063616c6c657242706044820152630734361760e41b60648201526084016104e7565b6001600160a01b0383166000908152600360205260408120548190819081906001810161189657600091506118aa565b80156118a4578091506118aa565b60025491505b6127106118b78784612ac4565b106119045760405162461bcd60e51b815260206004820152601b60248201527f4f4654577261707065723a2046656520627073203e3d2031303025000000000060448201526064016104e7565b6000821161191357600061192a565b6127106119208389612ad7565b61192a9190612aee565b93506000861161193b576000611952565b6127106119488789612ad7565b6119529190612aee565b925060008411806119635750600083115b61196d5786611982565b826119788589612a1e565b6119829190612a1e565b9450505093509350939050565b6002600154036119e15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104e7565b6002600155565b60008080806119f988888735611866565b925092509250858310158015611a0f5750600083115b611a2b5760405162461bcd60e51b81526004016104e790612b10565b8115611a4657611a466001600160a01b038916333085611d80565b8015611a7257611a7233611a606040880160208901612250565b6001600160a01b038b16919084611d80565b611a826060860160408701612b53565b604080516001600160a01b038b168152602081018590529081018390526001600160f01b031991909116907f97bcdc1dd7ab82ef93280983f23d391afea463d0333fddd1a4617693b9ccfeea9060600160405180910390a250909695505050505050565b6000808080611af788888735611866565b925092509250858310158015611b0d5750600083115b611b295760405162461bcd60e51b81526004016104e790612b10565b611a463330611b388587612ac4565b6001600160a01b038c16929190611d80565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580611c145750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611bee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c129190612850565b155b611c7f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016104e7565b6040516001600160a01b038316602482015260448101829052611ce290849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dbe565b505050565b6000808080611cf888888735611866565b925092509250858310158015611d0e5750600083115b611d2a5760405162461bcd60e51b81526004016104e790612b10565b8015611a7257611a72611d436040870160208801612250565b6001600160a01b038a1690835b6040516001600160a01b038316602482015260448101829052611ce290849063a9059cbb60e01b90606401611cab565b6040516001600160a01b0380851660248301528316604482015260648101829052611db89085906323b872dd60e01b90608401611cab565b50505050565b6000611e13826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e939092919063ffffffff16565b9050805160001480611e34575080806020019051810190611e349190612b7d565b611ce25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104e7565b6060611651848460008585600080866001600160a01b03168587604051611eba9190612b9a565b60006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b5091509150611f0d87838387611f18565b979650505050505050565b60608315611f87578251600003611f80576001600160a01b0385163b611f805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104e7565b5081611651565b6116518383815115611f9c5781518083602001fd5b8060405162461bcd60e51b81526004016104e79190612bb6565b6001600160a01b03811681146116cf57600080fd5b8035611fd681611fb6565b919050565b60008060408385031215611fee57600080fd5b8235611ff981611fb6565b946020939093013593505050565b60008060006060848603121561201c57600080fd5b833561202781611fb6565b95602085013595506040909401359392505050565b60006020828403121561204e57600080fd5b5035919050565b803561ffff81168114611fd657600080fd5b60008083601f84011261207957600080fd5b50813567ffffffffffffffff81111561209157600080fd5b6020830191508360208285010111156120a957600080fd5b9250929050565b6000606082840312156120c257600080fd5b50919050565b60008060008060008060008060008060006101608c8e0312156120ea57600080fd5b6120f48c35611fb6565b8b359a5061210460208d01612055565b995067ffffffffffffffff8060408e0135111561212057600080fd5b6121308e60408f01358f01612067565b909a50985060608d0135975060808d0135965061215060a08e0135611fb6565b60a08d0135955061216360c08e01611fcb565b94508060e08e0135111561217657600080fd5b506121878d60e08e01358e01612067565b909350915061219a8d6101008e016120b0565b90509295989b509295989b9093969950565b600060e082840312156120c257600080fd5b60008060008060008587036101008112156121d857600080fd5b86356121e381611fb6565b9550602087013567ffffffffffffffff8111156121ff57600080fd5b61220b89828a016121ac565b9550506040603f198201121561222057600080fd5b50604086019250608086013561223581611fb6565b91506122448760a088016120b0565b90509295509295909350565b60006020828403121561226257600080fd5b813561226d81611fb6565b9392505050565b6000806000806000806000610120888a03121561229057600080fd5b873561229b81611fb6565b96506122a960208901612055565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156122da57600080fd5b6122e68a828b016120b0565b9250506122f68960c08a016120b0565b905092959891949750929550565b80151581146116cf57600080fd5b600080600080600080600080610120898b03121561232f57600080fd5b883561233a81611fb6565b975061234860208a01612055565b96506040890135955060608901359450608089013561236681612304565b935060a089013567ffffffffffffffff81111561238257600080fd5b61238e8b828c01612067565b90945092506123a290508a60c08b016120b0565b90509295985092959890939650565b60008060008060008060008060006101208a8c0312156123d057600080fd5b89356123db81611fb6565b98506123e960208b01612055565b975060408a013567ffffffffffffffff8082111561240657600080fd5b6124128d838e01612067565b909950975060608c0135965060808c0135915061242e82612304565b90945060a08b0135908082111561244457600080fd5b506124518c828d01612067565b909450925061246590508b60c08c016120b0565b90509295985092959850929598565b60008060006060848603121561248957600080fd5b833561249481611fb6565b925060208401356124a481611fb6565b929592945050506040919091013590565b60008060008060c085870312156124cb57600080fd5b84356124d681611fb6565b9350602085013567ffffffffffffffff8111156124f257600080fd5b6124fe878288016121ac565b935050604085013561250f81612304565b915061251e86606087016120b0565b905092959194509250565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600060018060a01b03808c16835261ffff8b16602084015260e0604084015261257f60e084018a8c612529565b886060850152818816608085015281871660a085015283810360c08501526125a8818688612529565b9d9c50505050505050505050505050565b6000602082840312156125cb57600080fd5b813563ffffffff8116811461226d57600080fd5b6000808335601e198436030181126125f657600080fd5b83018035915067ffffffffffffffff82111561261157600080fd5b6020019150368190038213156120a957600080fd5b60005b83811015612641578181015183820152602001612629565b50506000910152565b60008151808452612662816020860160208601612626565b601f01601f19169290920160200192915050565b63ffffffff81511682526020810151602083015260408101516040830152606081015160608301526000608082015160e060808501526126b960e085018261264a565b905060a083015184820360a08601526126d2828261264a565b91505060c083015184820360c08601526126ec828261264a565b95945050505050565b6080815260006127086080830186612676565b8435602084810191909152909401356040830152506001600160a01b0391909116606090910152919050565b60006040828403121561274657600080fd5b6040516040810181811067ffffffffffffffff8211171561277757634e487b7160e01b600052604160045260246000fd5b604052825181526020928301519281019290925250919050565b60008082840360c08112156127a557600080fd5b60808112156127b357600080fd5b506040516060810167ffffffffffffffff82821081831117156127e657634e487b7160e01b600052604160045260246000fd5b816040528551835260208601519150808216821461280357600080fd5b5060208201526128168560408601612734565b6040820152915061282a8460808501612734565b90509250929050565b60006020828403121561284557600080fd5b815161226d81611fb6565b60006020828403121561286257600080fd5b5051919050565b6000813561287681611fb6565b6001600160a01b03908116845260208301359061289282611fb6565b166020840152604082013536839003601e190181126128b057600080fd5b820160208101903567ffffffffffffffff8111156128cd57600080fd5b8036038213156128dc57600080fd5b606060408601526126ec606086018284612529565b60018060a01b038716815261ffff8616602082015284604082015283606082015282608082015260c060a0820152600061292e60c0830184612869565b98975050505050505050565b61ffff87168152856020820152846040820152831515606082015260a06080820152600061292e60a083018486612529565b6000806040838503121561297f57600080fd5b505080516020909101519092909150565b60018060a01b038616815261ffff8516602082015283604082015282606082015260a060808201526000611f0d60a0830184612869565b60208082526021908201527f4f4654577261707065723a206e6f7420656e6f7567682076616c75652073656e6040820152601d60fa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612a3157612a31612a08565b92915050565b61ffff8816815260a060208201526000612a5560a08301888a612529565b86604084015285151560608401528281036080840152612a76818587612529565b9a9950505050505050505050565b604081526000612a976040830185612676565b905082151560208301529392505050565b600060408284031215612aba57600080fd5b61226d8383612734565b80820180821115612a3157612a31612a08565b8082028115828204841417612a3157612a31612a08565b600082612b0b57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526023908201527f4f4654577261707065723a206e6f7420656e6f75676820616d6f756e74546f5360408201526207761760ec1b606082015260800190565b600060208284031215612b6557600080fd5b81356001600160f01b03198116811461226d57600080fd5b600060208284031215612b8f57600080fd5b815161226d81612304565b60008251612bac818460208701612626565b9190910192915050565b60208152600061226d602083018461264a56fea2646970667358221220e1af997aecbb6b0a65238fe239c1de91209ddf1cf301ee1b274fd934ba3e905764736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _defaultBps (uint256): 0
Arg [1] : _callerBpsCap (uint256): 0
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
1019:150:25:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1764:241:22;;;;;;;;;;-1:-1:-1;1764:241:22;;;;;:::i;:::-;;:::i;:::-;;13474:360;;;;;;;;;;-1:-1:-1;13474:360:22;;;;;:::i;:::-;;:::i;:::-;;;;1199:25:26;;;1255:2;1240:18;;1233:34;;;;1283:18;;;1276:34;1187:2;1172:18;13474:360:22;;;;;;;;2011:243;;;;;;;;;;-1:-1:-1;2011:243:22;;;;;:::i;:::-;;:::i;2459:725::-;;;;;;:::i;:::-;;:::i;9150:793::-;;;;;;:::i;:::-;;:::i;1824:101:14:-;;;;;;;;;;;;;:::i;1227:41:22:-;;;;;;;;;;-1:-1:-1;1227:41:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5064:25:26;;;5052:2;5037:18;1227:41:22;4918:177:26;9949:1041:22;;;;;;:::i;:::-;;:::i;5777:626::-;;;;;;:::i;:::-;;:::i;7359:976::-;;;;;;:::i;:::-;;:::i;15278:547::-;;;;;;;;;;-1:-1:-1;15278:547:22;;;;;:::i;:::-;;:::i;:::-;;;;7321:25:26;;;7377:2;7362:18;;7355:34;;;;7294:18;15278:547:22;7147:248:26;1201:85:14;;;;;;;;;;-1:-1:-1;1247:7:14;1273:6;1201:85;;-1:-1:-1;;;;;1273:6:14;;;7546:51:26;;7534:2;7519:18;1201:85:14;7400:203:26;1531:227:22;;;;;;;;;;-1:-1:-1;1531:227:22;;;;;:::i;:::-;;:::i;5247:524::-;;;;;;:::i;:::-;;:::i;1274:27::-;;;;;;;;;;;;;;;;3190:1143;;;;;;:::i;:::-;;:::i;8341:803::-;;;;;;:::i;:::-;;:::i;1196:25::-;;;;;;;;;;;;;;;;6409:944;;;;;;:::i;:::-;;:::i;1031:47::-;;;;;;;;;;;;1073:5;1031:47;;14724:548;;;;;;;;;;-1:-1:-1;14724:548:22;;;;;:::i;:::-;;:::i;2260:193::-;;;;;;;;;;-1:-1:-1;2260:193:22;;;;;:::i;:::-;;:::i;1084:47::-;;;;;;;;;;;;-1:-1:-1;;1084:47:22;;15831:795;;;;;;;;;;-1:-1:-1;15831:795:22;;;;;:::i;:::-;;:::i;:::-;;;;10310:13:26;;10292:32;;10380:4;10368:17;;;10362:24;10340:20;;;10333:54;;;;10265:18;15831:795:22;10088:305:26;2074:198:14;;;;;;;;;;-1:-1:-1;2074:198:14;;;;;:::i;:::-;;:::i;4339:902:22:-;;;;;;:::i;:::-;;:::i;1764:241::-;1094:13:14;:11;:13::i;:::-;1073:5:22::1;1850:4;:22;:42;;;;-1:-1:-1::0;;1876:4:22::1;:16;1850:42;1842:87;;;::::0;-1:-1:-1;;;1842:87:22;;10600:2:26;1842:87:22::1;::::0;::::1;10582:21:26::0;;;10619:18;;;10612:30;10678:34;10658:18;;;10651:62;10730:18;;1842:87:22::1;;;;;;;;;-1:-1:-1::0;;;;;1939:14:22;::::1;;::::0;;;:6:::1;:14;::::0;;;;;;:21;;;1975:23;::::1;::::0;::::1;::::0;1956:4;5064:25:26;;5052:2;5037:18;;4918:177;1975:23:22::1;;;;;;;;1764:241:::0;;:::o;13474:360::-;13671:14;13687:18;13707:17;13736:28;13753:10;13736:16;:28::i;:::-;13781:46;13799:6;13807:7;13816:10;13781:17;:46::i;:::-;13774:53;;;;;;13474:360;;;;;;;:::o;2011:243::-;1094:13:14;:11;:13::i;:::-;1073:5:22::1;2096:13;:32;;2088:76;;;::::0;-1:-1:-1;;;2088:76:22;;10961:2:26;2088:76:22::1;::::0;::::1;10943:21:26::0;11000:2;10980:18;;;10973:30;11039:33;11019:18;;;11012:61;11090:18;;2088:76:22::1;10759:355:26::0;2088:76:22::1;2174:12;:28:::0;;;2217:30:::1;::::0;5064:25:26;;;2217:30:22::1;::::0;5052:2:26;5037:18;2217:30:22::1;;;;;;;;2011:243:::0;:::o;2459:725::-;2261:21:15;:19;:21::i;:::-;2808:35:22::1;2825:17:::0;::::1;2808:16;:35::i;:::-;2853:20;2876:55;2896:4;2902:7;2911:10;2923:7;2876:19;:55::i;:::-;2853:78;;2946:4;-1:-1:-1::0;;;;;2941:19:22::1;;2969:9;2994:10;3018:11;3043:10;;3067:12;3093:14;3121:18;3153:14;;2941:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;2798:386;2303:20:15::0;1716:1;2809:22;;2629:209;2303:20;2459:725:22;;;;;;;;;;;:::o;9150:793::-;2261:21:15;:19;:21::i;:::-;9387:35:22::1;9404:17:::0;::::1;9387:16;:35::i;:::-;9432:20;9455:84;9480:4;9486:10;:19;;;9507:10;:22;;;9531:7;9455:24;:84::i;:::-;9432:107;;9558:4;-1:-1:-1::0;;;;;9549:19:22::1;;9577:9;9602:278;;;;;;;;9633:10;:17;;;;;;;;;;:::i;:::-;9602:278;;;;;;9668:10;:13;;;9602:278;;;;9699:12;9602:278;;;;9729:10;:22;;;9602:278;;;;9769:10;:23;;;;;;;;:::i;:::-;9602:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;9602:278:22;;;-1:-1:-1;9602:278:22::1;;9810:21;;::::0;::::1;:10:::0;:21:::1;:::i;:::-;9602:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;9602:278:22;;;-1:-1:-1;9602:278:22::1;;9849:17;;::::0;::::1;:10:::0;:17:::1;:::i;:::-;9602:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;9602:278:22;;-1:-1:-1;9549:387:22::1;::::0;-1:-1:-1;;;;;;9549:387:22::1;::::0;;;;;;::::1;::::0;;9894:4;;9912:14;;9549:387:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;9377:566;2303:20:15::0;1716:1;2809:22;;2629:209;2303:20;9150:793:22;;;;;:::o;1824:101:14:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;9949:1041:22:-;2261:21:15;:19;:21::i;:::-;10200:35:22::1;10217:17:::0;::::1;10200:16;:35::i;:::-;10245:13;10266:11;-1:-1:-1::0;;;;;10261:23:22::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10245:41;;10296:20;10319:85;10344:5;10351:10;:19;;;10372:10;:22;;;10396:7;10319:24;:85::i;:::-;10296:108:::0;-1:-1:-1;10414:52:22::1;-1:-1:-1::0;;;;;10414:25:22;::::1;10440:11:::0;10296:108;10414:25:::1;:52::i;:::-;10485:11;-1:-1:-1::0;;;;;10476:26:22::1;;10511:9;10536:278;;;;;;;;10567:10;:17;;;;;;;;;;:::i;:::-;10536:278;;;;;;10602:10;:13;;;10536:278;;;;10633:12;10536:278;;;;10663:10;:22;;;10536:278;;;;10703:10;:23;;;;;;;;:::i;:::-;10536:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;10536:278:22;;;-1:-1:-1;10536:278:22::1;;10744:21;;::::0;::::1;:10:::0;:21:::1;:::i;:::-;10536:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;10536:278:22;;;-1:-1:-1;10536:278:22::1;;10783:17;;::::0;::::1;:10:::0;:17:::1;:::i;:::-;10536:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;10536:278:22;;-1:-1:-1;10476:394:22::1;::::0;-1:-1:-1;;;;;;10476:394:22::1;::::0;;;;;;::::1;::::0;;10828:4;;10846:14;;10476:394:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;10885:51:22::1;::::0;-1:-1:-1;;;10885:51:22;;10917:4:::1;10885:51;::::0;::::1;17034:34:26::0;-1:-1:-1;;;;;17104:15:26;;;17084:18;;;17077:43;10939:1:22::1;::::0;10885:23;;::::1;::::0;::::1;::::0;16969:18:26;;10885:51:22::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;10881:102;;;10942:41;-1:-1:-1::0;;;;;10942:25:22;::::1;10968:11:::0;10981:1:::1;10942:25;:41::i;:::-;10190:800;;2303:20:15::0;1716:1;2809:22;;2629:209;5777:626:22;2261:21:15;:19;:21::i;:::-;6059:35:22::1;6076:17:::0;::::1;6059:16;:35::i;:::-;6104:20;6127:55;6147:4;6153:7;6162:10;6174:7;6127:19;:55::i;:::-;6104:78;;6204:4;-1:-1:-1::0;;;;;6192:26:22::1;;6227:9;6252:10;6276:11;6301:10;6325:12;6351:10;6375:11;6192:204;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;6049:354;2303:20:15::0;1716:1;2809:22;;2629:209;2303:20;5777:626:22;;;;;;;:::o;7359:976::-;2261:21:15;:19;:21::i;:::-;7651:35:22::1;7668:17:::0;::::1;7651:16;:35::i;:::-;7696:13;7719:9;-1:-1:-1::0;;;;;7712:23:22::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7696:41;;7747:20;7770:61;7795:5;7802:7;7811:10;7823:7;7770:24;:61::i;:::-;7747:84:::0;-1:-1:-1;7883:48:22::1;-1:-1:-1::0;;;;;7883:23:22;::::1;7907:9:::0;7747:84;7883:23:::1;:48::i;:::-;7941:212;::::0;-1:-1:-1;;;7941:212:22;;-1:-1:-1;;;;;7941:31:22;::::1;::::0;::::1;::::0;7981:9:::1;::::0;7941:212:::1;::::0;8014:4:::1;::::0;8033:11;;8058:10;;8082:12;;8108:10;;8132:11;;7941:212:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;8238:47:22::1;::::0;-1:-1:-1;;;8238:47:22;;8268:4:::1;8238:47;::::0;::::1;17034:34:26::0;-1:-1:-1;;;;;17104:15:26;;;17084:18;;;17077:43;8288:1:22::1;::::0;-1:-1:-1;8238:21:22;::::1;::::0;-1:-1:-1;8238:21:22::1;::::0;-1:-1:-1;16969:18:26;;8238:47:22::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;8234:94;;;8291:37;-1:-1:-1::0;;;;;8291:23:22;::::1;8315:9:::0;8326:1:::1;8291:23;:37::i;:::-;7641:694;;2303:20:15::0;1716:1;2809:22;;2629:209;15278:547:22;15540:14;;15579:35;15596:17;;15579:16;:35::i;:::-;15625:14;15647:67;15672:4;-1:-1:-1;;;;;15665:18:22;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15687:7;15696:17;;15647;:67::i;:::-;-1:-1:-1;;15732:86:22;;-1:-1:-1;;;15732:86:22;;15624:90;;-1:-1:-1;;;;;;15732:28:22;;;;;:86;;15761:11;;15774:10;;15624:90;;15794:7;;15803:14;;;;15732:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15725:93;;;;;15278:547;;;;;;;;;;;:::o;1531:227::-;1094:13:14;:11;:13::i;:::-;1073:5:22::1;1612:11;:29;1604:72;;;::::0;-1:-1:-1;;;1604:72:22;;19951:2:26;1604:72:22::1;::::0;::::1;19933:21:26::0;19990:2;19970:18;;;19963:30;20029:32;20009:18;;;20002:60;20079:18;;1604:72:22::1;19749:354:26::0;1604:72:22::1;1686:10;:24:::0;;;1725:26:::1;::::0;5064:25:26;;;1725:26:22::1;::::0;5052:2:26;5037:18;1725:26:22::1;4918:177:26::0;5247:524:22;2261:21:15;:19;:21::i;:::-;5526:35:22::1;5543:17:::0;::::1;5526:16;:35::i;:::-;5571:20;5594:55;5614:4;5620:7;5629:10;5641:7;5594:19;:55::i;:::-;5571:78;;5666:4;-1:-1:-1::0;;;;;5659:21:22::1;;5689:9;5701:10;5713:11;5726:10;5738:12;5752:11;5659:105;;;;;;;;;;;;;;;;;;;:::i;3190:1143::-:0;2261:21:15;:19;:21::i;:::-;3549:35:22::1;3566:17:::0;::::1;3549:16;:35::i;:::-;3594:13;3617:9;-1:-1:-1::0;;;;;3610:23:22::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3594:41;;3659:20;3682:61;3707:5;3714:7;3723:10;3735:7;3682:24;:61::i;:::-;3659:84:::0;-1:-1:-1;3803:48:22::1;-1:-1:-1::0;;;;;3803:23:22;::::1;3827:9:::0;3659:84;3803:23:::1;:48::i;:::-;3870:9;-1:-1:-1::0;;;;;3865:24:22::1;;3898:9;3935:4;3958:11;3987:10;;4015:12;4045:14;4077:18;4113:14;;3865:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3645:507;4286:1;4241:5;-1:-1:-1::0;;;;;4236:21:22::1;;4266:4;4273:9;4236:47;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17052:15:26;;;17034:34;;17104:15;;17099:2;17084:18;;17077:43;16984:2;16969:18;;16822:304;4236:47:22::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;4232:94;;;4289:37;-1:-1:-1::0;;;;;4289:23:22;::::1;4313:9:::0;4324:1:::1;4289:23;:37::i;:::-;3539:794;2303:20:15::0;1716:1;2809:22;;2629:209;8341:803:22;2261:21:15;:19;:21::i;:::-;8632:35:22::1;8649:17:::0;::::1;8632:16;:35::i;:::-;8698:7;8685:9;:20;;8677:66;;;;-1:-1:-1::0;;;8677:66:22::1;;;;;;;:::i;:::-;8765:10;-1:-1:-1::0;;;;;8754:30:22::1;;8793:7;8754:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8814:20;8837:67;8863:10;8875:7;8884:10;8896:7;8837:25;:67::i;:::-;8814:90:::0;-1:-1:-1;;;;;;8914:32:22;::::1;;8955:19;8967:7:::0;8955:9:::1;:19;:::i;:::-;8998:4;9017:11;9042:10;9066:12;9092:10;9116:11;8914:223;;;;;;;;;;;;;;;;;;;;:::i;6409:944::-:0;2261:21:15;:19;:21::i;:::-;6698:35:22::1;6715:17:::0;::::1;6698:16;:35::i;:::-;6743:13;6766:9;-1:-1:-1::0;;;;;6759:23:22::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6743:41;;6794:20;6817:61;6842:5;6849:7;6858:10;6870:7;6817:24;:61::i;:::-;6794:84:::0;-1:-1:-1;6930:48:22::1;-1:-1:-1::0;;;;;6930:23:22;::::1;6954:9:::0;6794:84;6930:23:::1;:48::i;:::-;6988:183;::::0;-1:-1:-1;;;6988:183:22;;-1:-1:-1;;;;;6988:26:22;::::1;::::0;::::1;::::0;7023:9:::1;::::0;6988:183:::1;::::0;7056:4:::1;::::0;7075:11;;7100:10;;7124:12;;7150:11;;6988:183:::1;;;:::i;14724:548::-:0;14991:14;;15030:35;15047:17;;15030:16;:35::i;:::-;15076:14;15098:65;15121:4;-1:-1:-1;;;;;15116:16:22;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15098:65;-1:-1:-1;;15181:84:22;;-1:-1:-1;;;15181:84:22;;15075:88;;-1:-1:-1;;;;;;15181:26:22;;;;;:84;;15208:11;;15221:10;;;;15075:88;;15241:7;;15250:14;;;;15181:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15174:91;;;;;14724:548;;;;;;;;;;;;:::o;2260:193::-;1094:13:14;:11;:13::i;:::-;2355:37:22::1;-1:-1:-1::0;;;;;2355:23:22;::::1;2379:3:::0;2384:7;2355:23:::1;:37::i;:::-;2407:39;::::0;;-1:-1:-1;;;;;22253:32:26;;;22235:51;;22317:2;22302:18;;22295:34;;;2407:39:22;::::1;::::0;::::1;::::0;22208:18:26;2407:39:22::1;;;;;;;2260:193:::0;;;:::o;15831:795::-;-1:-1:-1;;;;;;;;;;;;;;;;;16050:35:22;16067:17;;16050:16;:35::i;:::-;16096:14;16118:81;16145:4;-1:-1:-1;;;;;16136:20:22;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16160:19;;;;16181:17;;16118;:81::i;:::-;16095:104;;;;16237:4;-1:-1:-1;;;;;16228:24:22;;16270:304;;;;;;;;16305:10;:17;;;;;;;;;;:::i;:::-;16270:304;;;;;;16344:10;:13;;;16270:304;;;;16379:6;16270:304;;;;16407:10;:22;;;16270:304;;;;16451:10;:23;;;;;;;;:::i;:::-;16270:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16270:304:22;;;-1:-1:-1;16270:304:22;;16496:21;;;;:10;:21;:::i;:::-;16270:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16270:304:22;;;-1:-1:-1;16270:304:22;;16539:17;;;;:10;:17;:::i;:::-;16270:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16270:304:22;;-1:-1:-1;16228:391:22;;-1:-1:-1;;;;;;16228:391:22;;;;;;;;;;16592:13;;16228:391;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16209:410;;;15831:795;;;;;;;:::o;2074:198:14:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:14;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:14;;23153:2:26;2154:73:14::1;::::0;::::1;23135:21:26::0;23192:2;23172:18;;;23165:30;23231:34;23211:18;;;23204:62;-1:-1:-1;;;23282:18:26;;;23275:36;23328:19;;2154:73:14::1;22951:402:26::0;2154:73:14::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;4339:902:22:-;2261:21:15;:19;:21::i;:::-;4697:35:22::1;4714:17:::0;::::1;4697:16;:35::i;:::-;4763:7;4750:9;:20;;4742:66;;;;-1:-1:-1::0;;;4742:66:22::1;;;;;;;:::i;:::-;4830:10;-1:-1:-1::0;;;;;4819:30:22::1;;4858:7;4819:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;4879:20;4902:67;4928:10;4940:7;4949:10;4961:7;4902:25;:67::i;:::-;4879:90:::0;-1:-1:-1;;;;;;4979:25:22;::::1;;5013:19;5025:7:::0;5013:9:::1;:19;:::i;:::-;5056:4;5075:11;5100:10;;5124:12;5150:14;5178:18;5210:14;;4979:255;;;;;;;;;;;;;;;;;;;;;;;:::i;1359:130:14:-:0;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;734:10:20;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;23560:2:26;1414:68:14;;;23542:21:26;;;23579:18;;;23572:30;23638:34;23618:18;;;23611:62;23690:18;;1414:68:14;23358:356:26;16632:152:22;16724:12;;16710:10;:26;;16702:75;;;;-1:-1:-1;;;16702:75:22;;23921:2:26;16702:75:22;;;23903:21:26;23960:2;23940:18;;;23933:30;23999:34;23979:18;;;23972:62;-1:-1:-1;;;24050:18:26;;;24043:34;24094:19;;16702:75:22;23719:400:26;13840:878:22;-1:-1:-1;;;;;14144:14:22;;14031;14144;;;:6;:14;;;;;;14031;;;;;;14172:20;;;14168:189;;14221:1;14208:14;;14168:189;;;14243:12;;14239:118;;14284:8;14271:21;;14239:118;;;14336:10;;14323:23;;14239:118;1073:5;14375:23;14388:10;14375;:23;:::i;:::-;:41;14367:81;;;;-1:-1:-1;;;14367:81:22;;24456:2:26;14367:81:22;;;24438:21:26;24495:2;24475:18;;;24468:30;24534:29;24514:18;;;24507:57;24581:18;;14367:81:22;24254:351:26;14367:81:22;14485:1;14472:10;:14;:61;;14532:1;14472:61;;;1073:5;14490:20;14500:10;14490:7;:20;:::i;:::-;14489:40;;;;:::i;:::-;14459:74;;14568:1;14555:10;:14;:61;;14615:1;14555:61;;;1073:5;14573:20;14583:10;14573:7;:20;:::i;:::-;14572:40;;;;:::i;:::-;14543:73;;14648:1;14635:10;:14;:31;;;;14665:1;14653:9;:13;14635:31;:76;;14704:7;14635:76;;;14692:9;14669:20;14679:10;14669:7;:20;:::i;:::-;:32;;;;:::i;:::-;14626:85;;14086:632;;13840:878;;;;;;;:::o;2336:287:15:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:15;;25207:2:26;2460:63:15;;;25189:21:26;25246:2;25226:18;;;25219:30;25285:33;25265:18;;;25258:61;25336:18;;2460:63:15;25005:355:26;2460:63:15;1759:1;2598:7;:18;2336:287::o;11824:788:22:-;11987:7;;;;12070:99;12101:6;12121:7;12142:17;;12070;:99::i;:::-;12006:163;;;;;;12203:10;12187:12;:26;;:46;;;;;12232:1;12217:12;:16;12187:46;12179:94;;;;-1:-1:-1;;;12179:94:22;;;;;;;:::i;:::-;12288:14;;12284:88;;12304:68;-1:-1:-1;;;;;12304:29:22;;12334:10;12354:4;12361:10;12304:29;:68::i;:::-;12401:13;;12397:87;;12416:68;12446:10;12458:14;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12416:29:22;;;:68;12474:9;12416:29;:68::i;:::-;12526:17;;;;;;;;:::i;:::-;12514:61;;;-1:-1:-1;;;;;26275:32:26;;26257:51;;26339:2;26324:18;;26317:34;;;26367:18;;;26360:34;;;-1:-1:-1;;;;;;12514:61:22;;;;;;;26245:2:26;26230:18;12514:61:22;;;;;;;-1:-1:-1;12593:12:22;;11824:788;-1:-1:-1;;;;;;11824:788:22:o;10996:822::-;11164:7;;;;11247:99;11278:6;11298:7;11319:17;;11247;:99::i;:::-;11183:163;;;;;;11380:10;11364:12;:26;;:46;;;;;11409:1;11394:12;:16;11364:46;11356:94;;;;-1:-1:-1;;;11356:94:22;;;;;;;:::i;:::-;11461:83;11491:10;11511:4;11518:25;11533:10;11518:12;:25;:::i;:::-;-1:-1:-1;;;;;11461:29:22;;;:83;;:29;:83::i;2426:187:14:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1818:573:18:-;2143:10;;;2142:62;;-1:-1:-1;2159:39:18;;-1:-1:-1;;;2159:39:18;;2183:4;2159:39;;;17034:34:26;-1:-1:-1;;;;;17104:15:26;;;17084:18;;;17077:43;2159:15:18;;;;;16969:18:26;;2159:39:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;2142:62;2121:163;;;;-1:-1:-1;;;2121:163:18;;26607:2:26;2121:163:18;;;26589:21:26;26646:2;26626:18;;;26619:30;26685:34;26665:18;;;26658:62;-1:-1:-1;;;26736:18:26;;;26729:52;26798:19;;2121:163:18;26405:418:26;2121:163:18;2321:62;;-1:-1:-1;;;;;22253:32:26;;2321:62:18;;;22235:51:26;22302:18;;;22295:34;;;2294:90:18;;2314:5;;-1:-1:-1;;;2344:22:18;22208:18:26;;2321:62:18;;;;-1:-1:-1;;2321:62:18;;;;;;;;;;;;;;-1:-1:-1;;;;;2321:62:18;-1:-1:-1;;;;;;2321:62:18;;;;;;;;;;2294:19;:90::i;:::-;1818:573;;;:::o;12618:850:22:-;12791:7;;;;12874:103;12905:10;12929:7;12950:17;;12874;:103::i;:::-;12810:167;;;;;;13011:10;12995:12;:26;;:46;;;;;13040:1;13025:12;:16;12995:46;12987:94;;;;-1:-1:-1;;;12987:94:22;;;;;;;:::i;:::-;13265:13;;13261:75;;13280:56;13310:14;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13280:29:22;;;13326:9;941:175:18;1050:58;;-1:-1:-1;;;;;22253:32:26;;1050:58:18;;;22235:51:26;22302:18;;;22295:34;;;1023:86:18;;1043:5;;-1:-1:-1;;;1073:23:18;22208:18:26;;1050:58:18;22061:274:26;1355:203:18;1482:68;;-1:-1:-1;;;;;27086:15:26;;;1482:68:18;;;27068:34:26;27138:15;;27118:18;;;27111:43;27170:18;;;27163:34;;;1455:96:18;;1475:5;;-1:-1:-1;;;1505:27:18;27003:18:26;;1482:68:18;26828:375:26;1455:96:18;1355:203;;;;:::o;5196:642::-;5615:23;5641:69;5669:4;5641:69;;;;;;;;;;;;;;;;;5649:5;-1:-1:-1;;;;;5641:27:18;;;:69;;;;;:::i;:::-;5615:95;;5728:10;:17;5749:1;5728:22;:56;;;;5765:10;5754:30;;;;;;;;;;;;:::i;:::-;5720:111;;;;-1:-1:-1;;;5720:111:18;;27660:2:26;5720:111:18;;;27642:21:26;27699:2;27679:18;;;27672:30;27738:34;27718:18;;;27711:62;-1:-1:-1;;;27789:18:26;;;27782:40;27839:19;;5720:111:18;27458:406:26;4108:223:19;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4241;5446;5460:23;5487:6;-1:-1:-1;;;;;5487:11:19;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:19:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1702:19:19;;;8113:60;;;;-1:-1:-1;;;8113:60:19;;28770:2:26;8113:60:19;;;28752:21:26;28809:2;28789:18;;;28782:30;28848:31;28828:18;;;28821:59;28897:18;;8113:60:19;28568:353:26;8113:60:19;-1:-1:-1;8208:10:19;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:19;;;;;;;;:::i;14:131:26:-;-1:-1:-1;;;;;89:31:26;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:26:o;609:383::-;686:6;694;702;755:2;743:9;734:7;730:23;726:32;723:52;;;771:1;768;761:12;723:52;810:9;797:23;829:31;854:5;829:31;:::i;:::-;879:5;931:2;916:18;;903:32;;-1:-1:-1;982:2:26;967:18;;;954:32;;609:383;-1:-1:-1;;;609:383:26:o;1321:180::-;1380:6;1433:2;1421:9;1412:7;1408:23;1404:32;1401:52;;;1449:1;1446;1439:12;1401:52;-1:-1:-1;1472:23:26;;1321:180;-1:-1:-1;1321:180:26:o;1506:159::-;1573:20;;1633:6;1622:18;;1612:29;;1602:57;;1655:1;1652;1645:12;1670:347;1721:8;1731:6;1785:3;1778:4;1770:6;1766:17;1762:27;1752:55;;1803:1;1800;1793:12;1752:55;-1:-1:-1;1826:20:26;;1869:18;1858:30;;1855:50;;;1901:1;1898;1891:12;1855:50;1938:4;1930:6;1926:17;1914:29;;1990:3;1983:4;1974:6;1966;1962:19;1958:30;1955:39;1952:59;;;2007:1;2004;1997:12;1952:59;1670:347;;;;;:::o;2022:154::-;2081:5;2126:2;2117:6;2112:3;2108:16;2104:25;2101:45;;;2142:1;2139;2132:12;2101:45;-1:-1:-1;2164:6:26;2022:154;-1:-1:-1;2022:154:26:o;2181:1390::-;2367:6;2375;2383;2391;2399;2407;2415;2423;2431;2439;2447:7;2501:3;2489:9;2480:7;2476:23;2472:33;2469:53;;;2518:1;2515;2508:12;2469:53;2531:49;2569:9;2556:23;2531:49;:::i;:::-;2612:9;2599:23;2589:33;;2641:37;2674:2;2663:9;2659:18;2641:37;:::i;:::-;2631:47;;2697:18;2764:2;2758;2747:9;2743:18;2730:32;2727:40;2724:60;;;2780:1;2777;2770:12;2724:60;2819:84;2895:7;2888:2;2877:9;2873:18;2860:32;2849:9;2845:48;2819:84;:::i;:::-;2922:8;;-1:-1:-1;2949:8:26;-1:-1:-1;3004:2:26;2989:18;;2976:32;;-1:-1:-1;3055:3:26;3040:19;;3027:33;;-1:-1:-1;3069:59:26;3122:3;3107:19;;3094:33;3069:59;:::i;:::-;3175:3;3164:9;3160:19;3147:33;3137:43;;3199:39;3233:3;3222:9;3218:19;3199:39;:::i;:::-;3189:49;;3288:2;3281:3;3270:9;3266:19;3253:33;3250:41;3247:61;;;3304:1;3301;3294:12;3247:61;;3343:85;3420:7;3412:3;3401:9;3397:19;3384:33;3373:9;3369:49;3343:85;:::i;:::-;3447:8;;-1:-1:-1;3474:8:26;-1:-1:-1;3502:63:26;3557:7;3551:3;3536:19;;3502:63;:::i;:::-;3491:74;;2181:1390;;;;;;;;;;;;;;:::o;3576:158::-;3638:5;3683:3;3674:6;3669:3;3665:16;3661:26;3658:46;;;3700:1;3697;3690:12;3739:922;3919:6;3927;3935;3943;3951;3995:9;3986:7;3982:23;4025:3;4021:2;4017:12;4014:32;;;4042:1;4039;4032:12;4014:32;4081:9;4068:23;4100:31;4125:5;4100:31;:::i;:::-;4150:5;-1:-1:-1;4206:2:26;4191:18;;4178:32;4233:18;4222:30;;4219:50;;;4265:1;4262;4255:12;4219:50;4288:69;4349:7;4340:6;4329:9;4325:22;4288:69;:::i;:::-;4278:79;-1:-1:-1;;4391:2:26;-1:-1:-1;;4373:16:26;;4369:25;4366:45;;;4407:1;4404;4397:12;4366:45;;4445:2;4434:9;4430:18;4420:28;;4500:3;4489:9;4485:19;4472:33;4514;4539:7;4514:33;:::i;:::-;4566:7;-1:-1:-1;4592:63:26;4647:7;4641:3;4626:19;;4592:63;:::i;:::-;4582:73;;3739:922;;;;;;;;:::o;4666:247::-;4725:6;4778:2;4766:9;4757:7;4753:23;4749:32;4746:52;;;4794:1;4791;4784:12;4746:52;4833:9;4820:23;4852:31;4877:5;4852:31;:::i;:::-;4902:5;4666:247;-1:-1:-1;;;4666:247:26:o;5100:899::-;5270:6;5278;5286;5294;5302;5310;5318;5371:3;5359:9;5350:7;5346:23;5342:33;5339:53;;;5388:1;5385;5378:12;5339:53;5427:9;5414:23;5446:31;5471:5;5446:31;:::i;:::-;5496:5;-1:-1:-1;5520:37:26;5553:2;5538:18;;5520:37;:::i;:::-;5510:47;;5604:2;5593:9;5589:18;5576:32;5566:42;;5655:2;5644:9;5640:18;5627:32;5617:42;;5706:3;5695:9;5691:19;5678:33;5668:43;;5762:3;5751:9;5747:19;5734:33;5790:18;5782:6;5779:30;5776:50;;;5822:1;5819;5812:12;5776:50;5845:66;5903:7;5894:6;5883:9;5879:22;5845:66;:::i;:::-;5835:76;;;5930:63;5985:7;5979:3;5968:9;5964:19;5930:63;:::i;:::-;5920:73;;5100:899;;;;;;;;;;:::o;6004:118::-;6090:5;6083:13;6076:21;6069:5;6066:32;6056:60;;6112:1;6109;6102:12;6127:1015;6273:6;6281;6289;6297;6305;6313;6321;6329;6382:3;6370:9;6361:7;6357:23;6353:33;6350:53;;;6399:1;6396;6389:12;6350:53;6438:9;6425:23;6457:31;6482:5;6457:31;:::i;:::-;6507:5;-1:-1:-1;6531:37:26;6564:2;6549:18;;6531:37;:::i;:::-;6521:47;;6615:2;6604:9;6600:18;6587:32;6577:42;;6666:2;6655:9;6651:18;6638:32;6628:42;;6722:3;6711:9;6707:19;6694:33;6736:30;6758:7;6736:30;:::i;:::-;6785:7;-1:-1:-1;6843:3:26;6828:19;;6815:33;6871:18;6860:30;;6857:50;;;6903:1;6900;6893:12;6857:50;6942:58;6992:7;6983:6;6972:9;6968:22;6942:58;:::i;:::-;7019:8;;-1:-1:-1;6916:84:26;-1:-1:-1;7073:63:26;;-1:-1:-1;7128:7:26;7122:3;7107:19;;7073:63;:::i;:::-;7063:73;;6127:1015;;;;;;;;;;;:::o;7608:1255::-;7765:6;7773;7781;7789;7797;7805;7813;7821;7829;7882:3;7870:9;7861:7;7857:23;7853:33;7850:53;;;7899:1;7896;7889:12;7850:53;7938:9;7925:23;7957:31;7982:5;7957:31;:::i;:::-;8007:5;-1:-1:-1;8031:37:26;8064:2;8049:18;;8031:37;:::i;:::-;8021:47;;8119:2;8108:9;8104:18;8091:32;8142:18;8183:2;8175:6;8172:14;8169:34;;;8199:1;8196;8189:12;8169:34;8238:58;8288:7;8279:6;8268:9;8264:22;8238:58;:::i;:::-;8315:8;;-1:-1:-1;8212:84:26;-1:-1:-1;8397:2:26;8382:18;;8369:32;;-1:-1:-1;8453:3:26;8438:19;;8425:33;;-1:-1:-1;8467:30:26;8425:33;8467:30;:::i;:::-;8516:7;;-1:-1:-1;8576:3:26;8561:19;;8548:33;;8593:16;;;8590:36;;;8622:1;8619;8612:12;8590:36;;8661:60;8713:7;8702:8;8691:9;8687:24;8661:60;:::i;:::-;8740:8;;-1:-1:-1;8635:86:26;-1:-1:-1;8794:63:26;;-1:-1:-1;8849:7:26;8843:3;8828:19;;8794:63;:::i;:::-;8784:73;;7608:1255;;;;;;;;;;;:::o;8868:456::-;8945:6;8953;8961;9014:2;9002:9;8993:7;8989:23;8985:32;8982:52;;;9030:1;9027;9020:12;8982:52;9069:9;9056:23;9088:31;9113:5;9088:31;:::i;:::-;9138:5;-1:-1:-1;9195:2:26;9180:18;;9167:32;9208:33;9167:32;9208:33;:::i;:::-;8868:456;;9260:7;;-1:-1:-1;;;9314:2:26;9299:18;;;;9286:32;;8868:456::o;9329:754::-;9466:6;9474;9482;9490;9543:3;9531:9;9522:7;9518:23;9514:33;9511:53;;;9560:1;9557;9550:12;9511:53;9599:9;9586:23;9618:31;9643:5;9618:31;:::i;:::-;9668:5;-1:-1:-1;9724:2:26;9709:18;;9696:32;9751:18;9740:30;;9737:50;;;9783:1;9780;9773:12;9737:50;9806:69;9867:7;9858:6;9847:9;9843:22;9806:69;:::i;:::-;9796:79;;;9927:2;9916:9;9912:18;9899:32;9940:30;9962:7;9940:30;:::i;:::-;9989:7;-1:-1:-1;10015:62:26;10069:7;10064:2;10049:18;;10015:62;:::i;:::-;10005:72;;9329:754;;;;;;;:::o;11119:266::-;11207:6;11202:3;11195:19;11259:6;11252:5;11245:4;11240:3;11236:14;11223:43;-1:-1:-1;11311:1:26;11286:16;;;11304:4;11282:27;;;11275:38;;;;11367:2;11346:15;;;-1:-1:-1;;11342:29:26;11333:39;;;11329:50;;11119:266::o;11390:883::-;11720:4;11766:1;11762;11757:3;11753:11;11749:19;11807:2;11799:6;11795:15;11784:9;11777:34;11859:6;11851;11847:19;11842:2;11831:9;11827:18;11820:47;11903:3;11898:2;11887:9;11883:18;11876:31;11930:62;11987:3;11976:9;11972:19;11964:6;11956;11930:62;:::i;:::-;12028:6;12023:2;12012:9;12008:18;12001:34;12084:2;12076:6;12072:15;12066:3;12055:9;12051:19;12044:44;12137:2;12129:6;12125:15;12119:3;12108:9;12104:19;12097:44;12190:9;12182:6;12178:22;12172:3;12161:9;12157:19;12150:51;12218:49;12260:6;12252;12244;12218:49;:::i;:::-;12210:57;11390:883;-1:-1:-1;;;;;;;;;;;;;11390:883:26:o;12278:276::-;12336:6;12389:2;12377:9;12368:7;12364:23;12360:32;12357:52;;;12405:1;12402;12395:12;12357:52;12444:9;12431:23;12494:10;12487:5;12483:22;12476:5;12473:33;12463:61;;12520:1;12517;12510:12;12559:521;12636:4;12642:6;12702:11;12689:25;12796:2;12792:7;12781:8;12765:14;12761:29;12757:43;12737:18;12733:68;12723:96;;12815:1;12812;12805:12;12723:96;12842:33;;12894:20;;;-1:-1:-1;12937:18:26;12926:30;;12923:50;;;12969:1;12966;12959:12;12923:50;13002:4;12990:17;;-1:-1:-1;13033:14:26;13029:27;;;13019:38;;13016:58;;;13070:1;13067;13060:12;13085:250;13170:1;13180:113;13194:6;13191:1;13188:13;13180:113;;;13270:11;;;13264:18;13251:11;;;13244:39;13216:2;13209:10;13180:113;;;-1:-1:-1;;13327:1:26;13309:16;;13302:27;13085:250::o;13340:270::-;13381:3;13419:5;13413:12;13446:6;13441:3;13434:19;13462:76;13531:6;13524:4;13519:3;13515:14;13508:4;13501:5;13497:16;13462:76;:::i;:::-;13592:2;13571:15;-1:-1:-1;;13567:29:26;13558:39;;;;13599:4;13554:50;;13340:270;-1:-1:-1;;13340:270:26:o;13615:763::-;13715:10;13707:5;13701:12;13697:29;13692:3;13685:42;13776:4;13769:5;13765:16;13759:23;13752:4;13747:3;13743:14;13736:47;13832:4;13825:5;13821:16;13815:23;13808:4;13803:3;13799:14;13792:47;13888:4;13881:5;13877:16;13871:23;13864:4;13859:3;13855:14;13848:47;13667:3;13941:4;13934:5;13930:16;13924:23;13979:4;13972;13967:3;13963:14;13956:28;14005:46;14045:4;14040:3;14036:14;14022:12;14005:46;:::i;:::-;13993:58;;14099:4;14092:5;14088:16;14082:23;14147:3;14141:4;14137:14;14130:4;14125:3;14121:14;14114:38;14175;14208:4;14192:14;14175:38;:::i;:::-;14161:52;;;14261:4;14254:5;14250:16;14244:23;14311:3;14303:6;14299:16;14292:4;14287:3;14283:14;14276:40;14332;14365:6;14349:14;14332:40;:::i;:::-;14325:47;13615:763;-1:-1:-1;;;;;13615:763:26:o;14383:572::-;14680:3;14669:9;14662:22;14643:4;14701:56;14752:3;14741:9;14737:19;14729:6;14701:56;:::i;:::-;14793:20;;14788:2;14773:18;;;14766:48;;;;14863:15;;;14850:29;14845:2;14830:18;;14823:57;-1:-1:-1;;;;;;14916:32:26;;;;14911:2;14896:18;;;14889:60;14693:64;14383:572;-1:-1:-1;14383:572:26:o;14960:575::-;15030:5;15078:4;15066:9;15061:3;15057:19;15053:30;15050:50;;;15096:1;15093;15086:12;15050:50;15129:4;15123:11;15173:4;15165:6;15161:17;15244:6;15232:10;15229:22;15208:18;15196:10;15193:34;15190:62;15187:185;;;15294:10;15289:3;15285:20;15282:1;15275:31;15329:4;15326:1;15319:15;15357:4;15354:1;15347:15;15187:185;15388:4;15381:24;15453:16;;15438:32;;15524:2;15509:18;;;15503:25;15486:15;;;15479:50;;;;-1:-1:-1;15423:6:26;14960:575;-1:-1:-1;14960:575:26:o;15540:1021::-;15679:6;15687;15731:9;15722:7;15718:23;15761:3;15757:2;15753:12;15750:32;;;15778:1;15775;15768:12;15750:32;15802:4;15798:2;15794:13;15791:33;;;15820:1;15817;15810:12;15791:33;;15853:2;15847:9;15895:4;15887:6;15883:17;15919:18;15987:6;15975:10;15972:22;15967:2;15955:10;15952:18;15949:46;15946:169;;;16037:10;16032:3;16028:20;16025:1;16018:31;16072:4;16069:1;16062:15;16100:4;16097:1;16090:15;15946:169;16135:10;16131:2;16124:22;16176:9;16170:16;16162:6;16155:32;16230:2;16219:9;16215:18;16209:25;16196:38;;16274:2;16267:5;16263:14;16256:5;16253:25;16243:53;;16292:1;16289;16282:12;16243:53;-1:-1:-1;16324:2:26;16312:15;;16305:30;16368:70;16430:7;16425:2;16410:18;;16368:70;:::i;:::-;16363:2;16351:15;;16344:95;16355:6;-1:-1:-1;16483:72:26;16547:7;16540:4;16525:20;;16483:72;:::i;:::-;16473:82;;15540:1021;;;;;:::o;16566:251::-;16636:6;16689:2;16677:9;16668:7;16664:23;16660:32;16657:52;;;16705:1;16702;16695:12;16657:52;16737:9;16731:16;16756:31;16781:5;16756:31;:::i;17131:184::-;17201:6;17254:2;17242:9;17233:7;17229:23;17225:32;17222:52;;;17270:1;17267;17260:12;17222:52;-1:-1:-1;17293:16:26;;17131:184;-1:-1:-1;17131:184:26:o;17320:932::-;17384:3;17430:5;17417:19;17445:33;17470:7;17445:33;:::i;:::-;-1:-1:-1;;;;;17537:16:26;;;17525:29;;17602:4;17591:16;;17578:30;;17617:33;17578:30;17617:33;:::i;:::-;17682:16;17675:4;17666:14;;17659:40;17758:4;17747:16;;17734:30;17815:14;17811:26;;;-1:-1:-1;;17807:40:26;17783:65;;17773:93;;17862:1;17859;17852:12;17773:93;17890:30;;18001:4;17988:18;;;17943:21;18029:18;18018:30;;18015:50;;;18061:1;18058;18051:12;18015:50;18110:6;18094:14;18090:27;18081:7;18077:41;18074:61;;;18131:1;18128;18121:12;18074:61;18167:4;18160;18155:3;18151:14;18144:28;18188:58;18240:4;18235:3;18231:14;18223:6;18214:7;18188:58;:::i;18257:680::-;18615:1;18611;18606:3;18602:11;18598:19;18590:6;18586:32;18575:9;18568:51;18667:6;18659;18655:19;18650:2;18639:9;18635:18;18628:47;18711:6;18706:2;18695:9;18691:18;18684:34;18754:6;18749:2;18738:9;18734:18;18727:34;18798:6;18792:3;18781:9;18777:19;18770:35;18842:3;18836;18825:9;18821:19;18814:32;18549:4;18863:68;18926:3;18915:9;18911:19;18903:6;18863:68;:::i;:::-;18855:76;18257:680;-1:-1:-1;;;;;;;;18257:680:26:o;18942:552::-;19215:6;19207;19203:19;19192:9;19185:38;19259:6;19254:2;19243:9;19239:18;19232:34;19302:6;19297:2;19286:9;19282:18;19275:34;19359:6;19352:14;19345:22;19340:2;19329:9;19325:18;19318:50;19405:3;19399;19388:9;19384:19;19377:32;19166:4;19426:62;19483:3;19472:9;19468:19;19460:6;19452;19426:62;:::i;19499:245::-;19578:6;19586;19639:2;19627:9;19618:7;19614:23;19610:32;19607:52;;;19655:1;19652;19645:12;19607:52;-1:-1:-1;;19678:16:26;;19734:2;19719:18;;;19713:25;19678:16;;19713:25;;-1:-1:-1;19499:245:26:o;20108:608::-;20438:1;20434;20429:3;20425:11;20421:19;20413:6;20409:32;20398:9;20391:51;20490:6;20482;20478:19;20473:2;20462:9;20458:18;20451:47;20534:6;20529:2;20518:9;20514:18;20507:34;20577:6;20572:2;20561:9;20557:18;20550:34;20621:3;20615;20604:9;20600:19;20593:32;20372:4;20642:68;20705:3;20694:9;20690:19;20682:6;20642:68;:::i;20721:397::-;20923:2;20905:21;;;20962:2;20942:18;;;20935:30;21001:34;20996:2;20981:18;;20974:62;-1:-1:-1;;;21067:2:26;21052:18;;21045:31;21108:3;21093:19;;20721:397::o;21123:127::-;21184:10;21179:3;21175:20;21172:1;21165:31;21215:4;21212:1;21205:15;21239:4;21236:1;21229:15;21255:128;21322:9;;;21343:11;;;21340:37;;;21357:18;;:::i;:::-;21255:128;;;;:::o;21388:668::-;21689:6;21681;21677:19;21666:9;21659:38;21733:3;21728:2;21717:9;21713:18;21706:31;21640:4;21760:62;21817:3;21806:9;21802:19;21794:6;21786;21760:62;:::i;:::-;21858:6;21853:2;21842:9;21838:18;21831:34;21915:6;21908:14;21901:22;21896:2;21885:9;21881:18;21874:50;21973:9;21965:6;21961:22;21955:3;21944:9;21940:19;21933:51;22001:49;22043:6;22035;22027;22001:49;:::i;:::-;21993:57;21388:668;-1:-1:-1;;;;;;;;;;21388:668:26:o;22340:343::-;22543:2;22532:9;22525:21;22506:4;22563:55;22614:2;22603:9;22599:18;22591:6;22563:55;:::i;:::-;22555:63;;22668:6;22661:14;22654:22;22649:2;22638:9;22634:18;22627:50;22340:343;;;;;:::o;22688:258::-;22787:6;22840:2;22828:9;22819:7;22815:23;22811:32;22808:52;;;22856:1;22853;22846:12;22808:52;22879:61;22932:7;22921:9;22879:61;:::i;24124:125::-;24189:9;;;24210:10;;;24207:36;;;24223:18;;:::i;24610:168::-;24683:9;;;24714;;24731:15;;;24725:22;;24711:37;24701:71;;24752:18;;:::i;24783:217::-;24823:1;24849;24839:132;;24893:10;24888:3;24884:20;24881:1;24874:31;24928:4;24925:1;24918:15;24956:4;24953:1;24946:15;24839:132;-1:-1:-1;24985:9:26;;24783:217::o;25365:399::-;25567:2;25549:21;;;25606:2;25586:18;;;25579:30;25645:34;25640:2;25625:18;;25618:62;-1:-1:-1;;;25711:2:26;25696:18;;25689:33;25754:3;25739:19;;25365:399::o;25769:281::-;25827:6;25880:2;25868:9;25859:7;25855:23;25851:32;25848:52;;;25896:1;25893;25886:12;25848:52;25922:23;;-1:-1:-1;;;;;;25974:27:26;;25964:38;;25954:66;;26016:1;26013;26006:12;27208:245;27275:6;27328:2;27316:9;27307:7;27303:23;27299:32;27296:52;;;27344:1;27341;27334:12;27296:52;27376:9;27370:16;27395:28;27417:5;27395:28;:::i;28276:287::-;28405:3;28443:6;28437:13;28459:66;28518:6;28513:3;28506:4;28498:6;28494:17;28459:66;:::i;:::-;28541:16;;;;;28276:287;-1:-1:-1;;28276:287:26:o;28926:219::-;29075:2;29064:9;29057:21;29038:4;29095:44;29135:2;29124:9;29120:18;29112:6;29095:44;:::i
Swarm Source
ipfs://e1af997aecbb6b0a65238fe239c1de91209ddf1cf301ee1b274fd934ba3e9057
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| HYPEREVM | 100.00% | $24.27 | 0.00000518 | $0.000126 |
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.