Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 22130836 | 350 days ago | 0.00603636 ETH | ||||
| Transfer | 22125268 | 351 days ago | 0.00021029 ETH | ||||
| Transfer | 22125268 | 351 days ago | 0.00092733 ETH | ||||
| Transfer | 22125268 | 351 days ago | 0.00009265 ETH | ||||
| Transfer | 22059745 | 360 days ago | 0.00017157 ETH | ||||
| Transfer | 22059745 | 360 days ago | 0.00008061 ETH | ||||
| Transfer | 22059199 | 360 days ago | 0.00028268 ETH | ||||
| Deposit | 22059023 | 360 days ago | 0.001 ETH | ||||
| Transfer | 22059023 | 360 days ago | 0.00034705 ETH | ||||
| Transfer | 22058991 | 360 days ago | 0.00030348 ETH | ||||
| Transfer | 22058991 | 360 days ago | 0.00097097 ETH | ||||
| Transfer | 22058991 | 360 days ago | 0.00009979 ETH | ||||
| Deposit | 22057578 | 360 days ago | 0.001 ETH | ||||
| Transfer | 22057578 | 360 days ago | 0.00030781 ETH | ||||
| Transfer | 22052802 | 361 days ago | 0.00028778 ETH | ||||
| Transfer | 22052802 | 361 days ago | 0.00099401 ETH | ||||
| Transfer | 22052802 | 361 days ago | 0.00008764 ETH | ||||
| Deposit | 22052495 | 361 days ago | 0.001 ETH | ||||
| Transfer | 22052495 | 361 days ago | 0.00028297 ETH | ||||
| Transfer | 22052320 | 361 days ago | 0.00027753 ETH | ||||
| Transfer | 22052320 | 361 days ago | 0.00099401 ETH | ||||
| Transfer | 22052320 | 361 days ago | 0.00008932 ETH | ||||
| Deposit | 22052232 | 361 days ago | 0.001 ETH | ||||
| Transfer | 22052232 | 361 days ago | 0.00028272 ETH | ||||
| Transfer | 22051821 | 361 days ago | 0.00018502 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PlantMeWalletV1
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity = 0.8.28; //import the SafeERC20 interface import "@openzeppelin/[email protected]/token/ERC20/utils/SafeERC20.sol"; interface plantmeWalletInternal { // WETH function deposit() external payable; function withdraw(uint wad) external payable; // PlantMe Router function plantmeRouter() external view returns (address); function nativeCoin() external view returns (address); function emergencyWallet() external view returns (address); } // individual contract wallet contract PlantMeWalletV1 { mapping(address => bool) private owners; address public admin; address public plantmeRouter; address public wrappedNativeCoin; uint256 public maxBrideFee; bool internal initialized; bool internal locked = false; // Reentrancy Guard bool public isTradingLock; // Initialize PlantMeWallet function initialize(address[] calldata _owner, address _admin, address _plantmeRouter, uint _maxBrideFee) external { require(!initialized, "already initialized"); require(_plantmeRouter == plantmeWalletInternal(_plantmeRouter).plantmeRouter(), "router not matched"); initialized = true; for (uint i = 0; i < _owner.length; ++i) { owners[_owner[i]] = true; } admin = _admin; plantmeRouter = _plantmeRouter; wrappedNativeCoin = plantmeWalletInternal(_plantmeRouter).nativeCoin(); maxBrideFee = _maxBrideFee; emit Owners(_owner); } receive() payable external {} using SafeERC20 for IERC20; event Owners(address[] indexed owner); event UpdateMaxBrideFee(uint maxBrideFee); event TransferSent(address indexed from, address indexed to, uint amount); event TradingLocked(bool isTradingLock); modifier noReentrant() { require(!locked, "No re-entrancy"); locked = true; _; locked = false; } modifier onlyOwner() { require(owners[msg.sender], "not owner"); _; } modifier onlyAdmin() { require(admin == msg.sender, "not admin"); _; } modifier onlyplantmeRouter() { require(plantmeRouter == msg.sender, "not plantme router"); _; } error exceed_amount_input(); /** * gas cost */ function transactionFee(uint256 gasCost, address caller) external noReentrant onlyplantmeRouter { require(admin == caller, "not authorized"); require(gasCost <= address(this).balance, "insufficient gas cost"); (bool sentGas,) = payable(caller).call{value: gasCost}(""); require(sentGas, "fail to send gas"); } /** * transfer to pool */ function transferTo(uint256 amount, address[3] calldata addr) external noReentrant onlyplantmeRouter { require(!isTradingLock, "locked"); require(admin == addr[2], "not authorized"); if (addr[0] == wrappedNativeCoin) { if (amount > address(this).balance) revert exceed_amount_input(); plantmeWalletInternal(wrappedNativeCoin).deposit{value: amount}(); // wrap } else { if (amount > IERC20(addr[0]).balanceOf(address(this))) revert exceed_amount_input(); } IERC20(addr[0]).safeTransfer(addr[1], amount); } /** * pay a tip to block validator directly. * unwrap for the wrapped native coin. */ function brideFee(uint256 amount, uint256 tip, address[2] calldata addr) external noReentrant onlyplantmeRouter { require(admin == addr[0], "not authorized"); require(tip < maxBrideFee, "exceed maxBrideFee"); // unwrap if (addr[1] == wrappedNativeCoin) plantmeWalletInternal(wrappedNativeCoin).withdraw(amount); if (tip == 0) return; // set 50% of native coin balance if the tip is insufficient if (tip > address(this).balance) tip = address(this).balance * 50 / 100; // send the tip to the validator (bool sentTip,) = block.coinbase.call{value: tip}(""); require(sentTip, "fail to send tip"); } /** * transfer native coin */ function transferNativeCoinToOwner(uint256 amount, address to) external noReentrant { address helper = plantmeWalletInternal(plantmeRouter).emergencyWallet(); require(owners[msg.sender] || admin == msg.sender || helper == msg.sender, "not authorized"); require(amount <= address(this).balance, "exceed amount input"); // Checks require(owners[to], "not recipient"); (bool sent,) = payable(to).call{value: amount}(""); // Interaction require(sent, "failed to send"); emit TransferSent(address(this), to, amount); } /** * transfer ERC-20 token */ function transferERC20TokenToOwner(address token, uint256 amount, address to) external noReentrant { address helper = plantmeWalletInternal(plantmeRouter).emergencyWallet(); require(owners[msg.sender] || admin == msg.sender || helper == msg.sender, "not authorized"); require(amount <= IERC20(token).balanceOf(address(this)), "exceed amount input"); require(owners[to], "not recipient"); IERC20(token).safeTransfer(to, amount); emit TransferSent(address(this), to, amount); } function isOwner(address account) external view returns (bool) { return owners[account]; } function updateMaxBrideFee(uint256 _fee) external onlyAdmin { maxBrideFee = _fee; emit UpdateMaxBrideFee(_fee); } function updateplantmeRouter() external onlyAdmin { address new_plantmeRouter = plantmeWalletInternal(plantmeRouter).plantmeRouter(); require(new_plantmeRouter != plantmeRouter, "no update available"); plantmeRouter = new_plantmeRouter; } function updateNativeCoin() external onlyAdmin { address new_nativeCoin = plantmeWalletInternal(plantmeRouter).nativeCoin(); require(new_nativeCoin != wrappedNativeCoin, "no update available"); wrappedNativeCoin = new_nativeCoin; } /** * Unable to trade indefinitely, but transfers to the owner’s wallet are allowed. */ function emergencyLock() external onlyAdmin { isTradingLock = true; emit TradingLocked(isTradingLock); } /** * To be used when the owner wallets are lost. */ function emergencyNativeCoinWithdrawal() external onlyAdmin { require(address(this).balance > 0, "insufficient fund"); address emergencyWallet = plantmeWalletInternal(plantmeRouter).emergencyWallet(); (bool sent,) = payable(emergencyWallet).call{value: address(this).balance}(""); require(sent, "failed to send"); emit TransferSent(address(this), emergencyWallet, address(this).balance); } }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
import {Address} from "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @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.encodeCall(token.transfer, (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.encodeCall(token.transferFrom, (from, to, 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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @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.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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 silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert Errors.FailedCall();
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {Errors.FailedCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
* of an unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {Errors.FailedCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
*/
function _revert(bytes memory returndata) 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
assembly ("memory-safe") {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.FailedCall();
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of common custom errors used in multiple contracts
*
* IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
* It is recommended to avoid relying on the error API for critical functionality.
*
* _Available since v5.1._
*/
library Errors {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error InsufficientBalance(uint256 balance, uint256 needed);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedCall();
/**
* @dev The deployment failed.
*/
error FailedDeployment();
/**
* @dev A necessary precompile is missing.
*/
error MissingPrecompile(address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* 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[ERC 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);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"exceed_amount_input","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"owner","type":"address[]"}],"name":"Owners","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isTradingLock","type":"bool"}],"name":"TradingLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxBrideFee","type":"uint256"}],"name":"UpdateMaxBrideFee","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tip","type":"uint256"},{"internalType":"address[2]","name":"addr","type":"address[2]"}],"name":"brideFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyNativeCoinWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owner","type":"address[]"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_plantmeRouter","type":"address"},{"internalType":"uint256","name":"_maxBrideFee","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBrideFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plantmeRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasCost","type":"uint256"},{"internalType":"address","name":"caller","type":"address"}],"name":"transactionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"transferERC20TokenToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"transferNativeCoinToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[3]","name":"addr","type":"address[3]"}],"name":"transferTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateMaxBrideFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateNativeCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateplantmeRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNativeCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526005805461ff00191690553480156019575f5ffd5b5061195b806100275f395ff3fe6080604052600436106100fd575f3560e01c806379b4775911610092578063dc76d0ef11610062578063dc76d0ef146102ad578063f256990f146102c1578063f30e4c02146102e0578063f832a61e146102f4578063f851a44014610317575f5ffd5b806379b477591461023c5780637fad46f21461025b57806398157eb11461027a578063d9c693cb14610299575f5ffd5b806353e9546e116100cd57806353e9546e146101c0578063543a6f34146101df578063573a3767146101fe5780636e3fa0861461021d575f5ffd5b806311cc1ad614610108578063249a1b6e146101445780632f54bf6e146101655780634bd77f75146101ac575f5ffd5b3661010457005b5f5ffd5b348015610113575f5ffd5b50600354610127906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014f575f5ffd5b5061016361015e366004611611565b610336565b005b348015610170575f5ffd5b5061019c61017f36600461163f565b6001600160a01b03165f9081526020819052604090205460ff1690565b604051901515815260200161013b565b3480156101b7575f5ffd5b506101636105b9565b3480156101cb575f5ffd5b506101636101da366004611661565b6106c7565b3480156101ea575f5ffd5b50600254610127906001600160a01b031681565b348015610209575f5ffd5b50610163610218366004611611565b61092d565b348015610228575f5ffd5b5060055461019c9062010000900460ff1681565b348015610247575f5ffd5b50610163610256366004611691565b610aa5565b348015610266575f5ffd5b506101636102753660046116d0565b610cf3565b348015610285575f5ffd5b50610163610294366004611767565b610f59565b3480156102a4575f5ffd5b50610163610fbe565b3480156102b8575f5ffd5b5061016361103f565b3480156102cc575f5ffd5b506101636102db36600461177e565b61114d565b3480156102eb575f5ffd5b50610163611373565b3480156102ff575f5ffd5b5061030960045481565b60405190815260200161013b565b348015610322575f5ffd5b50600154610127906001600160a01b031681565b600554610100900460ff16156103675760405162461bcd60e51b815260040161035e906117b7565b60405180910390fd5b6005805461ff0019166101001790556002546040805163c6a1abd560e01b815290515f926001600160a01b03169163c6a1abd59160048083019260209291908290030181865afa1580156103bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e191906117df565b335f9081526020819052604090205490915060ff168061040b57506001546001600160a01b031633145b8061041e57506001600160a01b03811633145b61043a5760405162461bcd60e51b815260040161035e906117fa565b478311156104805760405162461bcd60e51b8152602060048201526013602482015272195e18d9595908185b5bdd5b9d081a5b9c1d5d606a1b604482015260640161035e565b6001600160a01b0382165f9081526020819052604090205460ff166104d75760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081c9958da5c1a595b9d609a1b604482015260640161035e565b5f826001600160a01b0316846040515f6040518083038185875af1925050503d805f8114610520576040519150601f19603f3d011682016040523d82523d5f602084013e610525565b606091505b50509050806105675760405162461bcd60e51b815260206004820152600e60248201526d19985a5b1959081d1bc81cd95b9960921b604482015260640161035e565b6040518481526001600160a01b0384169030907ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e906020015b60405180910390a350506005805461ff00191690555050565b6001546001600160a01b031633146105e35760405162461bcd60e51b815260040161035e90611822565b6002546040805163167b78cd60e01b815290515f926001600160a01b03169163167b78cd9160048083019260209291908290030181865afa15801561062a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064e91906117df565b6003549091506001600160a01b03908116908216036106a55760405162461bcd60e51b81526020600482015260136024820152726e6f2075706461746520617661696c61626c6560681b604482015260640161035e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff16156106ef5760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546001600160a01b031633146107285760405162461bcd60e51b815260040161035e90611845565b60055462010000900460ff161561076a5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640161035e565b61077a606082016040830161163f565b6001546001600160a01b039081169116146107a75760405162461bcd60e51b815260040161035e906117fa565b6003546001600160a01b03166107c0602083018361163f565b6001600160a01b03160361085857478211156107ef5760405163d0070ad160e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b15801561083c575f5ffd5b505af115801561084e573d5f5f3e3d5ffd5b50505050506108ed565b610865602082018261163f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156108a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd9190611885565b8211156108ed5760405163d0070ad160e01b815260040160405180910390fd5b61091e610900604083016020840161163f565b8361090e602085018561163f565b6001600160a01b03169190611521565b50506005805461ff0019169055565b600554610100900460ff16156109555760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546001600160a01b0316331461098e5760405162461bcd60e51b815260040161035e90611845565b6001546001600160a01b038281169116146109bb5760405162461bcd60e51b815260040161035e906117fa565b47821115610a035760405162461bcd60e51b81526020600482015260156024820152741a5b9cdd59999a58da595b9d0819d85cc818dbdcdd605a1b604482015260640161035e565b5f816001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610a4c576040519150601f19603f3d011682016040523d82523d5f602084013e610a51565b606091505b5050905080610a955760405162461bcd60e51b815260206004820152601060248201526f6661696c20746f2073656e642067617360801b604482015260640161035e565b50506005805461ff001916905550565b600554610100900460ff1615610acd5760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546040805163c6a1abd560e01b815290515f926001600160a01b03169163c6a1abd59160048083019260209291908290030181865afa158015610b23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4791906117df565b335f9081526020819052604090205490915060ff1680610b7157506001546001600160a01b031633145b80610b8457506001600160a01b03811633145b610ba05760405162461bcd60e51b815260040161035e906117fa565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610be2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c069190611885565b831115610c4b5760405162461bcd60e51b8152602060048201526013602482015272195e18d9595908185b5bdd5b9d081a5b9c1d5d606a1b604482015260640161035e565b6001600160a01b0382165f9081526020819052604090205460ff16610ca25760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081c9958da5c1a595b9d609a1b604482015260640161035e565b610cb66001600160a01b0385168385611521565b6040518381526001600160a01b0383169030907ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e906020016105a0565b60055460ff1615610d3c5760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161035e565b816001600160a01b031663543a6f346040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9c91906117df565b6001600160a01b0316826001600160a01b031614610df15760405162461bcd60e51b81526020600482015260126024820152711c9bdd5d195c881b9bdd081b585d18da195960721b604482015260640161035e565b6005805460ff191660011790555f5b84811015610e625760015f5f888885818110610e1e57610e1e611871565b9050602002016020810190610e33919061163f565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610e00565b50600180546001600160a01b038086166001600160a01b0319928316179092556002805492851692909116821790556040805163167b78cd60e01b8152905163167b78cd916004808201926020929091908290030181865afa158015610eca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eee91906117df565b600380546001600160a01b0319166001600160a01b03929092169190911790556004819055604051610f23908690869061189c565b604051908190038120907f89a67d0805f0cd96f424b9ce47f8c6dd7840a4b70d6ab1facf3d14fc57da3a57905f90a25050505050565b6001546001600160a01b03163314610f835760405162461bcd60e51b815260040161035e90611822565b60048190556040518181527f4f96797d361771f654806d3100b37f604d269032fda4050026090da16f54496e9060200160405180910390a150565b6001546001600160a01b03163314610fe85760405162461bcd60e51b815260040161035e90611822565b6005805462ff0000191662010000908117918290556040517fb8f645309dabc1ecb55762c0f4908acec9d7a6142bc62cbb98719c31fc18b61f9261103592900460ff161515815260200190565b60405180910390a1565b6001546001600160a01b031633146110695760405162461bcd60e51b815260040161035e90611822565b6002546040805163150e9bcd60e21b815290515f926001600160a01b03169163543a6f349160048083019260209291908290030181865afa1580156110b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110d491906117df565b6002549091506001600160a01b039081169082160361112b5760405162461bcd60e51b81526020600482015260136024820152726e6f2075706461746520617661696c61626c6560681b604482015260640161035e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff16156111755760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546001600160a01b031633146111ae5760405162461bcd60e51b815260040161035e90611845565b6111bb602082018261163f565b6001546001600160a01b039081169116146111e85760405162461bcd60e51b815260040161035e906117fa565b600454821061122e5760405162461bcd60e51b8152602060048201526012602482015271657863656564206d6178427269646546656560701b604482015260640161035e565b6003546001600160a01b031661124a604083016020840161163f565b6001600160a01b0316036112b257600354604051632e1a7d4d60e01b8152600481018590526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b15801561129b575f5ffd5b505af11580156112ad573d5f5f3e3d5ffd5b505050505b8115610a9557478211156112da5760646112cd4760326118dd565b6112d79190611906565b91505b6040515f90419084908381818185875af1925050503d805f8114611319576040519150601f19603f3d011682016040523d82523d5f602084013e61131e565b606091505b50509050806113625760405162461bcd60e51b815260206004820152601060248201526f06661696c20746f2073656e64207469760841b604482015260640161035e565b5050506005805461ff001916905550565b6001546001600160a01b0316331461139d5760405162461bcd60e51b815260040161035e90611822565b5f47116113e05760405162461bcd60e51b81526020600482015260116024820152701a5b9cdd59999a58da595b9d08199d5b99607a1b604482015260640161035e565b6002546040805163c6a1abd560e01b815290515f926001600160a01b03169163c6a1abd59160048083019260209291908290030181865afa158015611427573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144b91906117df565b90505f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611496576040519150601f19603f3d011682016040523d82523d5f602084013e61149b565b606091505b50509050806114dd5760405162461bcd60e51b815260206004820152600e60248201526d19985a5b1959081d1bc81cd95b9960921b604482015260640161035e565b6040514781526001600160a01b0383169030907ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e9060200160405180910390a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611573908490611578565b505050565b5f5f60205f8451602086015f885af180611597576040513d5f823e3d81fd5b50505f513d915081156115ae5780600114156115bb565b6001600160a01b0384163b155b156115e457604051635274afe760e01b81526001600160a01b038516600482015260240161035e565b50505050565b6001600160a01b03811681146115fe575f5ffd5b50565b803561160c816115ea565b919050565b5f5f60408385031215611622575f5ffd5b823591506020830135611634816115ea565b809150509250929050565b5f6020828403121561164f575f5ffd5b813561165a816115ea565b9392505050565b5f5f60808385031215611672575f5ffd5b8235915060808301841015611685575f5ffd5b50926020919091019150565b5f5f5f606084860312156116a3575f5ffd5b83356116ae816115ea565b92506020840135915060408401356116c5816115ea565b809150509250925092565b5f5f5f5f5f608086880312156116e4575f5ffd5b853567ffffffffffffffff8111156116fa575f5ffd5b8601601f8101881361170a575f5ffd5b803567ffffffffffffffff811115611720575f5ffd5b8860208260051b8401011115611734575f5ffd5b602091820196509450611748908701611601565b925061175660408701611601565b949793965091946060013592915050565b5f60208284031215611777575f5ffd5b5035919050565b5f5f5f60808486031215611790575f5ffd5b8335925060208401359150608084018510156117aa575f5ffd5b6040840190509250925092565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b5f602082840312156117ef575f5ffd5b815161165a816115ea565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b6020808252601290820152713737ba10383630b73a36b2903937baba32b960711b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611895575f5ffd5b5051919050565b5f8184825b858110156118d25781356118b4816115ea565b6001600160a01b0316835260209283019291909101906001016118a1565b509095945050505050565b808202811582820484141761190057634e487b7160e01b5f52601160045260245ffd5b92915050565b5f8261192057634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220f9b1e4e39224c7b78607e148ad15e8186fa72f3d51f4706b8e5f7f9a3d28fc9564736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106100fd575f3560e01c806379b4775911610092578063dc76d0ef11610062578063dc76d0ef146102ad578063f256990f146102c1578063f30e4c02146102e0578063f832a61e146102f4578063f851a44014610317575f5ffd5b806379b477591461023c5780637fad46f21461025b57806398157eb11461027a578063d9c693cb14610299575f5ffd5b806353e9546e116100cd57806353e9546e146101c0578063543a6f34146101df578063573a3767146101fe5780636e3fa0861461021d575f5ffd5b806311cc1ad614610108578063249a1b6e146101445780632f54bf6e146101655780634bd77f75146101ac575f5ffd5b3661010457005b5f5ffd5b348015610113575f5ffd5b50600354610127906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014f575f5ffd5b5061016361015e366004611611565b610336565b005b348015610170575f5ffd5b5061019c61017f36600461163f565b6001600160a01b03165f9081526020819052604090205460ff1690565b604051901515815260200161013b565b3480156101b7575f5ffd5b506101636105b9565b3480156101cb575f5ffd5b506101636101da366004611661565b6106c7565b3480156101ea575f5ffd5b50600254610127906001600160a01b031681565b348015610209575f5ffd5b50610163610218366004611611565b61092d565b348015610228575f5ffd5b5060055461019c9062010000900460ff1681565b348015610247575f5ffd5b50610163610256366004611691565b610aa5565b348015610266575f5ffd5b506101636102753660046116d0565b610cf3565b348015610285575f5ffd5b50610163610294366004611767565b610f59565b3480156102a4575f5ffd5b50610163610fbe565b3480156102b8575f5ffd5b5061016361103f565b3480156102cc575f5ffd5b506101636102db36600461177e565b61114d565b3480156102eb575f5ffd5b50610163611373565b3480156102ff575f5ffd5b5061030960045481565b60405190815260200161013b565b348015610322575f5ffd5b50600154610127906001600160a01b031681565b600554610100900460ff16156103675760405162461bcd60e51b815260040161035e906117b7565b60405180910390fd5b6005805461ff0019166101001790556002546040805163c6a1abd560e01b815290515f926001600160a01b03169163c6a1abd59160048083019260209291908290030181865afa1580156103bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e191906117df565b335f9081526020819052604090205490915060ff168061040b57506001546001600160a01b031633145b8061041e57506001600160a01b03811633145b61043a5760405162461bcd60e51b815260040161035e906117fa565b478311156104805760405162461bcd60e51b8152602060048201526013602482015272195e18d9595908185b5bdd5b9d081a5b9c1d5d606a1b604482015260640161035e565b6001600160a01b0382165f9081526020819052604090205460ff166104d75760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081c9958da5c1a595b9d609a1b604482015260640161035e565b5f826001600160a01b0316846040515f6040518083038185875af1925050503d805f8114610520576040519150601f19603f3d011682016040523d82523d5f602084013e610525565b606091505b50509050806105675760405162461bcd60e51b815260206004820152600e60248201526d19985a5b1959081d1bc81cd95b9960921b604482015260640161035e565b6040518481526001600160a01b0384169030907ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e906020015b60405180910390a350506005805461ff00191690555050565b6001546001600160a01b031633146105e35760405162461bcd60e51b815260040161035e90611822565b6002546040805163167b78cd60e01b815290515f926001600160a01b03169163167b78cd9160048083019260209291908290030181865afa15801561062a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064e91906117df565b6003549091506001600160a01b03908116908216036106a55760405162461bcd60e51b81526020600482015260136024820152726e6f2075706461746520617661696c61626c6560681b604482015260640161035e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff16156106ef5760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546001600160a01b031633146107285760405162461bcd60e51b815260040161035e90611845565b60055462010000900460ff161561076a5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640161035e565b61077a606082016040830161163f565b6001546001600160a01b039081169116146107a75760405162461bcd60e51b815260040161035e906117fa565b6003546001600160a01b03166107c0602083018361163f565b6001600160a01b03160361085857478211156107ef5760405163d0070ad160e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b15801561083c575f5ffd5b505af115801561084e573d5f5f3e3d5ffd5b50505050506108ed565b610865602082018261163f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156108a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd9190611885565b8211156108ed5760405163d0070ad160e01b815260040160405180910390fd5b61091e610900604083016020840161163f565b8361090e602085018561163f565b6001600160a01b03169190611521565b50506005805461ff0019169055565b600554610100900460ff16156109555760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546001600160a01b0316331461098e5760405162461bcd60e51b815260040161035e90611845565b6001546001600160a01b038281169116146109bb5760405162461bcd60e51b815260040161035e906117fa565b47821115610a035760405162461bcd60e51b81526020600482015260156024820152741a5b9cdd59999a58da595b9d0819d85cc818dbdcdd605a1b604482015260640161035e565b5f816001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610a4c576040519150601f19603f3d011682016040523d82523d5f602084013e610a51565b606091505b5050905080610a955760405162461bcd60e51b815260206004820152601060248201526f6661696c20746f2073656e642067617360801b604482015260640161035e565b50506005805461ff001916905550565b600554610100900460ff1615610acd5760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546040805163c6a1abd560e01b815290515f926001600160a01b03169163c6a1abd59160048083019260209291908290030181865afa158015610b23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4791906117df565b335f9081526020819052604090205490915060ff1680610b7157506001546001600160a01b031633145b80610b8457506001600160a01b03811633145b610ba05760405162461bcd60e51b815260040161035e906117fa565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610be2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c069190611885565b831115610c4b5760405162461bcd60e51b8152602060048201526013602482015272195e18d9595908185b5bdd5b9d081a5b9c1d5d606a1b604482015260640161035e565b6001600160a01b0382165f9081526020819052604090205460ff16610ca25760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081c9958da5c1a595b9d609a1b604482015260640161035e565b610cb66001600160a01b0385168385611521565b6040518381526001600160a01b0383169030907ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e906020016105a0565b60055460ff1615610d3c5760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161035e565b816001600160a01b031663543a6f346040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9c91906117df565b6001600160a01b0316826001600160a01b031614610df15760405162461bcd60e51b81526020600482015260126024820152711c9bdd5d195c881b9bdd081b585d18da195960721b604482015260640161035e565b6005805460ff191660011790555f5b84811015610e625760015f5f888885818110610e1e57610e1e611871565b9050602002016020810190610e33919061163f565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610e00565b50600180546001600160a01b038086166001600160a01b0319928316179092556002805492851692909116821790556040805163167b78cd60e01b8152905163167b78cd916004808201926020929091908290030181865afa158015610eca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eee91906117df565b600380546001600160a01b0319166001600160a01b03929092169190911790556004819055604051610f23908690869061189c565b604051908190038120907f89a67d0805f0cd96f424b9ce47f8c6dd7840a4b70d6ab1facf3d14fc57da3a57905f90a25050505050565b6001546001600160a01b03163314610f835760405162461bcd60e51b815260040161035e90611822565b60048190556040518181527f4f96797d361771f654806d3100b37f604d269032fda4050026090da16f54496e9060200160405180910390a150565b6001546001600160a01b03163314610fe85760405162461bcd60e51b815260040161035e90611822565b6005805462ff0000191662010000908117918290556040517fb8f645309dabc1ecb55762c0f4908acec9d7a6142bc62cbb98719c31fc18b61f9261103592900460ff161515815260200190565b60405180910390a1565b6001546001600160a01b031633146110695760405162461bcd60e51b815260040161035e90611822565b6002546040805163150e9bcd60e21b815290515f926001600160a01b03169163543a6f349160048083019260209291908290030181865afa1580156110b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110d491906117df565b6002549091506001600160a01b039081169082160361112b5760405162461bcd60e51b81526020600482015260136024820152726e6f2075706461746520617661696c61626c6560681b604482015260640161035e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff16156111755760405162461bcd60e51b815260040161035e906117b7565b6005805461ff0019166101001790556002546001600160a01b031633146111ae5760405162461bcd60e51b815260040161035e90611845565b6111bb602082018261163f565b6001546001600160a01b039081169116146111e85760405162461bcd60e51b815260040161035e906117fa565b600454821061122e5760405162461bcd60e51b8152602060048201526012602482015271657863656564206d6178427269646546656560701b604482015260640161035e565b6003546001600160a01b031661124a604083016020840161163f565b6001600160a01b0316036112b257600354604051632e1a7d4d60e01b8152600481018590526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b15801561129b575f5ffd5b505af11580156112ad573d5f5f3e3d5ffd5b505050505b8115610a9557478211156112da5760646112cd4760326118dd565b6112d79190611906565b91505b6040515f90419084908381818185875af1925050503d805f8114611319576040519150601f19603f3d011682016040523d82523d5f602084013e61131e565b606091505b50509050806113625760405162461bcd60e51b815260206004820152601060248201526f06661696c20746f2073656e64207469760841b604482015260640161035e565b5050506005805461ff001916905550565b6001546001600160a01b0316331461139d5760405162461bcd60e51b815260040161035e90611822565b5f47116113e05760405162461bcd60e51b81526020600482015260116024820152701a5b9cdd59999a58da595b9d08199d5b99607a1b604482015260640161035e565b6002546040805163c6a1abd560e01b815290515f926001600160a01b03169163c6a1abd59160048083019260209291908290030181865afa158015611427573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144b91906117df565b90505f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611496576040519150601f19603f3d011682016040523d82523d5f602084013e61149b565b606091505b50509050806114dd5760405162461bcd60e51b815260206004820152600e60248201526d19985a5b1959081d1bc81cd95b9960921b604482015260640161035e565b6040514781526001600160a01b0383169030907ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e9060200160405180910390a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611573908490611578565b505050565b5f5f60205f8451602086015f885af180611597576040513d5f823e3d81fd5b50505f513d915081156115ae5780600114156115bb565b6001600160a01b0384163b155b156115e457604051635274afe760e01b81526001600160a01b038516600482015260240161035e565b50505050565b6001600160a01b03811681146115fe575f5ffd5b50565b803561160c816115ea565b919050565b5f5f60408385031215611622575f5ffd5b823591506020830135611634816115ea565b809150509250929050565b5f6020828403121561164f575f5ffd5b813561165a816115ea565b9392505050565b5f5f60808385031215611672575f5ffd5b8235915060808301841015611685575f5ffd5b50926020919091019150565b5f5f5f606084860312156116a3575f5ffd5b83356116ae816115ea565b92506020840135915060408401356116c5816115ea565b809150509250925092565b5f5f5f5f5f608086880312156116e4575f5ffd5b853567ffffffffffffffff8111156116fa575f5ffd5b8601601f8101881361170a575f5ffd5b803567ffffffffffffffff811115611720575f5ffd5b8860208260051b8401011115611734575f5ffd5b602091820196509450611748908701611601565b925061175660408701611601565b949793965091946060013592915050565b5f60208284031215611777575f5ffd5b5035919050565b5f5f5f60808486031215611790575f5ffd5b8335925060208401359150608084018510156117aa575f5ffd5b6040840190509250925092565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b5f602082840312156117ef575f5ffd5b815161165a816115ea565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b6020808252601290820152713737ba10383630b73a36b2903937baba32b960711b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611895575f5ffd5b5051919050565b5f8184825b858110156118d25781356118b4816115ea565b6001600160a01b0316835260209283019291909101906001016118a1565b509095945050505050565b808202811582820484141761190057634e487b7160e01b5f52601160045260245ffd5b92915050565b5f8261192057634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220f9b1e4e39224c7b78607e148ad15e8186fa72f3d51f4706b8e5f7f9a3d28fc9564736f6c634300081c0033
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.