Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
LaPoste
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-10-30
*/
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity =0.8.19 ^0.8.0 ^0.8.1;
// node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
/**
* @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);
}
// node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
/**
* @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);
}
// node_modules/@openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
/**
* @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);
}
}
}
// node_modules/@openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
/**
* @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;
}
}
// src/interfaces/IAdapter.sol
interface IAdapter {
function sendMessage(address adapter, uint256 executionGasLimit, uint256 destinationChainId, bytes calldata message)
external
payable
returns (uint256);
}
// src/interfaces/ILaPoste.sol
interface ILaPoste {
struct Token {
address tokenAddress;
uint256 amount;
}
struct TokenMetadata {
string name;
string symbol;
uint8 decimals;
}
struct MessageParams {
uint256 destinationChainId;
address to;
Token token;
bytes payload;
}
struct Message {
uint256 destinationChainId;
address to;
address sender;
Token token;
TokenMetadata tokenMetadata;
bytes payload;
uint256 nonce;
}
function receiveMessage(uint256 chainId, bytes calldata payload) external;
}
// src/interfaces/IMessageReceiver.sol
interface IMessageReceiver {
function receiveMessage(uint256 chainId, address sender, bytes calldata payload) external;
}
// src/interfaces/ITokenFactory.sol
interface ITokenFactory {
function mint(
address mainToken,
address to,
uint256 amount,
string memory name,
string memory symbol,
uint8 decimals
) external;
function burn(address mainToken, address from, uint256 amount) external;
function getTokenMetadata(address token)
external
view
returns (string memory name, string memory symbol, uint8 decimals);
}
// node_modules/@openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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);
}
}
// node_modules/@openzeppelin/contracts/access/Ownable2Step.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
/**
* @dev Contract module which provides 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} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}
// node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.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));
}
}
// src/LaPoste.sol
/// @title LaPoste
/// @notice A contract for cross-chain message passing and token transfers
/// @author StakeDAO - @warrenception
/// @dev This contract uses a single adapter for governance-controlled bridge interactions
contract LaPoste is Ownable2Step {
using SafeERC20 for IERC20;
/// @notice The address of the token factory
address public immutable tokenFactory;
/// @notice The address of the adapter
address public adapter;
/// @notice Nonce for sent messages, per chain
mapping(uint256 => uint256) public sentNonces;
/// @notice Nonce for received messages, per chain
mapping(uint256 => mapping(uint256 => bool)) public receivedNonces;
/// @notice Thrown when the sender is not the adapter.
error OnlyAdapter();
/// @notice Thrown when no adapter is set.
error NoAdapterSet();
/// @notice Thrown when a message execution fails.
error ExecutionFailed();
/// @notice Thrown when a message is expired.
error ExpiredMessage();
/// @notice Thrown when a message has already been processed.
error MessageAlreadyProcessed();
/// @notice Thrown when a message is sent to the same chain.
error CannotSendToSelf();
event MessageSent(
uint256 indexed chainId, uint256 indexed nonce, address indexed sender, address to, ILaPoste.Message message
);
event MessageReceived(
uint256 indexed chainId,
uint256 indexed nonce,
address indexed sender,
address to,
ILaPoste.Message message,
bool success
);
/// @notice Ensures that only the adapter can call the function.
modifier onlyAdapter() {
if (msg.sender != adapter) revert OnlyAdapter();
_;
}
/// @notice Constructs the LaPoste contract.
/// @param _tokenFactory The address of the token factory.
constructor(address _tokenFactory, address _owner) {
tokenFactory = _tokenFactory;
_transferOwnership(_owner);
}
/// @notice Sends a message across chains
/// @param messageParams The message parameters
/// @dev This function is payable to cover cross-chain fees
function sendMessage(ILaPoste.MessageParams memory messageParams, uint256 additionalGasLimit, address refundAddress)
external
payable
{
if (adapter == address(0)) revert NoAdapterSet();
if (messageParams.destinationChainId == block.chainid) revert CannotSendToSelf();
/// 0. Initialize the message.
ILaPoste.Message memory message;
/// 1. Set the message fields.
message.destinationChainId = messageParams.destinationChainId;
message.to = messageParams.to;
message.sender = msg.sender;
message.payload = messageParams.payload;
/// 2. Set the nonce in the message
message.nonce = sentNonces[message.destinationChainId] + 1;
/// 3. Check if there's a token attached and mint it to the receiver.
if (messageParams.token.tokenAddress != address(0)) {
message.token = messageParams.token;
ITokenFactory(tokenFactory).burn(messageParams.token.tokenAddress, msg.sender, messageParams.token.amount);
(message.tokenMetadata.name, message.tokenMetadata.symbol, message.tokenMetadata.decimals) =
ITokenFactory(tokenFactory).getTokenMetadata(messageParams.token.tokenAddress);
}
(bool success,) = adapter.delegatecall(
abi.encodeWithSelector(
IAdapter.sendMessage.selector,
adapter,
additionalGasLimit,
message.destinationChainId,
abi.encode(message)
)
);
if (!success) revert ExecutionFailed();
/// 4. Set the refund address if not provided.
if (refundAddress == address(0)) {
refundAddress = msg.sender;
}
// 4. Increment the sent nonce for the specific chain after successful send
sentNonces[message.destinationChainId] = message.nonce;
/// 5. Refund the sender.
Address.sendValue(payable(refundAddress), address(this).balance);
emit MessageSent(message.destinationChainId, message.nonce, msg.sender, message.to, message);
}
/// @notice Receives a message from another chain
/// @param chainId The ID of the source chain
/// @param payload The encoded message payload
function receiveMessage(uint256 chainId, bytes calldata payload) external onlyAdapter {
ILaPoste.Message memory message = abi.decode(payload, (ILaPoste.Message));
// Check if the message has already been processed
if (receivedNonces[chainId][message.nonce]) revert MessageAlreadyProcessed();
/// 1. Check if there's a token attached and release or mint it to the receiver.
if (message.token.tokenAddress != address(0) && message.token.amount > 0) {
ITokenFactory(tokenFactory).mint(
message.token.tokenAddress,
message.to,
message.token.amount,
message.tokenMetadata.name,
message.tokenMetadata.symbol,
message.tokenMetadata.decimals
);
}
/// 2. Execute the message.
bool success = true;
if (message.payload.length > 0) {
try IMessageReceiver(message.to).receiveMessage(chainId, message.sender, message.payload) {}
catch {
success = false;
}
}
// 3. Update the received nonce for the specific chain
receivedNonces[chainId][message.nonce] = true;
emit MessageReceived(chainId, message.nonce, message.sender, message.to, message, success);
}
/// @notice Sets the adapter address
/// @param _adapter The address of the new adapter
/// @dev It should be updated on all chains.
function setAdapter(address _adapter) external onlyOwner {
adapter = _adapter;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_tokenFactory","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotSendToSelf","type":"error"},{"inputs":[],"name":"ExecutionFailed","type":"error"},{"inputs":[],"name":"ExpiredMessage","type":"error"},{"inputs":[],"name":"MessageAlreadyProcessed","type":"error"},{"inputs":[],"name":"NoAdapterSet","type":"error"},{"inputs":[],"name":"OnlyAdapter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ILaPoste.Token","name":"token","type":"tuple"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"internalType":"struct ILaPoste.TokenMetadata","name":"tokenMetadata","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"indexed":false,"internalType":"struct ILaPoste.Message","name":"message","type":"tuple"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ILaPoste.Token","name":"token","type":"tuple"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"internalType":"struct ILaPoste.TokenMetadata","name":"tokenMetadata","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"indexed":false,"internalType":"struct ILaPoste.Message","name":"message","type":"tuple"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"receivedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ILaPoste.Token","name":"token","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct ILaPoste.MessageParams","name":"messageParams","type":"tuple"},{"internalType":"uint256","name":"additionalGasLimit","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sentNonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"setAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b5060405162001521380380620015218339810160408190526200003491620000ea565b6200003f336200005f565b6001600160a01b03821660805262000057816200005f565b505062000122565b600180546001600160a01b03191690556200007a816200007d565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000e557600080fd5b919050565b60008060408385031215620000fe57600080fd5b6200010983620000cd565b91506200011960208401620000cd565b90509250929050565b6080516113ce620001536000396000818161023c0152818161035b015281816106d8015261075901526113ce6000f3fe6080604052600436106100a75760003560e01c80638da5cb5b116100645780638da5cb5b146101bb578063ab1da79c146101d9578063dbf6f300146101f9578063e30c39781461020c578063e77772fe1461022a578063f2fde38b1461025e57600080fd5b806303eadcfc146100ac57806304291b56146100e957806342a3783c1461010b5780635aace1a814610156578063715018a61461019157806379ba5097146101a6575b600080fd5b3480156100b857600080fd5b506002546100cc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100f557600080fd5b50610109610104366004610ba0565b61027e565b005b34801561011757600080fd5b50610146610126366004610c1c565b600460209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016100e0565b34801561016257600080fd5b50610183610171366004610c3e565b60036020526000908152604090205481565b6040519081526020016100e0565b34801561019d57600080fd5b506101096104cd565b3480156101b257600080fd5b506101096104e1565b3480156101c757600080fd5b506000546001600160a01b03166100cc565b3480156101e557600080fd5b506101096101f4366004610c73565b610560565b610109610207366004610dfd565b61058a565b34801561021857600080fd5b506001546001600160a01b03166100cc565b34801561023657600080fd5b506100cc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026a57600080fd5b50610109610279366004610c73565b61094e565b6002546001600160a01b031633146102a9576040516308ce245d60e31b815260040160405180910390fd5b60006102b782840184610f5e565b600085815260046020908152604080832060c0850151845290915290205490915060ff16156102f957604051637b04260960e01b815260040160405180910390fd5b6060810151516001600160a01b03161580159061031e57506000816060015160200151115b156103cc57606081015180516020808401519281015160808501518051928101516040918201519151638b60889960e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001696638b60889996610399969095919491939092909190600401611089565b600060405180830381600087803b1580156103b357600080fd5b505af11580156103c7573d6000803e3d6000fd5b505050505b60a081015151600190156104495781602001516001600160a01b0316631885c2f98684604001518560a001516040518463ffffffff1660e01b8152600401610416939291906110e5565b600060405180830381600087803b15801561043057600080fd5b505af1925050508015610441575060015b610449575060005b600085815260046020908152604080832060c086018051855290835292819020805460ff191660011790558481015192519185015190516001600160a01b039093169288917f297f8a9ea408733a36c466ddae8eb7e824c268dfbde07d0d37cdd62ec1691a50916104be9190889088906111ec565b60405180910390a45050505050565b6104d56109bf565b6104df6000610a19565b565b60015433906001600160a01b031681146105545760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61055d81610a19565b50565b6105686109bf565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03166105b357604051630f478b0f60e11b815260040160405180910390fd5b82514690036105d5576040516368a3526760e11b815260040160405180910390fd5b61063a6040805160e0810182526000808252602080830182905282840182905283518085018552828152808201839052606080850191909152845180820186528181529182015292830152906080820190815260200160608152602001600081525090565b83518082526020808601516001600160a01b03168184015233604080850191909152606087015160a08501526000928352600390915290205461067e906001611222565b60c08201526040840151516001600160a01b0316156107e3576040848101805160608401525180516020909101519151633dae446f60e21b81526001600160a01b03918216600482015233602482015260448101929092527f0000000000000000000000000000000000000000000000000000000000000000169063f6b911bc90606401600060405180830381600087803b15801561071c57600080fd5b505af1158015610730573d6000803e3d6000fd5b5050505060408481015151905163c00f14ab60e01b81526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063c00f14ab90602401600060405180830381865afa1580156107a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107ca9190810190611296565b608084015160ff90911660408201526020810191909152525b60025481516040516000926001600160a01b031691634e4a8c0d60e01b918391889161081390889060200161130e565b60408051601f198184030181529082905261083394939291602401611321565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108719190611358565b600060405180830381855af49150503d80600081146108ac576040519150601f19603f3d011682016040523d82523d6000602084013e6108b1565b606091505b50509050806108d357604051632b3f6d1160e21b815260040160405180910390fd5b6001600160a01b0383166108e5573392505b60c082015182516000908152600360205260409020556109058347610a32565b336001600160a01b03168260c0015183600001517f88a74d9f4d74e2198884737e7272216c42ebb75d1518f4998a773fee405b21a98560200151866040516104be929190611374565b6109566109bf565b600180546001600160a01b0383166001600160a01b031990911681179091556109876000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054b565b600180546001600160a01b031916905561055d81610b50565b80471015610a825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161054b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610acf576040519150601f19603f3d011682016040523d82523d6000602084013e610ad4565b606091505b5050905080610b4b5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161054b565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600060408486031215610bb557600080fd5b83359250602084013567ffffffffffffffff80821115610bd457600080fd5b818601915086601f830112610be857600080fd5b813581811115610bf757600080fd5b876020828501011115610c0957600080fd5b6020830194508093505050509250925092565b60008060408385031215610c2f57600080fd5b50508035926020909101359150565b600060208284031215610c5057600080fd5b5035919050565b80356001600160a01b0381168114610c6e57600080fd5b919050565b600060208284031215610c8557600080fd5b610c8e82610c57565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715610cce57610cce610c95565b60405290565b60405160e0810167ffffffffffffffff81118282101715610cce57610cce610c95565b604051601f8201601f1916810167ffffffffffffffff81118282101715610d2057610d20610c95565b604052919050565b600060408284031215610d3a57600080fd5b6040516040810181811067ffffffffffffffff82111715610d5d57610d5d610c95565b604052905080610d6c83610c57565b8152602083013560208201525092915050565b600067ffffffffffffffff821115610d9957610d99610c95565b50601f01601f191660200190565b600082601f830112610db857600080fd5b8135610dcb610dc682610d7f565b610cf7565b818152846020838601011115610de057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e1257600080fd5b833567ffffffffffffffff80821115610e2a57600080fd5b9085019060a08288031215610e3e57600080fd5b610e46610cab565b82358152610e5660208401610c57565b6020820152610e688860408501610d28565b6040820152608083013582811115610e7f57600080fd5b610e8b89828601610da7565b6060830152509450505060208401359150610ea860408501610c57565b90509250925092565b60ff8116811461055d57600080fd5b600060608284031215610ed257600080fd5b6040516060810167ffffffffffffffff8282108183111715610ef657610ef6610c95565b816040528293508435915080821115610f0e57600080fd5b610f1a86838701610da7565b83526020850135915080821115610f3057600080fd5b50610f3d85828601610da7565b6020830152506040830135610f5181610eb1565b6040919091015292915050565b600060208284031215610f7057600080fd5b813567ffffffffffffffff80821115610f8857600080fd5b908301906101008286031215610f9d57600080fd5b610fa5610cd4565b82358152610fb560208401610c57565b6020820152610fc660408401610c57565b6040820152610fd88660608501610d28565b606082015260a083013582811115610fef57600080fd5b610ffb87828601610ec0565b60808301525060c08301358281111561101357600080fd5b61101f87828601610da7565b60a08301525060e0929092013560c0830152509392505050565b60005b8381101561105457818101518382015260200161103c565b50506000910152565b60008151808452611075816020860160208601611039565b601f01601f19169290920160200192915050565b6001600160a01b038781168252861660208201526040810185905260c0606082018190526000906110bc9083018661105d565b82810360808401526110ce818661105d565b91505060ff831660a0830152979650505050505050565b8381526001600160a01b038316602082015260606040820181905260009061110f9083018461105d565b95945050505050565b600081516060845261112d606085018261105d565b905060208301518482036020860152611146828261105d565b91505060ff60408401511660408501528091505092915050565b805182526020808201516001600160a01b0390811682850152604080840151821690850152606080840151805190921690850152015160808084019190915281015161010060a084018190526000916111bb85830182611118565b91505060a083015184820360c08601526111d5828261105d565b91505060c083015160e08501528091505092915050565b6001600160a01b038416815260606020820181905260009061121090830185611160565b90508215156040830152949350505050565b8082018082111561124357634e487b7160e01b600052601160045260246000fd5b92915050565b600082601f83011261125a57600080fd5b8151611268610dc682610d7f565b81815284602083860101111561127d57600080fd5b61128e826020830160208701611039565b949350505050565b6000806000606084860312156112ab57600080fd5b835167ffffffffffffffff808211156112c357600080fd5b6112cf87838801611249565b945060208601519150808211156112e557600080fd5b506112f286828701611249565b925050604084015161130381610eb1565b809150509250925092565b602081526000610c8e6020830184611160565b60018060a01b038516815283602082015282604082015260806060820152600061134e608083018461105d565b9695505050505050565b6000825161136a818460208701611039565b9190910192915050565b6001600160a01b038316815260406020820181905260009061128e9083018461116056fea2646970667358221220071f293f0889e0a2eb9d2f365f2a854d8bcc718aa5578d5397acf4542ef4330664736f6c6343000813003300000000000000000000000000000000a551c9435e002a5d75dc2ee3c0644400000000000000000000000000606a503e5178908f10597894b35b2be8685eab90
Deployed Bytecode
0x6080604052600436106100a75760003560e01c80638da5cb5b116100645780638da5cb5b146101bb578063ab1da79c146101d9578063dbf6f300146101f9578063e30c39781461020c578063e77772fe1461022a578063f2fde38b1461025e57600080fd5b806303eadcfc146100ac57806304291b56146100e957806342a3783c1461010b5780635aace1a814610156578063715018a61461019157806379ba5097146101a6575b600080fd5b3480156100b857600080fd5b506002546100cc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100f557600080fd5b50610109610104366004610ba0565b61027e565b005b34801561011757600080fd5b50610146610126366004610c1c565b600460209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016100e0565b34801561016257600080fd5b50610183610171366004610c3e565b60036020526000908152604090205481565b6040519081526020016100e0565b34801561019d57600080fd5b506101096104cd565b3480156101b257600080fd5b506101096104e1565b3480156101c757600080fd5b506000546001600160a01b03166100cc565b3480156101e557600080fd5b506101096101f4366004610c73565b610560565b610109610207366004610dfd565b61058a565b34801561021857600080fd5b506001546001600160a01b03166100cc565b34801561023657600080fd5b506100cc7f00000000000000000000000000000000a551c9435e002a5d75dc2ee3c064440081565b34801561026a57600080fd5b50610109610279366004610c73565b61094e565b6002546001600160a01b031633146102a9576040516308ce245d60e31b815260040160405180910390fd5b60006102b782840184610f5e565b600085815260046020908152604080832060c0850151845290915290205490915060ff16156102f957604051637b04260960e01b815260040160405180910390fd5b6060810151516001600160a01b03161580159061031e57506000816060015160200151115b156103cc57606081015180516020808401519281015160808501518051928101516040918201519151638b60889960e01b81526001600160a01b037f00000000000000000000000000000000a551c9435e002a5d75dc2ee3c06444001696638b60889996610399969095919491939092909190600401611089565b600060405180830381600087803b1580156103b357600080fd5b505af11580156103c7573d6000803e3d6000fd5b505050505b60a081015151600190156104495781602001516001600160a01b0316631885c2f98684604001518560a001516040518463ffffffff1660e01b8152600401610416939291906110e5565b600060405180830381600087803b15801561043057600080fd5b505af1925050508015610441575060015b610449575060005b600085815260046020908152604080832060c086018051855290835292819020805460ff191660011790558481015192519185015190516001600160a01b039093169288917f297f8a9ea408733a36c466ddae8eb7e824c268dfbde07d0d37cdd62ec1691a50916104be9190889088906111ec565b60405180910390a45050505050565b6104d56109bf565b6104df6000610a19565b565b60015433906001600160a01b031681146105545760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61055d81610a19565b50565b6105686109bf565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03166105b357604051630f478b0f60e11b815260040160405180910390fd5b82514690036105d5576040516368a3526760e11b815260040160405180910390fd5b61063a6040805160e0810182526000808252602080830182905282840182905283518085018552828152808201839052606080850191909152845180820186528181529182015292830152906080820190815260200160608152602001600081525090565b83518082526020808601516001600160a01b03168184015233604080850191909152606087015160a08501526000928352600390915290205461067e906001611222565b60c08201526040840151516001600160a01b0316156107e3576040848101805160608401525180516020909101519151633dae446f60e21b81526001600160a01b03918216600482015233602482015260448101929092527f00000000000000000000000000000000a551c9435e002a5d75dc2ee3c0644400169063f6b911bc90606401600060405180830381600087803b15801561071c57600080fd5b505af1158015610730573d6000803e3d6000fd5b5050505060408481015151905163c00f14ab60e01b81526001600160a01b0391821660048201527f00000000000000000000000000000000a551c9435e002a5d75dc2ee3c06444009091169063c00f14ab90602401600060405180830381865afa1580156107a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107ca9190810190611296565b608084015160ff90911660408201526020810191909152525b60025481516040516000926001600160a01b031691634e4a8c0d60e01b918391889161081390889060200161130e565b60408051601f198184030181529082905261083394939291602401611321565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108719190611358565b600060405180830381855af49150503d80600081146108ac576040519150601f19603f3d011682016040523d82523d6000602084013e6108b1565b606091505b50509050806108d357604051632b3f6d1160e21b815260040160405180910390fd5b6001600160a01b0383166108e5573392505b60c082015182516000908152600360205260409020556109058347610a32565b336001600160a01b03168260c0015183600001517f88a74d9f4d74e2198884737e7272216c42ebb75d1518f4998a773fee405b21a98560200151866040516104be929190611374565b6109566109bf565b600180546001600160a01b0383166001600160a01b031990911681179091556109876000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054b565b600180546001600160a01b031916905561055d81610b50565b80471015610a825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161054b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610acf576040519150601f19603f3d011682016040523d82523d6000602084013e610ad4565b606091505b5050905080610b4b5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161054b565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600060408486031215610bb557600080fd5b83359250602084013567ffffffffffffffff80821115610bd457600080fd5b818601915086601f830112610be857600080fd5b813581811115610bf757600080fd5b876020828501011115610c0957600080fd5b6020830194508093505050509250925092565b60008060408385031215610c2f57600080fd5b50508035926020909101359150565b600060208284031215610c5057600080fd5b5035919050565b80356001600160a01b0381168114610c6e57600080fd5b919050565b600060208284031215610c8557600080fd5b610c8e82610c57565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715610cce57610cce610c95565b60405290565b60405160e0810167ffffffffffffffff81118282101715610cce57610cce610c95565b604051601f8201601f1916810167ffffffffffffffff81118282101715610d2057610d20610c95565b604052919050565b600060408284031215610d3a57600080fd5b6040516040810181811067ffffffffffffffff82111715610d5d57610d5d610c95565b604052905080610d6c83610c57565b8152602083013560208201525092915050565b600067ffffffffffffffff821115610d9957610d99610c95565b50601f01601f191660200190565b600082601f830112610db857600080fd5b8135610dcb610dc682610d7f565b610cf7565b818152846020838601011115610de057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e1257600080fd5b833567ffffffffffffffff80821115610e2a57600080fd5b9085019060a08288031215610e3e57600080fd5b610e46610cab565b82358152610e5660208401610c57565b6020820152610e688860408501610d28565b6040820152608083013582811115610e7f57600080fd5b610e8b89828601610da7565b6060830152509450505060208401359150610ea860408501610c57565b90509250925092565b60ff8116811461055d57600080fd5b600060608284031215610ed257600080fd5b6040516060810167ffffffffffffffff8282108183111715610ef657610ef6610c95565b816040528293508435915080821115610f0e57600080fd5b610f1a86838701610da7565b83526020850135915080821115610f3057600080fd5b50610f3d85828601610da7565b6020830152506040830135610f5181610eb1565b6040919091015292915050565b600060208284031215610f7057600080fd5b813567ffffffffffffffff80821115610f8857600080fd5b908301906101008286031215610f9d57600080fd5b610fa5610cd4565b82358152610fb560208401610c57565b6020820152610fc660408401610c57565b6040820152610fd88660608501610d28565b606082015260a083013582811115610fef57600080fd5b610ffb87828601610ec0565b60808301525060c08301358281111561101357600080fd5b61101f87828601610da7565b60a08301525060e0929092013560c0830152509392505050565b60005b8381101561105457818101518382015260200161103c565b50506000910152565b60008151808452611075816020860160208601611039565b601f01601f19169290920160200192915050565b6001600160a01b038781168252861660208201526040810185905260c0606082018190526000906110bc9083018661105d565b82810360808401526110ce818661105d565b91505060ff831660a0830152979650505050505050565b8381526001600160a01b038316602082015260606040820181905260009061110f9083018461105d565b95945050505050565b600081516060845261112d606085018261105d565b905060208301518482036020860152611146828261105d565b91505060ff60408401511660408501528091505092915050565b805182526020808201516001600160a01b0390811682850152604080840151821690850152606080840151805190921690850152015160808084019190915281015161010060a084018190526000916111bb85830182611118565b91505060a083015184820360c08601526111d5828261105d565b91505060c083015160e08501528091505092915050565b6001600160a01b038416815260606020820181905260009061121090830185611160565b90508215156040830152949350505050565b8082018082111561124357634e487b7160e01b600052601160045260246000fd5b92915050565b600082601f83011261125a57600080fd5b8151611268610dc682610d7f565b81815284602083860101111561127d57600080fd5b61128e826020830160208701611039565b949350505050565b6000806000606084860312156112ab57600080fd5b835167ffffffffffffffff808211156112c357600080fd5b6112cf87838801611249565b945060208601519150808211156112e557600080fd5b506112f286828701611249565b925050604084015161130381610eb1565b809150509250925092565b602081526000610c8e6020830184611160565b60018060a01b038516815283602082015282604082015260806060820152600061134e608083018461105d565b9695505050505050565b6000825161136a818460208701611039565b9190910192915050565b6001600160a01b038316815260406020820181905260009061128e9083018461116056fea2646970667358221220071f293f0889e0a2eb9d2f365f2a854d8bcc718aa5578d5397acf4542ef4330664736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000a551c9435e002a5d75dc2ee3c0644400000000000000000000000000606a503e5178908f10597894b35b2be8685eab90
-----Decoded View---------------
Arg [0] : _tokenFactory (address): 0x00000000A551c9435E002a5d75DC2EE3C0644400
Arg [1] : _owner (address): 0x606A503e5178908F10597894B35b2Be8685EAB90
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000a551c9435e002a5d75dc2ee3c0644400
Arg [1] : 000000000000000000000000606a503e5178908f10597894b35b2be8685eab90
Deployed Bytecode Sourcemap
30939:5926:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31154:22;;;;;;;;;;-1:-1:-1;31154:22:0;;;;-1:-1:-1;;;;;31154:22:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;31154:22:0;;;;;;;;35257:1355;;;;;;;;;;-1:-1:-1;35257:1355:0;;;;;:::i;:::-;;:::i;:::-;;31347:66;;;;;;;;;;-1:-1:-1;31347:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1304:14:1;;1297:22;1279:41;;1267:2;1252:18;31347:66:0;1139:187:1;31237:45:0;;;;;;;;;;-1:-1:-1;31237:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1662:25:1;;;1650:2;1635:18;31237:45:0;1516:177:1;20896:103:0;;;;;;;;;;;;;:::i;23478:216::-;;;;;;;;;;;;;:::i;20255:87::-;;;;;;;;;;-1:-1:-1;20301:7:0;20328:6;-1:-1:-1;;;;;20328:6:0;20255:87;;36768:94;;;;;;;;;;-1:-1:-1;36768:94:0;;;;;:::i;:::-;;:::i;32921:2170::-;;;;;;:::i;:::-;;:::i;22566:101::-;;;;;;;;;;-1:-1:-1;22646:13:0;;-1:-1:-1;;;;;22646:13:0;22566:101;;31064:37;;;;;;;;;;;;;;;22866:181;;;;;;;;;;-1:-1:-1;22866:181:0;;;;;:::i;:::-;;:::i;35257:1355::-;32442:7;;-1:-1:-1;;;;;32442:7:0;32428:10;:21;32424:47;;32458:13;;-1:-1:-1;;;32458:13:0;;;;;;;;;;;32424:47;35354:31:::1;35388:39;::::0;;::::1;35399:7:::0;35388:39:::1;:::i;:::-;35504:23;::::0;;;:14:::1;:23;::::0;;;;;;;35528:13:::1;::::0;::::1;::::0;35504:38;;;;;;;;35354:73;;-1:-1:-1;35504:38:0::1;;35500:76;;;35551:25;;-1:-1:-1::0;;;35551:25:0::1;;;;;;;;;;;35500:76;35683:13;::::0;::::1;::::0;:26;-1:-1:-1;;;;;35683:40:0::1;::::0;;::::1;::::0;:68:::1;;;35750:1;35727:7;:13;;;:20;;;:24;35683:68;35679:402;;;35819:13;::::0;::::1;::::0;:26;;35864:10:::1;::::0;;::::1;::::0;35893:20;;::::1;::::0;35932:21:::1;::::0;::::1;::::0;:26;;35977:28;;::::1;::::0;36024:30:::1;::::0;;::::1;::::0;35768:301;;-1:-1:-1;;;35768:301:0;;-1:-1:-1;;;;;35782:12:0::1;35768:32;::::0;::::1;::::0;:301:::1;::::0;35819:26;;35864:10;;35893:20;;35932:26;;35977:28;;36024:30;35768:301:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35679:402;36164:15;::::0;::::1;::::0;:22;36145:4:::1;::::0;36164:26;36160:220:::1;;36228:7;:10;;;-1:-1:-1::0;;;;;36211:43:0::1;;36255:7;36264;:14;;;36280:7;:15;;;36211:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;36207:162;;-1:-1:-1::0;36348:5:0::1;36207:162;36456:23;::::0;;;:14:::1;:23;::::0;;;;;;;36480:13:::1;::::0;::::1;::::0;;36456:38;;;;;;;;;:45;;-1:-1:-1;;36456:45:0::1;36497:4;36456:45;::::0;;36559:14;;::::1;::::0;36544:13;;36575:10;;::::1;::::0;36519:85;;-1:-1:-1;;;;;36519:85:0;;::::1;::::0;36471:7;;36519:85:::1;::::0;::::1;::::0;36575:10;36480:7;;36596;;36519:85:::1;:::i;:::-;;;;;;;;35343:1269;;35257:1355:::0;;;:::o;20896:103::-;20141:13;:11;:13::i;:::-;20961:30:::1;20988:1;20961:18;:30::i;:::-;20896:103::o:0;23478:216::-;22646:13;;17188:10;;-1:-1:-1;;;;;22646:13:0;23579:24;;23571:78;;;;-1:-1:-1;;;23571:78:0;;10914:2:1;23571:78:0;;;10896:21:1;10953:2;10933:18;;;10926:30;10992:34;10972:18;;;10965:62;-1:-1:-1;;;11043:18:1;;;11036:39;11092:19;;23571:78:0;;;;;;;;;23660:26;23679:6;23660:18;:26::i;:::-;23520:174;23478:216::o;36768:94::-;20141:13;:11;:13::i;:::-;36836:7:::1;:18:::0;;-1:-1:-1;;;;;;36836:18:0::1;-1:-1:-1::0;;;;;36836:18:0;;;::::1;::::0;;;::::1;::::0;;36768:94::o;32921:2170::-;33093:7;;-1:-1:-1;;;;;33093:7:0;33089:48;;33123:14;;-1:-1:-1;;;33123:14:0;;;;;;;;;;;33089:48;33152:32;;33188:13;33152:49;;33148:80;;33210:18;;-1:-1:-1;;;33210:18:0;;;;;;;;;;;33148:80;33281:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33281:31:0;33394:32;;33365:61;;;33450:16;;;;;-1:-1:-1;;;;;33437:29:0;:10;;;:29;33494:10;33477:14;;;;:27;;;;33533:21;;;;33515:15;;;:39;33394:32;33628:38;;;:10;:38;;;;;;:42;;33669:1;33628:42;:::i;:::-;33612:13;;;:58;33766:19;;;;:32;-1:-1:-1;;;;;33766:46:0;;33762:442;;33845:19;;;;;;33829:13;;;:35;33914:19;:32;;33960:26;;;;;33881:106;;-1:-1:-1;;;33881:106:0;;-1:-1:-1;;;;;11607:15:1;;;33881:106:0;;;11589:34:1;33948:10:0;11639:18:1;;;11632:43;11691:18;;;11684:34;;;;33895:12:0;33881:32;;;;11524:18:1;;33881:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;34159:19:0;;;;;:32;34114:78;;-1:-1:-1;;;34114:78:0;;-1:-1:-1;;;;;178:32:1;;;34114:78:0;;;160:51:1;34128:12:0;34114:44;;;;;;133:18:1;;34114:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34114:78:0;;;;;;;;;;;;:::i;:::-;34005:21;;;;34004:188;;;;34063:30;;;34004:188;34033:28;;;34004:188;;;;;33762:442;34234:7;;34421:26;;34466:19;;34217:12;;-1:-1:-1;;;;;34234:7:0;;-1:-1:-1;;;34310:29:0;34234:7;;34384:18;;34466:19;;34421:7;;34466:19;;;:::i;:::-;;;;-1:-1:-1;;34466:19:0;;;;;;;;;;34269:231;;;;;;;;:::i;:::-;;;;-1:-1:-1;;34269:231:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34269:231:0;-1:-1:-1;;;;;;34269:231:0;;;;;;;;;;34234:277;;;;34269:231;34234:277;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34216:295;;;34527:7;34522:38;;34543:17;;-1:-1:-1;;;34543:17:0;;;;;;;;;;;34522:38;-1:-1:-1;;;;;34633:27:0;;34629:86;;34693:10;34677:26;;34629:86;34853:13;;;;34823:26;;34812:38;;;;:10;:38;;;;;:54;34914:64;34940:13;34956:21;34914:17;:64::i;:::-;35051:10;-1:-1:-1;;;;;34996:87:0;35036:7;:13;;;35008:7;:26;;;34996:87;35063:7;:10;;;35075:7;34996:87;;;;;;;:::i;22866:181::-;20141:13;:11;:13::i;:::-;22956::::1;:24:::0;;-1:-1:-1;;;;;22956:24:0;::::1;-1:-1:-1::0;;;;;;22956:24:0;;::::1;::::0;::::1;::::0;;;23021:7:::1;20301::::0;20328:6;-1:-1:-1;;;;;20328:6:0;;20255:87;23021:7:::1;-1:-1:-1::0;;;;;22996:43:0::1;;;;;;;;;;;22866:181:::0;:::o;20420:132::-;20301:7;20328:6;-1:-1:-1;;;;;20328:6:0;17188:10;20484:23;20476:68;;;;-1:-1:-1;;;20476:68:0;;14444:2:1;20476:68:0;;;14426:21:1;;;14463:18;;;14456:30;14522:34;14502:18;;;14495:62;14574:18;;20476:68:0;14242:356:1;23237:156:0;23327:13;23320:20;;-1:-1:-1;;;;;;23320:20:0;;;23351:34;23376:8;23351:24;:34::i;9536:317::-;9651:6;9626:21;:31;;9618:73;;;;-1:-1:-1;;;9618:73:0;;14805:2:1;9618:73:0;;;14787:21:1;14844:2;14824:18;;;14817:30;14883:31;14863:18;;;14856:59;14932:18;;9618:73:0;14603:353:1;9618:73:0;9705:12;9723:9;-1:-1:-1;;;;;9723:14:0;9745:6;9723:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9704:52;;;9775:7;9767:78;;;;-1:-1:-1;;;9767:78:0;;15373:2:1;9767:78:0;;;15355:21:1;15412:2;15392:18;;;15385:30;15451:34;15431:18;;;15424:62;15522:28;15502:18;;;15495:56;15568:19;;9767:78:0;15171:422:1;9767:78:0;9607:246;9536:317;;:::o;21515:191::-;21589:16;21608:6;;-1:-1:-1;;;;;21625:17:0;;;-1:-1:-1;;;;;;21625:17:0;;;;;;21658:40;;21608:6;;;;;;;21658:40;;21589:16;21658:40;21578:128;21515:191;:::o;222:659:1:-;301:6;309;317;370:2;358:9;349:7;345:23;341:32;338:52;;;386:1;383;376:12;338:52;422:9;409:23;399:33;;483:2;472:9;468:18;455:32;506:18;547:2;539:6;536:14;533:34;;;563:1;560;553:12;533:34;601:6;590:9;586:22;576:32;;646:7;639:4;635:2;631:13;627:27;617:55;;668:1;665;658:12;617:55;708:2;695:16;734:2;726:6;723:14;720:34;;;750:1;747;740:12;720:34;795:7;790:2;781:6;777:2;773:15;769:24;766:37;763:57;;;816:1;813;806:12;763:57;847:2;843;839:11;829:21;;869:6;859:16;;;;;222:659;;;;;:::o;886:248::-;954:6;962;1015:2;1003:9;994:7;990:23;986:32;983:52;;;1031:1;1028;1021:12;983:52;-1:-1:-1;;1054:23:1;;;1124:2;1109:18;;;1096:32;;-1:-1:-1;886:248:1:o;1331:180::-;1390:6;1443:2;1431:9;1422:7;1418:23;1414:32;1411:52;;;1459:1;1456;1449:12;1411:52;-1:-1:-1;1482:23:1;;1331:180;-1:-1:-1;1331:180:1:o;1698:173::-;1766:20;;-1:-1:-1;;;;;1815:31:1;;1805:42;;1795:70;;1861:1;1858;1851:12;1795:70;1698:173;;;:::o;1876:186::-;1935:6;1988:2;1976:9;1967:7;1963:23;1959:32;1956:52;;;2004:1;2001;1994:12;1956:52;2027:29;2046:9;2027:29;:::i;:::-;2017:39;1876:186;-1:-1:-1;;;1876:186:1:o;2067:127::-;2128:10;2123:3;2119:20;2116:1;2109:31;2159:4;2156:1;2149:15;2183:4;2180:1;2173:15;2199:253;2271:2;2265:9;2313:4;2301:17;;2348:18;2333:34;;2369:22;;;2330:62;2327:88;;;2395:18;;:::i;:::-;2431:2;2424:22;2199:253;:::o;2457:::-;2529:2;2523:9;2571:4;2559:17;;2606:18;2591:34;;2627:22;;;2588:62;2585:88;;;2653:18;;:::i;2715:275::-;2786:2;2780:9;2851:2;2832:13;;-1:-1:-1;;2828:27:1;2816:40;;2886:18;2871:34;;2907:22;;;2868:62;2865:88;;;2933:18;;:::i;:::-;2969:2;2962:22;2715:275;;-1:-1:-1;2715:275:1:o;2995:480::-;3047:5;3095:4;3083:9;3078:3;3074:19;3070:30;3067:50;;;3113:1;3110;3103:12;3067:50;3146:4;3140:11;3190:4;3182:6;3178:17;3261:6;3249:10;3246:22;3225:18;3213:10;3210:34;3207:62;3204:88;;;3272:18;;:::i;:::-;3308:4;3301:24;3343:6;-1:-1:-1;3343:6:1;3373:29;3392:9;3373:29;:::i;:::-;3365:6;3358:45;3464:2;3453:9;3449:18;3436:32;3431:2;3423:6;3419:15;3412:57;;2995:480;;;;:::o;3480:186::-;3528:4;3561:18;3553:6;3550:30;3547:56;;;3583:18;;:::i;:::-;-1:-1:-1;3649:2:1;3628:15;-1:-1:-1;;3624:29:1;3655:4;3620:40;;3480:186::o;3671:462::-;3713:5;3766:3;3759:4;3751:6;3747:17;3743:27;3733:55;;3784:1;3781;3774:12;3733:55;3820:6;3807:20;3851:48;3867:31;3895:2;3867:31;:::i;:::-;3851:48;:::i;:::-;3924:2;3915:7;3908:19;3970:3;3963:4;3958:2;3950:6;3946:15;3942:26;3939:35;3936:55;;;3987:1;3984;3977:12;3936:55;4052:2;4045:4;4037:6;4033:17;4026:4;4017:7;4013:18;4000:55;4100:1;4075:16;;;4093:4;4071:27;4064:38;;;;4079:7;3671:462;-1:-1:-1;;;3671:462:1:o;4138:957::-;4245:6;4253;4261;4314:2;4302:9;4293:7;4289:23;4285:32;4282:52;;;4330:1;4327;4320:12;4282:52;4370:9;4357:23;4399:18;4440:2;4432:6;4429:14;4426:34;;;4456:1;4453;4446:12;4426:34;4479:22;;;;4535:4;4517:16;;;4513:27;4510:47;;;4553:1;4550;4543:12;4510:47;4579:22;;:::i;:::-;4637:2;4624:16;4617:5;4610:31;4673;4700:2;4696;4692:11;4673:31;:::i;:::-;4668:2;4661:5;4657:14;4650:55;4737:45;4774:7;4769:2;4765;4761:11;4737:45;:::i;:::-;4732:2;4725:5;4721:14;4714:69;4829:4;4825:2;4821:13;4808:27;4860:2;4850:8;4847:16;4844:36;;;4876:1;4873;4866:12;4844:36;4912:44;4948:7;4937:8;4933:2;4929:17;4912:44;:::i;:::-;4907:2;4896:14;;4889:68;-1:-1:-1;4900:5:1;-1:-1:-1;;;5028:2:1;5013:18;;5000:32;;-1:-1:-1;5051:38:1;5085:2;5070:18;;5051:38;:::i;:::-;5041:48;;4138:957;;;;;:::o;5100:114::-;5184:4;5177:5;5173:16;5166:5;5163:27;5153:55;;5204:1;5201;5194:12;5219:864;5279:5;5327:4;5315:9;5310:3;5306:19;5302:30;5299:50;;;5345:1;5342;5335:12;5299:50;5378:2;5372:9;5420:4;5412:6;5408:17;5444:18;5512:6;5500:10;5497:22;5492:2;5480:10;5477:18;5474:46;5471:72;;;5523:18;;:::i;:::-;5563:10;5559:2;5552:22;5592:6;5583:15;;5634:9;5621:23;5607:37;;5667:2;5659:6;5656:14;5653:34;;;5683:1;5680;5673:12;5653:34;5711:45;5752:3;5743:6;5732:9;5728:22;5711:45;:::i;:::-;5703:6;5696:61;5810:2;5799:9;5795:18;5782:32;5766:48;;5839:2;5829:8;5826:16;5823:36;;;5855:1;5852;5845:12;5823:36;;5892:47;5935:3;5924:8;5913:9;5909:24;5892:47;:::i;:::-;5887:2;5879:6;5875:15;5868:72;;5992:2;5981:9;5977:18;5964:32;6005:31;6028:7;6005:31;:::i;:::-;6064:2;6052:15;;;;6045:32;5219:864;;-1:-1:-1;;5219:864:1:o;6088:1126::-;6171:6;6224:2;6212:9;6203:7;6199:23;6195:32;6192:52;;;6240:1;6237;6230:12;6192:52;6280:9;6267:23;6309:18;6350:2;6342:6;6339:14;6336:34;;;6366:1;6363;6356:12;6336:34;6389:22;;;;6445:6;6427:16;;;6423:29;6420:49;;;6465:1;6462;6455:12;6420:49;6491:22;;:::i;:::-;6549:2;6536:16;6529:5;6522:31;6585;6612:2;6608;6604:11;6585:31;:::i;:::-;6580:2;6573:5;6569:14;6562:55;6649:31;6676:2;6672;6668:11;6649:31;:::i;:::-;6644:2;6637:5;6633:14;6626:55;6713:45;6750:7;6745:2;6741;6737:11;6713:45;:::i;:::-;6708:2;6701:5;6697:14;6690:69;6805:3;6801:2;6797:12;6784:26;6835:2;6825:8;6822:16;6819:36;;;6851:1;6848;6841:12;6819:36;6889:59;6940:7;6929:8;6925:2;6921:17;6889:59;:::i;:::-;6882:4;6875:5;6871:16;6864:85;;6995:3;6991:2;6987:12;6974:26;7025:2;7015:8;7012:16;7009:36;;;7041:1;7038;7031:12;7009:36;7078:44;7114:7;7103:8;7099:2;7095:17;7078:44;:::i;:::-;7072:3;7061:15;;7054:69;-1:-1:-1;7177:4:1;7169:13;;;;7156:27;7150:3;7139:15;;7132:52;-1:-1:-1;7065:5:1;6088:1126;-1:-1:-1;;;6088:1126:1:o;7219:250::-;7304:1;7314:113;7328:6;7325:1;7322:13;7314:113;;;7404:11;;;7398:18;7385:11;;;7378:39;7350:2;7343:10;7314:113;;;-1:-1:-1;;7461:1:1;7443:16;;7436:27;7219:250::o;7474:271::-;7516:3;7554:5;7548:12;7581:6;7576:3;7569:19;7597:76;7666:6;7659:4;7654:3;7650:14;7643:4;7636:5;7632:16;7597:76;:::i;:::-;7727:2;7706:15;-1:-1:-1;;7702:29:1;7693:39;;;;7734:4;7689:50;;7474:271;-1:-1:-1;;7474:271:1:o;7750:734::-;-1:-1:-1;;;;;8093:15:1;;;8075:34;;8145:15;;8140:2;8125:18;;8118:43;8192:2;8177:18;;8170:34;;;8240:3;8235:2;8220:18;;8213:31;;;8018:4;;8267:46;;8293:19;;8285:6;8267:46;:::i;:::-;8362:9;8354:6;8350:22;8344:3;8333:9;8329:19;8322:51;8390:33;8416:6;8408;8390:33;:::i;:::-;8382:41;;;8472:4;8464:6;8460:17;8454:3;8443:9;8439:19;8432:46;7750:734;;;;;;;;;:::o;8489:386::-;8674:25;;;-1:-1:-1;;;;;8735:32:1;;8730:2;8715:18;;8708:60;8804:2;8799;8784:18;;8777:30;;;-1:-1:-1;;8824:45:1;;8850:18;;8842:6;8824:45;:::i;:::-;8816:53;8489:386;-1:-1:-1;;;;;8489:386:1:o;8880:458::-;8936:3;8980:5;8974:12;9007:4;9002:3;8995:17;9033:47;9074:4;9069:3;9065:14;9051:12;9033:47;:::i;:::-;9021:59;;9128:4;9121:5;9117:16;9111:23;9176:3;9170:4;9166:14;9159:4;9154:3;9150:14;9143:38;9204:39;9238:4;9222:14;9204:39;:::i;:::-;9190:53;;;9304:4;9296;9289:5;9285:16;9279:23;9275:34;9268:4;9263:3;9259:14;9252:58;9326:6;9319:13;;;8880:458;;;;:::o;9343:925::-;9448:12;;9436:25;;9507:4;9496:16;;;9490:23;-1:-1:-1;;;;;9583:21:1;;;9567:14;;;9560:45;9658:4;9647:16;;;9641:23;9637:32;;9621:14;;;9614:56;9718:4;9707:16;;;9701:23;9760:21;;9756:30;;;9740:14;;;9733:54;9824:25;9818:32;9812:3;9803:13;;;9796:55;;;;9888:15;;9882:22;9421:6;9540:3;9920:14;;9913:26;;;9393:3;;9960:61;10008:12;;;9882:22;9960:61;:::i;:::-;9948:73;;;10069:4;10062:5;10058:16;10052:23;10117:3;10111:4;10107:14;10100:4;10095:3;10091:14;10084:38;10145:39;10179:4;10163:14;10145:39;:::i;:::-;10131:53;;;10233:4;10226:5;10222:16;10216:23;10209:4;10204:3;10200:14;10193:47;10256:6;10249:13;;;9343:925;;;;:::o;10273:434::-;-1:-1:-1;;;;;10500:32:1;;10482:51;;10569:2;10564;10549:18;;10542:30;;;-1:-1:-1;;10589:53:1;;10623:18;;10615:6;10589:53;:::i;:::-;10581:61;;10692:6;10685:14;10678:22;10673:2;10662:9;10658:18;10651:50;10273:434;;;;;;:::o;11122:222::-;11187:9;;;11208:10;;;11205:133;;;11260:10;11255:3;11251:20;11248:1;11241:31;11295:4;11292:1;11285:15;11323:4;11320:1;11313:15;11205:133;11122:222;;;;:::o;11729:442::-;11783:5;11836:3;11829:4;11821:6;11817:17;11813:27;11803:55;;11854:1;11851;11844:12;11803:55;11883:6;11877:13;11914:48;11930:31;11958:2;11930:31;:::i;11914:48::-;11987:2;11978:7;11971:19;12033:3;12026:4;12021:2;12013:6;12009:15;12005:26;12002:35;11999:55;;;12050:1;12047;12040:12;11999:55;12063:77;12137:2;12130:4;12121:7;12117:18;12110:4;12102:6;12098:17;12063:77;:::i;:::-;12158:7;11729:442;-1:-1:-1;;;;11729:442:1:o;12176:686::-;12282:6;12290;12298;12351:2;12339:9;12330:7;12326:23;12322:32;12319:52;;;12367:1;12364;12357:12;12319:52;12400:9;12394:16;12429:18;12470:2;12462:6;12459:14;12456:34;;;12486:1;12483;12476:12;12456:34;12509:61;12562:7;12553:6;12542:9;12538:22;12509:61;:::i;:::-;12499:71;;12616:2;12605:9;12601:18;12595:25;12579:41;;12645:2;12635:8;12632:16;12629:36;;;12661:1;12658;12651:12;12629:36;;12684:63;12739:7;12728:8;12717:9;12713:24;12684:63;:::i;:::-;12674:73;;;12790:2;12779:9;12775:18;12769:25;12803:29;12826:5;12803:29;:::i;:::-;12851:5;12841:15;;;12176:686;;;;;:::o;12867:256::-;13044:2;13033:9;13026:21;13007:4;13064:53;13113:2;13102:9;13098:18;13090:6;13064:53;:::i;13128:459::-;13388:1;13384;13379:3;13375:11;13371:19;13363:6;13359:32;13348:9;13341:51;13428:6;13423:2;13412:9;13408:18;13401:34;13471:6;13466:2;13455:9;13451:18;13444:34;13514:3;13509:2;13498:9;13494:18;13487:31;13322:4;13535:46;13576:3;13565:9;13561:19;13553:6;13535:46;:::i;:::-;13527:54;13128:459;-1:-1:-1;;;;;;13128:459:1:o;13592:287::-;13721:3;13759:6;13753:13;13775:66;13834:6;13829:3;13822:4;13814:6;13810:17;13775:66;:::i;:::-;13857:16;;;;;13592:287;-1:-1:-1;;13592:287:1:o;13884:353::-;-1:-1:-1;;;;;14089:32:1;;14071:51;;14158:2;14153;14138:18;;14131:30;;;-1:-1:-1;;14178:53:1;;14212:18;;14204:6;14178:53;:::i
Swarm Source
ipfs://071f293f0889e0a2eb9d2f365f2a854d8bcc718aa5578d5397acf4542ef43306
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.