ETH Price: $2,292.06 (+0.11%)
 

Overview

ETH Balance

0.018 ETH

Eth Value

$41.26 (@ $2,292.06/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Pay Fee172913462023-05-19 5:03:35991 days ago1684472615IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0020358736.4337178
Pay Fee172902522023-05-19 1:20:11991 days ago1684459211IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0026369147.18971108
Register Vault171249122023-04-25 17:59:471014 days ago1682445587IN
0x13ec6B98...2fa52eE01
0 ETH0.0034725445.40227046
Pay Fee171109052023-04-23 18:50:591016 days ago1682275859IN
0x13ec6B98...2fa52eE01
0.002 ETH0.003091155.31784528
Register Vault169565782023-04-01 20:09:351038 days ago1680379775IN
0x13ec6B98...2fa52eE01
0 ETH0.0015471120.22794003
Pay Fee169004752023-03-24 22:58:591046 days ago1679698739IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0010313218.45642924
Pay Fee168880022023-03-23 4:54:231048 days ago1679547263IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0006481311.59897915
Pay Fee168410512023-03-16 14:38:591054 days ago1678977539IN
0x13ec6B98...2fa52eE01
0.002 ETH0.001659129.69109145
Withdraw168344482023-03-15 16:21:471055 days ago1678897307IN
0x13ec6B98...2fa52eE01
0 ETH0.0027991751.96849604
Pay Fee168224492023-03-13 23:51:231057 days ago1678751483IN
0x13ec6B98...2fa52eE01
0.1 ETH0.0009278616.60843242
Pay Fee168217162023-03-13 21:23:231057 days ago1678742603IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0015672328.04702813
Pay Fee168188552023-03-13 11:44:471057 days ago1678707887IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0011278620.18401198
Pay Fee168116592023-03-12 11:30:231058 days ago1678620623IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0010092518.06145399
Withdraw167994592023-03-10 18:19:111060 days ago1678472351IN
0x13ec6B98...2fa52eE01
0 ETH0.0018051232.01996172
Pay Fee167949362023-03-10 2:58:351061 days ago1678417115IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0017754631.77332731
Pay Fee167929982023-03-09 20:24:231061 days ago1678393463IN
0x13ec6B98...2fa52eE01
0.002 ETH0.003292758.92566195
Pay Fee167905262023-03-09 12:03:111061 days ago1678363391IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0016323629.21257263
Pay Fee167904352023-03-09 11:44:471061 days ago1678362287IN
0x13ec6B98...2fa52eE01
0.1 ETH0.0012642722.63016724
Pay Fee167839912023-03-08 13:59:591062 days ago1678283999IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0014783126.45567226
Pay Fee167761952023-03-07 11:42:111063 days ago1678189331IN
0x13ec6B98...2fa52eE01
0.1 ETH0.0014209425.43436204
Pay Fee167708402023-03-06 17:37:111064 days ago1678124231IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0027591149.37654318
Pay Fee167687682023-03-06 10:38:111064 days ago1678099091IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0011328720.27368432
Pay Fee167658402023-03-06 0:45:351065 days ago1678063535IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0019440334.79000974
Pay Fee167630432023-03-05 15:19:591065 days ago1678029599IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0015483527.70911179
Pay Fee167627672023-03-05 14:23:351065 days ago1678026215IN
0x13ec6B98...2fa52eE01
0.002 ETH0.0013970225.00090996
View all transactions

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer168344482023-03-15 16:21:471055 days ago1678897307
0x13ec6B98...2fa52eE01
0.36 ETH
Transfer168344482023-03-15 16:21:471055 days ago1678897307
0x13ec6B98...2fa52eE01
0.04 ETH
Transfer167994592023-03-10 18:19:111060 days ago1678472351
0x13ec6B98...2fa52eE01
0.8388 ETH
Transfer167994592023-03-10 18:19:111060 days ago1678472351
0x13ec6B98...2fa52eE01
0.0932 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FeeCollector

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

import { IFeeCollector } from "./interfaces/IFeeCollector.sol";
import { LibAddress } from "./lib/LibAddress.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/Multicall.sol";

/// @title A smart contract for registering vaults for payments.
contract FeeCollector is IFeeCollector, Multicall {
    using LibAddress for address payable;

    address payable public guildFeeCollector;
    uint96 public guildShareBps;

    Vault[] internal vaults;

    /// @param guildFeeCollector_ The address that will receive Guild's share from the funds.
    /// @param guildShareBps_ The percentage of Guild's share expressed in basis points (e.g 500 for a 5% cut).
    constructor(address payable guildFeeCollector_, uint96 guildShareBps_) {
        guildFeeCollector = guildFeeCollector_;
        guildShareBps = guildShareBps_;
    }

    function registerVault(address owner, address token, bool multiplePayments, uint120 fee) external {
        Vault storage vault = vaults.push();
        vault.owner = owner;
        vault.token = token;
        vault.multiplePayments = multiplePayments;
        vault.fee = fee;

        emit VaultRegistered(vaults.length - 1, owner, token, fee);
    }

    function payFee(uint256 vaultId) external payable {
        if (vaultId >= vaults.length) revert VaultDoesNotExist(vaultId);

        Vault storage vault = vaults[vaultId];

        if (!vault.multiplePayments && vault.paid[msg.sender]) revert AlreadyPaid(vaultId, msg.sender);

        uint256 requiredAmount = vault.fee;
        vault.collected += uint128(requiredAmount);
        vault.paid[msg.sender] = true;

        // If the tokenAddress is zero, the payment should be in Ether, otherwise in ERC20.
        address tokenAddress = vault.token;
        if (tokenAddress == address(0)) {
            if (msg.value != requiredAmount) revert IncorrectFee(vaultId, msg.value, requiredAmount);
        } else {
            if (msg.value != 0) revert IncorrectFee(vaultId, msg.value, 0);
            if (!IERC20(tokenAddress).transferFrom(msg.sender, address(this), requiredAmount))
                revert TransferFailed(msg.sender, address(this));
        }

        emit FeeReceived(vaultId, msg.sender, requiredAmount);
    }

    function withdraw(uint256 vaultId) external {
        if (vaultId >= vaults.length) revert VaultDoesNotExist(vaultId);

        Vault storage vault = vaults[vaultId];
        uint256 collected = vault.collected;
        vault.collected = 0;

        // Calculate fees to receive. Guild's part is truncated - the remainder goes to the owner.
        uint256 guildAmount = (collected * guildShareBps) / 10000;
        uint256 ownerAmount = collected - guildAmount;

        // If the tokenAddress is zero, the collected fees are in Ether, otherwise in ERC20.
        address tokenAddress = vault.token;
        if (tokenAddress == address(0)) _withdrawEther(guildAmount, ownerAmount, vault.owner);
        else _withdrawToken(guildAmount, ownerAmount, vault.owner, tokenAddress);

        emit Withdrawn(vaultId, guildAmount, ownerAmount);
    }

    function setGuildFeeCollector(address payable newFeeCollector) external {
        if (msg.sender != guildFeeCollector) revert AccessDenied(msg.sender, guildFeeCollector);
        guildFeeCollector = newFeeCollector;
        emit GuildFeeCollectorChanged(newFeeCollector);
    }

    function setGuildShareBps(uint96 newShare) external {
        if (msg.sender != guildFeeCollector) revert AccessDenied(msg.sender, guildFeeCollector);
        guildShareBps = newShare;
        emit GuildShareBpsChanged(newShare);
    }

    function setVaultDetails(uint256 vaultId, address newOwner, bool newMultiplePayments, uint120 newFee) external {
        if (vaultId >= vaults.length) revert VaultDoesNotExist(vaultId);
        Vault storage vault = vaults[vaultId];

        if (msg.sender != vault.owner) revert AccessDenied(msg.sender, vault.owner);

        vault.owner = newOwner;
        vault.multiplePayments = newMultiplePayments;
        vault.fee = newFee;

        emit VaultDetailsChanged(vaultId);
    }

    function getVault(
        uint256 vaultId
    ) external view returns (address owner, address token, bool multiplePayments, uint120 fee, uint128 collected) {
        if (vaultId >= vaults.length) revert VaultDoesNotExist(vaultId);
        Vault storage vault = vaults[vaultId];
        return (vault.owner, vault.token, vault.multiplePayments, vault.fee, vault.collected);
    }

    function hasPaid(uint256 vaultId, address account) external view returns (bool paid) {
        if (vaultId >= vaults.length) revert VaultDoesNotExist(vaultId);
        return vaults[vaultId].paid[account];
    }

    function _withdrawEther(uint256 guildAmount, uint256 ownerAmount, address eventOwner) internal {
        guildFeeCollector.sendEther(guildAmount);
        payable(eventOwner).sendEther(ownerAmount);
    }

    function _withdrawToken(
        uint256 guildAmount,
        uint256 ownerAmount,
        address eventOwner,
        address tokenAddress
    ) internal {
        IERC20 token = IERC20(tokenAddress);
        if (!token.transfer(guildFeeCollector, guildAmount)) revert TransferFailed(address(this), guildFeeCollector);
        if (!token.transfer(eventOwner, ownerAmount)) revert TransferFailed(address(this), eventOwner);
    }
}

// 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) (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);
        }
    }
}

File 4 of 6 : Multicall.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol)

pragma solidity ^0.8.0;

import "./Address.sol";

/**
 * @dev Provides a function to batch together multiple calls in a single external call.
 *
 * _Available since v4.1._
 */
abstract contract Multicall {
    /**
     * @dev Receives and executes a batch of function calls on this contract.
     */
    function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            results[i] = Address.functionDelegateCall(address(this), data[i]);
        }
        return results;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title A smart contract for registering vaults for payments.
interface IFeeCollector {
    struct Vault {
        address owner;
        address token;
        bool multiplePayments;
        uint120 fee;
        uint128 collected;
        mapping(address => bool) paid;
    }

    /// @notice Registers a vault and it's fee.
    /// @param owner The address that receives the fees from the payment.
    /// @param token The zero address for Ether, otherwise an ERC20 token.
    /// @param multiplePayments Whether the fee can be paid multiple times.
    /// @param fee The amount of fee to pay in base units.
    function registerVault(address owner, address token, bool multiplePayments, uint120 fee) external;

    /// @notice Registers the paid fee, both in Ether or ERC20.
    /// @param vaultId The id of the vault to pay to.
    function payFee(uint256 vaultId) external payable;

    /// @notice Sets the address that receives Guild's share from the funds.
    /// @dev Callable only by the current Guild fee collector.
    /// @param newFeeCollector The new address of guildFeeCollector.
    function setGuildFeeCollector(address payable newFeeCollector) external;

    /// @notice Sets Guild's share from the funds.
    /// @dev Callable only by the Guild fee collector.
    /// @param newShare The percentual value expressed in basis points.
    function setGuildShareBps(uint96 newShare) external;

    /// @notice Changes the details of a vault.
    /// @dev Callable only by the owner of the vault to be changed.
    /// @param vaultId The id of the vault whose details should be changed.
    /// @param newOwner The address that will receive the fees from now on.
    /// @param newMultiplePayments Whether the fee can be paid multiple times from now on.
    /// @param newFee The amount of fee to pay in base units from now on.
    function setVaultDetails(uint256 vaultId, address newOwner, bool newMultiplePayments, uint120 newFee) external;

    /// @notice Distributes the funds from a vault to the fee collectors and the owner.
    /// @param vaultId The id of the vault whose funds should be distributed.
    function withdraw(uint256 vaultId) external;

    /// @notice Returns a vault's details.
    /// @param vaultId The id of the queried vault.
    /// @return owner The owner of the vault who recieves the funds.
    /// @return token The address of the token to receive funds in (the zero address in case of Ether).
    /// @return multiplePayments Whether the fee can be paid multiple times.
    /// @return fee The amount of required funds in base units.
    /// @return collected The amount of already collected funds.
    function getVault(
        uint256 vaultId
    ) external view returns (address owner, address token, bool multiplePayments, uint120 fee, uint128 collected);

    /// @notice Returns if an account has paid the fee to a vault.
    /// @param vaultId The id of the queried vault.
    /// @param account The address of the queried account.
    function hasPaid(uint256 vaultId, address account) external view returns (bool paid);

    /// @notice Returns the address that receives Guild's share from the funds.
    function guildFeeCollector() external view returns (address payable);

    /// @notice Returns the percentage of Guild's share expressed in basis points.
    function guildShareBps() external view returns (uint96);

    /// @notice Event emitted when a call to {payFee} succeeds.
    /// @param vaultId The id of the vault that received the payment.
    /// @param account The address of the account that paid.
    /// @param amount The amount of fee received in base units.
    event FeeReceived(uint256 indexed vaultId, address indexed account, uint256 amount);

    /// @notice Event emitted when the Guild fee collector address is changed.
    /// @param newFeeCollector The address to change guildFeeCollector to.
    event GuildFeeCollectorChanged(address newFeeCollector);

    /// @notice Event emitted when the share of the Guild fee collector changes.
    /// @param newShare The new value of guildShareBps.
    event GuildShareBpsChanged(uint96 newShare);

    /// @notice Event emitted when a vault's details are changed.
    /// @param vaultId The id of the altered vault.
    event VaultDetailsChanged(uint256 vaultId);

    /// @notice Event emitted when a new vault is registered.
    /// @param owner The address that receives the fees from the payment.
    /// @param token The zero address for Ether, otherwise an ERC20 token.
    /// @param fee The amount of fee to pay in base units.
    event VaultRegistered(uint256 vaultId, address indexed owner, address indexed token, uint256 fee);

    /// @notice Event emitted when funds are withdrawn by a vault owner.
    /// @param vaultId The id of the vault.
    /// @param guildAmount The amount received by the Guild fee collector in base units.
    /// @param ownerAmount The amount received by the vault's owner in base units.
    event Withdrawn(uint256 indexed vaultId, uint256 guildAmount, uint256 ownerAmount);

    /// @notice Error thrown when multiple payments aren't enabled, but the sender attempts to pay repeatedly.
    /// @param vaultId The id of the vault.
    /// @param sender The sender of the transaction.
    error AlreadyPaid(uint256 vaultId, address sender);

    /// @notice Error thrown when an incorrect amount of fee is attempted to be paid.
    /// @dev requiredAmount might be 0 in cases when an ERC20 payment was expected but Ether was received, too.
    /// @param vaultId The id of the vault.
    /// @param paid The amount of funds received.
    /// @param requiredAmount The amount of fees required by the vault.
    error IncorrectFee(uint256 vaultId, uint256 paid, uint256 requiredAmount);

    /// @notice Error thrown when a function is attempted to be called by the wrong address.
    /// @param sender The address that sent the transaction.
    /// @param owner The address that is allowed to call the function.
    error AccessDenied(address sender, address owner);

    /// @notice Error thrown when an ERC20 transfer failed.
    /// @param from The sender of the token.
    /// @param to The recipient of the token.
    error TransferFailed(address from, address to);

    /// @notice Error thrown when a vault does not exist.
    /// @param vaultId The id of the requested vault.
    error VaultDoesNotExist(uint256 vaultId);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title Library for functions related to addresses.
library LibAddress {
    /// @notice Error thrown when sending ether fails.
    /// @param recipient The address that could not receive the ether.
    error FailedToSendEther(address recipient);

    /// @notice Send ether to an address, forwarding all available gas and reverting on errors.
    /// @param recipient The recipient of the ether.
    /// @param amount The amount of ether to send in base units.
    function sendEther(address payable recipient, uint256 amount) internal {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, ) = recipient.call{ value: amount }("");
        if (!success) revert FailedToSendEther(recipient);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address payable","name":"guildFeeCollector_","type":"address"},{"internalType":"uint96","name":"guildShareBps_","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"AccessDenied","type":"error"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"AlreadyPaid","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"FailedToSendEther","type":"error"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint256","name":"requiredAmount","type":"uint256"}],"name":"IncorrectFee","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"TransferFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"VaultDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newFeeCollector","type":"address"}],"name":"GuildFeeCollectorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"newShare","type":"uint96"}],"name":"GuildShareBpsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"VaultDetailsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"VaultRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"guildAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ownerAmount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"getVault","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"multiplePayments","type":"bool"},{"internalType":"uint120","name":"fee","type":"uint120"},{"internalType":"uint128","name":"collected","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guildFeeCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guildShareBps","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"hasPaid","outputs":[{"internalType":"bool","name":"paid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"payFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"multiplePayments","type":"bool"},{"internalType":"uint120","name":"fee","type":"uint120"}],"name":"registerVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newFeeCollector","type":"address"}],"name":"setGuildFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"newShare","type":"uint96"}],"name":"setGuildShareBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"newMultiplePayments","type":"bool"},{"internalType":"uint120","name":"newFee","type":"uint120"}],"name":"setVaultDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506040516113f13803806113f183398101604081905261002f91610052565b6001600160601b0316600160a01b026001600160a01b03909116176000556100a4565b6000806040838503121561006557600080fd5b82516001600160a01b038116811461007c57600080fd5b60208401519092506001600160601b038116811461009957600080fd5b809150509250929050565b61133e806100b36000396000f3fe60806040526004361061009c5760003560e01c80638188e8bd116100645780638188e8bd146101605780639403b6341461019f578063ac9650d814610209578063b21fbf1314610236578063d289ade214610256578063d8bc7fff1461026957600080fd5b8063228a0831146100a15780632e1a7d4d146100c3578063504af59a146100e35780635381a9bf14610120578063713099b514610140575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610f1e565b610299565b005b3480156100cf57600080fd5b506100c16100de366004610f3b565b610333565b3480156100ef57600080fd5b50600054610103906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012c57600080fd5b506100c161013b366004610f7e565b610479565b34801561014c57600080fd5b506100c161015b366004610fcf565b61058d565b34801561016c57600080fd5b5060005461018790600160a01b90046001600160601b031681565b6040516001600160601b039091168152602001610117565b3480156101ab57600080fd5b506101bf6101ba366004610f3b565b610623565b604080516001600160a01b039687168152959094166020860152911515928401929092526001600160781b0390911660608301526001600160801b0316608082015260a001610117565b34801561021557600080fd5b50610229610224366004610ff8565b6106c8565b60405161011791906110bd565b34801561024257600080fd5b506100c161025136600461111f565b6107be565b6100c1610264366004610f3b565b6108e7565b34801561027557600080fd5b50610289610284366004611150565b610b49565b6040519015158152602001610117565b6000546001600160a01b031633146102de5760005460405163c21bbf9d60e01b81523360048201526001600160a01b0390911660248201526044015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f41c387ad232996a24e924bd12a8be0da67a8350e31529f702890a9a039cd0c7e906020015b60405180910390a150565b60015481106103585760405163148eeced60e31b8152600481018290526024016102d5565b60006001828154811061036d5761036d611180565b600091825260208220600491909102016002810180546fffffffffffffffffffffffffffffffff60781b1981169091558254919350600160781b90046001600160801b03169190612710906103d290600160a01b90046001600160601b0316846111ac565b6103dc91906111c3565b905060006103ea82846111e5565b60018501549091506001600160a01b03168061041d57845461041890849084906001600160a01b0316610bb8565b610436565b845461043690849084906001600160a01b031684610be6565b604080518481526020810184905287917fabd2ab552bc04cdbfa4a54107fa44ac8c9cb06f6d21da11933ac05a653be19e9910160405180910390a2505050505050565b600154841061049e5760405163148eeced60e31b8152600481018590526024016102d5565b6000600185815481106104b3576104b3611180565b6000918252602090912060049091020180549091506001600160a01b0316331461050457805460405163c21bbf9d60e01b81523360048201526001600160a01b0390911660248201526044016102d5565b80546001600160a01b0319166001600160a01b03851617815560018101805460ff60a01b1916600160a01b851515021790556002810180546001600160781b0319166001600160781b0384161790556040518581527f0f6e859cfe5a61b4ac4db165b1cedfec838e25aab3754b5fc55cdd98ffc048569060200160405180910390a15050505050565b6000546001600160a01b031633146105cd5760005460405163c21bbf9d60e01b81523360048201526001600160a01b0390911660248201526044016102d5565b600080546001600160a01b0316600160a01b6001600160601b038416908102919091179091556040519081527fd2e71643681050bd512ef60a697e4a3a14bf472269f328b8782fc5e6c713428790602001610328565b600080600080600060018054905086106106535760405163148eeced60e31b8152600481018790526024016102d5565b60006001878154811061066857610668611180565b60009182526020909120600490910201805460018201546002909201546001600160a01b039182169a9183169950600160a01b90920460ff1697506001600160781b0382169650600160781b9091046001600160801b0316945092505050565b60608167ffffffffffffffff8111156106e3576106e36111f8565b60405190808252806020026020018201604052801561071657816020015b60608152602001906001900390816107015790505b50905060005b828110156107b6576107863085858481811061073a5761073a611180565b905060200281019061074c919061120e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d3892505050565b82828151811061079857610798611180565b602002602001018190525080806107ae9061125c565b91505061071c565b505b92915050565b60018054808201825560008290527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6600490910290810180546001600160a01b0319166001600160a01b0388811691821783557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7840180549189166001600160a81b03199092168217600160a01b891515021790557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf890930180546001600160781b0319166001600160781b0387161790558354919390917f4b3a82e5a78d13c548f7316e50f3cbd5de161644b3a5142b08beda64d4024240916108c1916111e5565b604080519182526001600160781b03871660208301520160405180910390a35050505050565b600154811061090c5760405163148eeced60e31b8152600481018290526024016102d5565b60006001828154811061092157610921611180565b906000526020600020906004020190508060010160149054906101000a900460ff16158015610961575033600090815260038201602052604090205460ff165b1561098857604051630ca4821360e21b8152600481018390523360248201526044016102d5565b6002810180546001600160781b038116918291600f906109b9908490600160781b90046001600160801b0316611275565b82546001600160801b039182166101009390930a9283029190920219909116179055503360009081526003830160205260409020805460ff191660019081179091558201546001600160a01b031680610a4157813414610a3c5760405163119a754560e01b815260048101859052346024820152604481018390526064016102d5565b610b0c565b3415610a705760405163119a754560e01b815260048101859052346024820152600060448201526064016102d5565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd906064016020604051808303816000875af1158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190611295565b610b0c5760405163291e1d5560e11b81523360048201523060248201526044016102d5565b604051828152339085907f26d8baa91676f5f0ff9373b84d9a9736de9187010efe488a475a0dd91adbdb469060200160405180910390a350505050565b6001546000908310610b715760405163148eeced60e31b8152600481018490526024016102d5565b60018381548110610b8457610b84611180565b600091825260208083206001600160a01b03861684526003600490930201919091019052604090205460ff16905092915050565b600054610bce906001600160a01b031684610d64565b610be16001600160a01b03821683610d64565b505050565b60005460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101869052829182169063a9059cbb906044016020604051808303816000875af1158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e9190611295565b610c905760005460405163291e1d5560e11b81523060048201526001600160a01b0390911660248201526044016102d5565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820186905282169063a9059cbb906044016020604051808303816000875af1158015610cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d039190611295565b610d315760405163291e1d5560e11b81523060048201526001600160a01b03841660248201526044016102d5565b5050505050565b6060610d5d83836040518060600160405280602781526020016112e260279139610de3565b9392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5050905080610be157604051632499e3bb60e11b81526001600160a01b03841660048201526024016102d5565b6060600080856001600160a01b031685604051610e0091906112b2565b600060405180830381855af49150503d8060008114610e3b576040519150601f19603f3d011682016040523d82523d6000602084013e610e40565b606091505b5091509150610e5186838387610e5b565b9695505050505050565b60608315610eca578251600003610ec3576001600160a01b0385163b610ec35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102d5565b5081610ed4565b610ed48383610edc565b949350505050565b815115610eec5781518083602001fd5b8060405162461bcd60e51b81526004016102d591906112ce565b6001600160a01b0381168114610f1b57600080fd5b50565b600060208284031215610f3057600080fd5b8135610d5d81610f06565b600060208284031215610f4d57600080fd5b5035919050565b8015158114610f1b57600080fd5b80356001600160781b0381168114610f7957600080fd5b919050565b60008060008060808587031215610f9457600080fd5b843593506020850135610fa681610f06565b92506040850135610fb681610f54565b9150610fc460608601610f62565b905092959194509250565b600060208284031215610fe157600080fd5b81356001600160601b0381168114610d5d57600080fd5b6000806020838503121561100b57600080fd5b823567ffffffffffffffff8082111561102357600080fd5b818501915085601f83011261103757600080fd5b81358181111561104657600080fd5b8660208260051b850101111561105b57600080fd5b60209290920196919550909350505050565b60005b83811015611088578181015183820152602001611070565b50506000910152565b600081518084526110a981602086016020860161106d565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561111257603f19888603018452611100858351611091565b945092850192908501906001016110e4565b5092979650505050505050565b6000806000806080858703121561113557600080fd5b843561114081610f06565b93506020850135610fa681610f06565b6000806040838503121561116357600080fd5b82359150602083013561117581610f06565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107b8576107b8611196565b6000826111e057634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107b8576107b8611196565b634e487b7160e01b600052604160045260246000fd5b6000808335601e1984360301811261122557600080fd5b83018035915067ffffffffffffffff82111561124057600080fd5b60200191503681900382131561125557600080fd5b9250929050565b60006001820161126e5761126e611196565b5060010190565b6001600160801b038181168382160190808211156107b6576107b6611196565b6000602082840312156112a757600080fd5b8151610d5d81610f54565b600082516112c481846020870161106d565b9190910192915050565b602081526000610d5d602083018461109156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a8c5d178e1abf974c50c36952d97a7837ca0fea7a4fd22f8d97c079fbcbc10dd64736f6c634300081200330000000000000000000000001d7da3d9bc8fcff7953d91e721531d6dc69f09f600000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x60806040526004361061009c5760003560e01c80638188e8bd116100645780638188e8bd146101605780639403b6341461019f578063ac9650d814610209578063b21fbf1314610236578063d289ade214610256578063d8bc7fff1461026957600080fd5b8063228a0831146100a15780632e1a7d4d146100c3578063504af59a146100e35780635381a9bf14610120578063713099b514610140575b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610f1e565b610299565b005b3480156100cf57600080fd5b506100c16100de366004610f3b565b610333565b3480156100ef57600080fd5b50600054610103906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012c57600080fd5b506100c161013b366004610f7e565b610479565b34801561014c57600080fd5b506100c161015b366004610fcf565b61058d565b34801561016c57600080fd5b5060005461018790600160a01b90046001600160601b031681565b6040516001600160601b039091168152602001610117565b3480156101ab57600080fd5b506101bf6101ba366004610f3b565b610623565b604080516001600160a01b039687168152959094166020860152911515928401929092526001600160781b0390911660608301526001600160801b0316608082015260a001610117565b34801561021557600080fd5b50610229610224366004610ff8565b6106c8565b60405161011791906110bd565b34801561024257600080fd5b506100c161025136600461111f565b6107be565b6100c1610264366004610f3b565b6108e7565b34801561027557600080fd5b50610289610284366004611150565b610b49565b6040519015158152602001610117565b6000546001600160a01b031633146102de5760005460405163c21bbf9d60e01b81523360048201526001600160a01b0390911660248201526044015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f41c387ad232996a24e924bd12a8be0da67a8350e31529f702890a9a039cd0c7e906020015b60405180910390a150565b60015481106103585760405163148eeced60e31b8152600481018290526024016102d5565b60006001828154811061036d5761036d611180565b600091825260208220600491909102016002810180546fffffffffffffffffffffffffffffffff60781b1981169091558254919350600160781b90046001600160801b03169190612710906103d290600160a01b90046001600160601b0316846111ac565b6103dc91906111c3565b905060006103ea82846111e5565b60018501549091506001600160a01b03168061041d57845461041890849084906001600160a01b0316610bb8565b610436565b845461043690849084906001600160a01b031684610be6565b604080518481526020810184905287917fabd2ab552bc04cdbfa4a54107fa44ac8c9cb06f6d21da11933ac05a653be19e9910160405180910390a2505050505050565b600154841061049e5760405163148eeced60e31b8152600481018590526024016102d5565b6000600185815481106104b3576104b3611180565b6000918252602090912060049091020180549091506001600160a01b0316331461050457805460405163c21bbf9d60e01b81523360048201526001600160a01b0390911660248201526044016102d5565b80546001600160a01b0319166001600160a01b03851617815560018101805460ff60a01b1916600160a01b851515021790556002810180546001600160781b0319166001600160781b0384161790556040518581527f0f6e859cfe5a61b4ac4db165b1cedfec838e25aab3754b5fc55cdd98ffc048569060200160405180910390a15050505050565b6000546001600160a01b031633146105cd5760005460405163c21bbf9d60e01b81523360048201526001600160a01b0390911660248201526044016102d5565b600080546001600160a01b0316600160a01b6001600160601b038416908102919091179091556040519081527fd2e71643681050bd512ef60a697e4a3a14bf472269f328b8782fc5e6c713428790602001610328565b600080600080600060018054905086106106535760405163148eeced60e31b8152600481018790526024016102d5565b60006001878154811061066857610668611180565b60009182526020909120600490910201805460018201546002909201546001600160a01b039182169a9183169950600160a01b90920460ff1697506001600160781b0382169650600160781b9091046001600160801b0316945092505050565b60608167ffffffffffffffff8111156106e3576106e36111f8565b60405190808252806020026020018201604052801561071657816020015b60608152602001906001900390816107015790505b50905060005b828110156107b6576107863085858481811061073a5761073a611180565b905060200281019061074c919061120e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d3892505050565b82828151811061079857610798611180565b602002602001018190525080806107ae9061125c565b91505061071c565b505b92915050565b60018054808201825560008290527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6600490910290810180546001600160a01b0319166001600160a01b0388811691821783557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7840180549189166001600160a81b03199092168217600160a01b891515021790557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf890930180546001600160781b0319166001600160781b0387161790558354919390917f4b3a82e5a78d13c548f7316e50f3cbd5de161644b3a5142b08beda64d4024240916108c1916111e5565b604080519182526001600160781b03871660208301520160405180910390a35050505050565b600154811061090c5760405163148eeced60e31b8152600481018290526024016102d5565b60006001828154811061092157610921611180565b906000526020600020906004020190508060010160149054906101000a900460ff16158015610961575033600090815260038201602052604090205460ff165b1561098857604051630ca4821360e21b8152600481018390523360248201526044016102d5565b6002810180546001600160781b038116918291600f906109b9908490600160781b90046001600160801b0316611275565b82546001600160801b039182166101009390930a9283029190920219909116179055503360009081526003830160205260409020805460ff191660019081179091558201546001600160a01b031680610a4157813414610a3c5760405163119a754560e01b815260048101859052346024820152604481018390526064016102d5565b610b0c565b3415610a705760405163119a754560e01b815260048101859052346024820152600060448201526064016102d5565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd906064016020604051808303816000875af1158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190611295565b610b0c5760405163291e1d5560e11b81523360048201523060248201526044016102d5565b604051828152339085907f26d8baa91676f5f0ff9373b84d9a9736de9187010efe488a475a0dd91adbdb469060200160405180910390a350505050565b6001546000908310610b715760405163148eeced60e31b8152600481018490526024016102d5565b60018381548110610b8457610b84611180565b600091825260208083206001600160a01b03861684526003600490930201919091019052604090205460ff16905092915050565b600054610bce906001600160a01b031684610d64565b610be16001600160a01b03821683610d64565b505050565b60005460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101869052829182169063a9059cbb906044016020604051808303816000875af1158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e9190611295565b610c905760005460405163291e1d5560e11b81523060048201526001600160a01b0390911660248201526044016102d5565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820186905282169063a9059cbb906044016020604051808303816000875af1158015610cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d039190611295565b610d315760405163291e1d5560e11b81523060048201526001600160a01b03841660248201526044016102d5565b5050505050565b6060610d5d83836040518060600160405280602781526020016112e260279139610de3565b9392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5050905080610be157604051632499e3bb60e11b81526001600160a01b03841660048201526024016102d5565b6060600080856001600160a01b031685604051610e0091906112b2565b600060405180830381855af49150503d8060008114610e3b576040519150601f19603f3d011682016040523d82523d6000602084013e610e40565b606091505b5091509150610e5186838387610e5b565b9695505050505050565b60608315610eca578251600003610ec3576001600160a01b0385163b610ec35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102d5565b5081610ed4565b610ed48383610edc565b949350505050565b815115610eec5781518083602001fd5b8060405162461bcd60e51b81526004016102d591906112ce565b6001600160a01b0381168114610f1b57600080fd5b50565b600060208284031215610f3057600080fd5b8135610d5d81610f06565b600060208284031215610f4d57600080fd5b5035919050565b8015158114610f1b57600080fd5b80356001600160781b0381168114610f7957600080fd5b919050565b60008060008060808587031215610f9457600080fd5b843593506020850135610fa681610f06565b92506040850135610fb681610f54565b9150610fc460608601610f62565b905092959194509250565b600060208284031215610fe157600080fd5b81356001600160601b0381168114610d5d57600080fd5b6000806020838503121561100b57600080fd5b823567ffffffffffffffff8082111561102357600080fd5b818501915085601f83011261103757600080fd5b81358181111561104657600080fd5b8660208260051b850101111561105b57600080fd5b60209290920196919550909350505050565b60005b83811015611088578181015183820152602001611070565b50506000910152565b600081518084526110a981602086016020860161106d565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561111257603f19888603018452611100858351611091565b945092850192908501906001016110e4565b5092979650505050505050565b6000806000806080858703121561113557600080fd5b843561114081610f06565b93506020850135610fa681610f06565b6000806040838503121561116357600080fd5b82359150602083013561117581610f06565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107b8576107b8611196565b6000826111e057634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107b8576107b8611196565b634e487b7160e01b600052604160045260246000fd5b6000808335601e1984360301811261122557600080fd5b83018035915067ffffffffffffffff82111561124057600080fd5b60200191503681900382131561125557600080fd5b9250929050565b60006001820161126e5761126e611196565b5060010190565b6001600160801b038181168382160190808211156107b6576107b6611196565b6000602082840312156112a757600080fd5b8151610d5d81610f54565b600082516112c481846020870161106d565b9190910192915050565b602081526000610d5d602083018461109156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a8c5d178e1abf974c50c36952d97a7837ca0fea7a4fd22f8d97c079fbcbc10dd64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000001d7da3d9bc8fcff7953d91e721531d6dc69f09f600000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : guildFeeCollector_ (address): 0x1d7dA3D9BC8fcFf7953D91E721531D6Dc69F09f6
Arg [1] : guildShareBps_ (uint96): 1000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d7da3d9bc8fcff7953d91e721531d6dc69f09f6
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
0x13ec6B98362E43Add08f7CC4f6befd02fa52eE01
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.