Contract
0xc0D822920B70A3006026A4b26c231BCeD932A6DD
6
Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 6 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x46b4d2060f25cd01fa3114f3b71761119bb41f58ac0a730db7d1eb3f1dce58b2 | 25612160 | 10 hrs 57 mins ago | 0xc0d822920b70a3006026a4b26c231bced932a6dd | Contract Creation | 0 AVAX | ||
0xba1abdaf8aa8df4def235db1279af28aa1f15b2a4eb90380ede05ee5c49c1694 | 25612113 | 10 hrs 59 mins ago | 0xc0d822920b70a3006026a4b26c231bced932a6dd | Contract Creation | 0 AVAX | ||
0xa4973da6877e7d3ea827bab0b0b59ec1883fc87800475d1019d1aae4ba4fdd3b | 25612084 | 11 hrs ago | 0xc0d822920b70a3006026a4b26c231bced932a6dd | Contract Creation | 0 AVAX | ||
0x9e50987b0b6126bd432ea3c14a3123f415f3b789fefc82cc1201c2731318a5e6 | 25612060 | 11 hrs 1 min ago | 0xc0d822920b70a3006026a4b26c231bced932a6dd | Contract Creation | 0 AVAX | ||
0xf8a244dc7f707afdd20633a8a976409bbd2a7cda4a1cd78beac883bf7cf6b0e3 | 25611518 | 11 hrs 19 mins ago | 0xc0d822920b70a3006026a4b26c231bced932a6dd | Contract Creation | 0 AVAX | ||
0x367e16d1d9643d3d1bdbc0c780ae3fb72f199d7cbaddd12c9c9b3b6b1829fc0d | 25396749 | 5 days 12 hrs ago | 0xc0d822920b70a3006026a4b26c231bced932a6dd | Contract Creation | 0 AVAX |
[ Download CSV Export ]
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 Source Code Verified (Exact Match)
Contract Name:
SwapFactory
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create(0, 0x09, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create2(0, 0x09, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(add(ptr, 0x38), deployer) mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff) mstore(add(ptr, 0x14), implementation) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73) mstore(add(ptr, 0x58), salt) mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37)) predicted := keccak256(add(ptr, 0x43), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ 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]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } 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)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } 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"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } 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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./errors.sol"; import {IDefiOp} from "./interfaces/IDefiOp.sol"; abstract contract DefiOp is IDefiOp { using SafeERC20 for IERC20; address public owner; address public factory; function init(address owner_) external { if (owner != address(0)) { revert AlreadyInitialised(); } owner = owner_; factory = msg.sender; _postInit(); } function _postInit() internal virtual {} /** * @notice Withdraw ERC20 to owner * @dev This function withdraw all token amount to owner address * @param token ERC20 token address */ function withdrawERC20(address token) external onlyOwner { _withdrawERC20(IERC20(token)); } /** * @notice Withdraw native coin to owner (e.g ETH, AVAX, ...) * @dev This function withdraw all native coins to owner address */ function withdrawNative() public onlyOwner { _withdrawETH(); } receive() external payable {} // internal functions function _withdrawERC20(IERC20 token) internal { uint256 tokenAmount = token.balanceOf(address(this)); if (tokenAmount > 0) { token.safeTransfer(owner, tokenAmount); } } function _withdrawETH() internal { uint256 balance = address(this).balance; if (balance > 0) { (bool success, ) = owner.call{value: balance}(""); require(success, "Transfer failed"); } } modifier onlyOwner() { if (msg.sender != owner) revert OnlyOwner(); _; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; // common error AlreadyInitialised(); error OnlyOwner(); error NotEnougthNativeBalance(uint256 balance, uint256 requiredBalance); error NotEnougthBalance( uint256 balance, uint256 requiredBalance, address token ); error UnsupportedToken(); // bridges error CannotBridgeToSameNetwork(); error UnsupportedDestinationChain(uint64 chainId);
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; interface IDefiOp { function init(address owner_) external; function withdrawERC20(address token) external; function withdrawNative() external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; interface ISwapFactory { function isTokenWhitelisted(address token) external view returns (bool); function whitelistedTokens() external view returns (address[] memory); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; import "@openzeppelin/contracts/proxy/Clones.sol"; import {IDefiOp} from "./interfaces/IDefiOp.sol"; contract OpFactory { address public immutable opImplementation; event OpCreated(address owner, address opContract); constructor(address opImplementation_) { opImplementation = opImplementation_; } function getOpFor(address wallet) external view returns (address op) { op = Clones.predictDeterministicAddress( opImplementation, keccak256(abi.encodePacked(wallet)), address(this) ); } function createOp() external { createOpFor(msg.sender); } function createOpFor(address owner) public { address op = Clones.cloneDeterministic( opImplementation, keccak256(abi.encodePacked(owner)) ); IDefiOp(op).init(owner); emit OpCreated(owner, op); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../errors.sol"; import {ISwapFactory} from "../interfaces/ISwapFactory.sol"; import {OpFactory} from "../OpFactory.sol"; import {DefiOp} from "../DefiOp.sol"; contract SwapFactory is ISwapFactory, OpFactory { using EnumerableSet for EnumerableSet.AddressSet; address immutable OWNER; EnumerableSet.AddressSet private _whitelistedTokens; constructor( address opImplementation_, address[] memory initiallyWhitelistedTokens, address owner ) OpFactory(opImplementation_) { OWNER = owner; for (uint256 i = 0; i < initiallyWhitelistedTokens.length; i++) { _whitelistedTokens.add(initiallyWhitelistedTokens[i]); } } function whitelistToken(address token) external onlyOwner { _whitelistedTokens.add(token); } function blacklistToken(address token) external onlyOwner { _whitelistedTokens.remove(token); } function isTokenWhitelisted(address token) external view returns (bool) { return _whitelistedTokens.contains(token); } function whitelistedTokens() external view returns (address[] memory wt) { wt = new address[](_whitelistedTokens.length()); for (uint256 i = 0; i < wt.length; i++) { wt[i] = _whitelistedTokens.at(i); } } modifier onlyOwner() { require(msg.sender == OWNER, "Only owner"); _; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"opImplementation_","type":"address"},{"internalType":"address[]","name":"initiallyWhitelistedTokens","type":"address[]"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"opContract","type":"address"}],"name":"OpCreated","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"blacklistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"createOpFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getOpFor","outputs":[{"internalType":"address","name":"op","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistedTokens","outputs":[{"internalType":"address[]","name":"wt","type":"address[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162001300380380620013008339818101604052810190620000379190620003ca565b828073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060005b8251811015620000fd57620000e6838281518110620000c857620000c762000445565b5b602002602001015160006200010760201b6200054f1790919060201c565b508080620000f490620004ad565b915050620000a4565b50505050620004fa565b600062000137836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200013f60201b60201c565b905092915050565b6000620001538383620001b960201b60201c565b620001ae578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620001b3565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200021d82620001f0565b9050919050565b6200022f8162000210565b81146200023b57600080fd5b50565b6000815190506200024f8162000224565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002a5826200025a565b810181811067ffffffffffffffff82111715620002c757620002c66200026b565b5b80604052505050565b6000620002dc620001dc565b9050620002ea82826200029a565b919050565b600067ffffffffffffffff8211156200030d576200030c6200026b565b5b602082029050602081019050919050565b600080fd5b60006200033a6200033484620002ef565b620002d0565b9050808382526020820190506020840283018581111562000360576200035f6200031e565b5b835b818110156200038d57806200037888826200023e565b84526020840193505060208101905062000362565b5050509392505050565b600082601f830112620003af57620003ae62000255565b5b8151620003c184826020860162000323565b91505092915050565b600080600060608486031215620003e657620003e5620001e6565b5b6000620003f6868287016200023e565b935050602084015167ffffffffffffffff8111156200041a5762000419620001eb565b5b620004288682870162000397565b92505060406200043b868287016200023e565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620004ba82620004a3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620004ef57620004ee62000474565b5b600182019050919050565b60805160a051610dcb620005356000396000818161028701526104ab0152600081816101890152818161035a01526104560152610dcb6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063b5af090f1161005b578063b5af090f146100ef578063b81ef1db1461011f578063c55f63081461013b578063e12545591461016b57610088565b8063468512d91461008d5780635e1762a0146100ab5780636247f6f2146100c9578063829a29e3146100e5575b600080fd5b610095610187565b6040516100a2919061094f565b60405180910390f35b6100b36101ab565b6040516100c09190610a28565b60405180910390f35b6100e360048036038101906100de9190610a7b565b610285565b005b6100ed61032b565b005b61010960048036038101906101049190610a7b565b610336565b6040516101169190610ac3565b60405180910390f35b61013960048036038101906101349190610a7b565b610353565b005b61015560048036038101906101509190610a7b565b61044f565b604051610162919061094f565b60405180910390f35b61018560048036038101906101809190610a7b565b6104a9565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b60606101b7600061057f565b67ffffffffffffffff8111156101d0576101cf610ade565b5b6040519080825280602002602001820160405280156101fe5781602001602082028036833780820191505090505b50905060005b81518110156102815761022181600061059490919063ffffffff16565b82828151811061023457610233610b0d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061027990610b75565b915050610204565b5090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030a90610c1a565b60405180910390fd5b61032781600061054f90919063ffffffff16565b5050565b61033433610353565b565b600061034c8260006105ae90919063ffffffff16565b9050919050565b60006103a57f00000000000000000000000000000000000000000000000000000000000000008360405160200161038a9190610c82565b604051602081830303815290604052805190602001206105de565b90508073ffffffffffffffffffffffffffffffffffffffff166319ab453c836040518263ffffffff1660e01b81526004016103e0919061094f565b600060405180830381600087803b1580156103fa57600080fd5b505af115801561040e573d6000803e3d6000fd5b505050507fcd48388cd7912bf899cd4e5db7ec55b9b5a32dd2951163f9d6e16d07fd49edda8282604051610443929190610c9d565b60405180910390a15050565b60006104a27f0000000000000000000000000000000000000000000000000000000000000000836040516020016104869190610c82565b604051602081830303815290604052805190602001203061069a565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052e90610c1a565b60405180910390fd5b61054b8160006106fb90919063ffffffff16565b5050565b6000610577836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61072b565b905092915050565b600061058d8260000161079b565b9050919050565b60006105a383600001836107ac565b60001c905092915050565b60006105d6836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6107d7565b905092915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90610d12565b60405180910390fd5b92915050565b60006040518260388201526f5af43d82803e903d91602b57fd5bf3ff6024820152846014820152733d602d80600a3d3981f3363d3d373d3d3d363d7381528360588201526037600c8201206078820152605560438201209150509392505050565b6000610723836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6107fa565b905092915050565b600061073783836107d7565b610790578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050610795565b600090505b92915050565b600081600001805490509050919050565b60008260000182815481106107c4576107c3610b0d565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461090257600060018261082c9190610d32565b90506000600186600001805490506108449190610d32565b90508181146108b357600086600001828154811061086557610864610b0d565b5b906000526020600020015490508087600001848154811061088957610888610b0d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806108c7576108c6610d66565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610908565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006109398261090e565b9050919050565b6109498161092e565b82525050565b60006020820190506109646000830184610940565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61099f8161092e565b82525050565b60006109b18383610996565b60208301905092915050565b6000602082019050919050565b60006109d58261096a565b6109df8185610975565b93506109ea83610986565b8060005b83811015610a1b578151610a0288826109a5565b9750610a0d836109bd565b9250506001810190506109ee565b5085935050505092915050565b60006020820190508181036000830152610a4281846109ca565b905092915050565b600080fd5b610a588161092e565b8114610a6357600080fd5b50565b600081359050610a7581610a4f565b92915050565b600060208284031215610a9157610a90610a4a565b5b6000610a9f84828501610a66565b91505092915050565b60008115159050919050565b610abd81610aa8565b82525050565b6000602082019050610ad86000830184610ab4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000610b8082610b6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bb257610bb1610b3c565b5b600182019050919050565b600082825260208201905092915050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b6000610c04600a83610bbd565b9150610c0f82610bce565b602082019050919050565b60006020820190508181036000830152610c3381610bf7565b9050919050565b60008160601b9050919050565b6000610c5282610c3a565b9050919050565b6000610c6482610c47565b9050919050565b610c7c610c778261092e565b610c59565b82525050565b6000610c8e8284610c6b565b60148201915081905092915050565b6000604082019050610cb26000830185610940565b610cbf6020830184610940565b9392505050565b7f455243313136373a2063726561746532206661696c6564000000000000000000600082015250565b6000610cfc601783610bbd565b9150610d0782610cc6565b602082019050919050565b60006020820190508181036000830152610d2b81610cef565b9050919050565b6000610d3d82610b6b565b9150610d4883610b6b565b9250828203905081811115610d6057610d5f610b3c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220a0ae59fc99e68be91abb0e5c6a653265cf5cd3085752296e771203f24fe7f08464736f6c634300081100330000000000000000000000000ea5a58085c7c9964a2853b0400da44a69111a9400000000000000000000000000000000000000000000000000000000000000600000000000000000000000008e3186f4f1c53af3aab33d7661f67d6e43830d1a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c70000000000000000000000009c9e5fd8bbc25984b178fdce6117defa39d2db390000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70000000000000000000000000d24c2ad096400b6fbcd2ad8b24e7acbc21a1da64000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d0000000000000000000000003b55e45fd6bd7d4724f5c47e0d1bcaedd059263e
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000ea5a58085c7c9964a2853b0400da44a69111a9400000000000000000000000000000000000000000000000000000000000000600000000000000000000000008e3186f4f1c53af3aab33d7661f67d6e43830d1a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c70000000000000000000000009c9e5fd8bbc25984b178fdce6117defa39d2db390000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70000000000000000000000000d24c2ad096400b6fbcd2ad8b24e7acbc21a1da64000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d0000000000000000000000003b55e45fd6bd7d4724f5c47e0d1bcaedd059263e
-----Decoded View---------------
Arg [0] : opImplementation_ (address): 0x0ea5a58085c7c9964a2853b0400da44a69111a94
Arg [1] : initiallyWhitelistedTokens (address[]): 0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e,0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7,0x9c9e5fd8bbc25984b178fdce6117defa39d2db39,0x1c20e891bab6b1727d14da358fae2984ed9b59eb,0xc7198437980c041c805a1edcba50c1ce5db95118,0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664,0xd586e7f844cea2f87f50152665bcbc2c279d8d70,0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64,0x130966628846bfd36ff31a822705796e8cb8c18d,0x3b55e45fd6bd7d4724f5c47e0d1bcaedd059263e
Arg [2] : owner (address): 0x8e3186f4f1c53af3aab33d7661f67d6e43830d1a
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000ea5a58085c7c9964a2853b0400da44a69111a94
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000008e3186f4f1c53af3aab33d7661f67d6e43830d1a
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [5] : 0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7
Arg [6] : 0000000000000000000000009c9e5fd8bbc25984b178fdce6117defa39d2db39
Arg [7] : 0000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb
Arg [8] : 000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118
Arg [9] : 000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664
Arg [10] : 000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70
Arg [11] : 000000000000000000000000d24c2ad096400b6fbcd2ad8b24e7acbc21a1da64
Arg [12] : 000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d
Arg [13] : 0000000000000000000000003b55e45fd6bd7d4724f5c47e0d1bcaedd059263e
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.