ETH Price: $2,497.22 (+1.70%)

Contract

0x0Bce649673e5B6221Cf3100d8e5333d890B555ae
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw202499242024-07-06 20:41:5957 days ago1720298519IN
0x0Bce6496...890B555ae
0 ETH0.000219141.63015194
Claim202029622024-06-30 7:18:5964 days ago1719731939IN
0x0Bce6496...890B555ae
0 ETH0.000225272.48339236
Start_rentals201952122024-06-29 5:19:3565 days ago1719638375IN
0x0Bce6496...890B555ae
0 ETH0.000593582.27370145
Start_rentals201879162024-06-28 4:52:2366 days ago1719550343IN
0x0Bce6496...890B555ae
0 ETH0.000657332.64892617
Withdraw200694732024-06-11 15:26:3582 days ago1718119595IN
0x0Bce6496...890B555ae
0 ETH0.0026045629.05451107
Withdraw200694722024-06-11 15:26:2382 days ago1718119583IN
0x0Bce6496...890B555ae
0 ETH0.0025181328.07916304
Claim200541202024-06-09 11:58:5985 days ago1717934339IN
0x0Bce6496...890B555ae
0 ETH0.000577924.0018342
Withdraw199048282024-05-19 15:18:47105 days ago1716131927IN
0x0Bce6496...890B555ae
0 ETH0.000664365.08713573
Withdraw198894342024-05-17 11:36:35108 days ago1715945795IN
0x0Bce6496...890B555ae
0 ETH0.000979759.48758473
Withdraw198894292024-05-17 11:35:35108 days ago1715945735IN
0x0Bce6496...890B555ae
0 ETH0.000723728.07222707
Withdraw198707642024-05-14 21:00:47110 days ago1715720447IN
0x0Bce6496...890B555ae
0 ETH0.000608345.77836903
Withdraw198703202024-05-14 19:30:59110 days ago1715715059IN
0x0Bce6496...890B555ae
0 ETH0.000771347.32831774
Withdraw198471502024-05-11 13:40:59114 days ago1715434859IN
0x0Bce6496...890B555ae
0 ETH0.000590135.71626708
Withdraw198362612024-05-10 1:07:59115 days ago1715303279IN
0x0Bce6496...890B555ae
0 ETH0.000311033.46970429
Withdraw198362542024-05-10 1:06:35115 days ago1715303195IN
0x0Bce6496...890B555ae
0 ETH0.000368383.44995178
Withdraw198201372024-05-07 19:00:35117 days ago1715108435IN
0x0Bce6496...890B555ae
0 ETH0.000972599.24237137
Start_rentals198102522024-05-06 9:49:23119 days ago1714988963IN
0x0Bce6496...890B555ae
0 ETH0.0017137
Start_rentals198101962024-05-06 9:37:59119 days ago1714988279IN
0x0Bce6496...890B555ae
0 ETH0.002154858
Start_rentals198101582024-05-06 9:30:11119 days ago1714987811IN
0x0Bce6496...890B555ae
0 ETH0.001804457
Withdraw197938392024-05-04 2:43:35121 days ago1714790615IN
0x0Bce6496...890B555ae
0 ETH0.000483765.48764322
Start_rentals197518722024-04-28 5:57:11127 days ago1714283831IN
0x0Bce6496...890B555ae
0 ETH0.000998164.37220466
Start_rentals197491432024-04-27 20:46:59127 days ago1714250819IN
0x0Bce6496...890B555ae
0 ETH0.000913454.51566687
Start_rentals197477982024-04-27 16:16:23127 days ago1714234583IN
0x0Bce6496...890B555ae
0 ETH0.001561387.21251777
Withdraw197108532024-04-22 12:10:59133 days ago1713787859IN
0x0Bce6496...890B555ae
0 ETH0.001209248.99179311
Start_rentals197057562024-04-21 19:05:59133 days ago1713726359IN
0x0Bce6496...890B555ae
0 ETH0.001817036.67152715
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
202499242024-07-06 20:41:5957 days ago1720298519
0x0Bce6496...890B555ae
0 ETH
202029622024-06-30 7:18:5964 days ago1719731939
0x0Bce6496...890B555ae
0 ETH
201952122024-06-29 5:19:3565 days ago1719638375
0x0Bce6496...890B555ae
0 ETH
201879162024-06-28 4:52:2366 days ago1719550343
0x0Bce6496...890B555ae
0 ETH
200694732024-06-11 15:26:3582 days ago1718119595
0x0Bce6496...890B555ae
0 ETH
200694722024-06-11 15:26:2382 days ago1718119583
0x0Bce6496...890B555ae
0 ETH
200541202024-06-09 11:58:5985 days ago1717934339
0x0Bce6496...890B555ae
0 ETH
200541202024-06-09 11:58:5985 days ago1717934339
0x0Bce6496...890B555ae
0 ETH
200541202024-06-09 11:58:5985 days ago1717934339
0x0Bce6496...890B555ae
0 ETH
199048282024-05-19 15:18:47105 days ago1716131927
0x0Bce6496...890B555ae
0 ETH
198894342024-05-17 11:36:35108 days ago1715945795
0x0Bce6496...890B555ae
0 ETH
198894292024-05-17 11:35:35108 days ago1715945735
0x0Bce6496...890B555ae
0 ETH
198707642024-05-14 21:00:47110 days ago1715720447
0x0Bce6496...890B555ae
0 ETH
198703202024-05-14 19:30:59110 days ago1715715059
0x0Bce6496...890B555ae
0 ETH
198471502024-05-11 13:40:59114 days ago1715434859
0x0Bce6496...890B555ae
0 ETH
198362612024-05-10 1:07:59115 days ago1715303279
0x0Bce6496...890B555ae
0 ETH
198362542024-05-10 1:06:35115 days ago1715303195
0x0Bce6496...890B555ae
0 ETH
198201372024-05-07 19:00:35117 days ago1715108435
0x0Bce6496...890B555ae
0 ETH
198102522024-05-06 9:49:23119 days ago1714988963
0x0Bce6496...890B555ae
0 ETH
198101962024-05-06 9:37:59119 days ago1714988279
0x0Bce6496...890B555ae
0 ETH
198101582024-05-06 9:30:11119 days ago1714987811
0x0Bce6496...890B555ae
0 ETH
197938392024-05-04 2:43:35121 days ago1714790615
0x0Bce6496...890B555ae
0 ETH
197518722024-04-28 5:57:11127 days ago1714283831
0x0Bce6496...890B555ae
0 ETH
197491432024-04-27 20:46:59127 days ago1714250819
0x0Bce6496...890B555ae
0 ETH
197477982024-04-27 16:16:23127 days ago1714234583
0x0Bce6496...890B555ae
0 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x1F3AF672...C2D865e23
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
LOTM Renting Protocol Contract

Compiler Version
vyper:0.3.9

Optimization Enabled:
N/A

Other Settings:
None license
# @version 0.3.9

"""
@title LOTM Renting Protocol Contract
@author [Zharta](https://zharta.io/)
@notice This contract manages the renting process for NFTs in the LOTM Renting Protocol.
@dev This contract is the single user-facing contract for each Renting Market. It does not hold any assets, it manages the creation of vaults (as minimal proxies to the vault implementation) and delegates the calls to the vaults, with the exception of the admin functions.
"""

# Interfaces

interface ISelf:
    def tokenid_to_vault(token_id: uint256) -> address: view
    def is_vault_available(token_id: uint256) -> bool: view


interface IVault:
    def is_initialised() -> bool: view
    def initialise(owner: address): nonpayable
    def deposit(token_id: uint256, price: uint256, min_duration: uint256, max_duration: uint256, delegate: address): nonpayable
    def set_listing(state: VaultState, token_id: uint256, sender: address, price: uint256, min_duration: uint256, max_duration: uint256, delegate: address): nonpayable
    def start_rental(state: VaultState, renter: address, expiration: uint256, delegate: address, protocol_fee: uint256, protocol_wallet: address) -> Rental: nonpayable
    def close_rental(state: VaultState, sender: address) -> uint256: nonpayable
    def claim(state: VaultState, sender: address) -> (Rental, uint256, uint256): nonpayable
    def withdraw(state: VaultState, sender: address) -> (uint256, uint256): nonpayable
    def delegate_to_wallet(state: VaultState, sender: address, delegate: address): nonpayable


# Structs

struct TokenContext:
    token_id: uint256
    active_rental: Rental
    listing: Listing

struct VaultState:
    active_rental: Rental
    listing: Listing

struct Rental:
    id: bytes32 # keccak256 of the renter, token_id, start and expiration
    owner: address
    renter: address
    delegate: address
    token_id: uint256
    start: uint256
    min_expiration: uint256
    expiration: uint256
    amount: uint256
    protocol_fee: uint256
    protocol_wallet: address

struct Listing:
    token_id: uint256
    price: uint256 # price per hour, 0 means not listed
    min_duration: uint256 # min duration in hours
    max_duration: uint256 # max duration in hours, 0 means unlimited

struct VaultLog:
    vault: address
    token_id: uint256

struct RentalLog:
    id: bytes32
    vault: address
    owner: address
    token_id: uint256
    start: uint256
    min_expiration: uint256
    expiration: uint256
    amount: uint256
    protocol_fee: uint256
    protocol_wallet: address

struct RewardLog:
    vault: address
    token_id: uint256
    amount: uint256
    protocol_fee_amount: uint256
    active_rental_amount: uint256

struct WithdrawalLog:
    vault: address
    token_id: uint256
    rewards: uint256
    protocol_fee_amount: uint256


# Events

event VaultsCreated:
    owner: address
    nft_contract: address
    min_duration: uint256
    max_duration: uint256
    price: uint256
    vaults: DynArray[VaultLog, 32]
    delegate: address

event NftsDeposited:
    owner: address
    nft_contract: address
    min_duration: uint256
    max_duration: uint256
    price: uint256
    vaults: DynArray[VaultLog, 32]
    delegate: address

event NftsWithdrawn:
    owner: address
    nft_contract: address
    total_rewards: uint256
    withdrawals: DynArray[WithdrawalLog, 32]

event ListingsChanged:
    owner: address
    nft_contract: address
    min_duration: uint256
    max_duration: uint256
    price: uint256
    vaults: DynArray[VaultLog, 32]
    delegate: address

event ListingsCancelled:
    owner: address
    nft_contract: address
    vaults: DynArray[VaultLog, 32]
    delegate: address

event RentalStarted:
    renter: address
    delegate: address
    nft_contract: address
    rentals: DynArray[RentalLog, 32]

event RentalClosed:
    renter: address
    nft_contract: address
    rentals: DynArray[RentalLog, 32]

event RewardsClaimed:
    owner: address
    nft_contract: address
    rewards: DynArray[RewardLog, 32]

event DelegatedToWallet:
    owner: address
    delegate: address
    nft_contract: address
    vaults: DynArray[VaultLog, 32]

event ProtocolFeeSet:
    old_fee: uint256
    new_fee: uint256
    fee_wallet: address

event ProtocolWalletChanged:
    old_wallet: address
    new_wallet: address

event AdminProposed:
    admin: address
    proposed_admin: address

event OwnershipTransferred:
    old_admin: address
    new_admin: address


# Global Variables

_COLLISION_OFFSET: constant(bytes1) = 0xFF
_DEPLOYMENT_CODE: constant(bytes9) = 0x602D3D8160093D39F3
_PRE: constant(bytes10) = 0x363d3d373d3d3d363d73
_POST: constant(bytes15) = 0x5af43d82803e903d91602b57fd5bf3

vault_impl_addr: public(immutable(address))
payment_token_addr: public(immutable(address))
nft_contract_addr: public(immutable(address))
delegation_registry_addr: public(immutable(address))
max_protocol_fee: public(immutable(uint256))

protocol_wallet: public(address)
protocol_fee: public(uint256)
protocol_admin: public(address)
proposed_admin: public(address)

active_vaults: public(HashMap[uint256, address]) # token_id -> vault


##### EXTERNAL METHODS - WRITE #####

@external
def __init__(
    _vault_impl_addr: address,
    _payment_token_addr: address,
    _nft_contract_addr: address,
    _delegation_registry_addr: address,
    _max_protocol_fee: uint256,
    _protocol_fee: uint256,
    _protocol_wallet: address,
    _protocol_admin: address
):

    """
    @notice Initialize the renting contract with necessary parameters and addresses.
    @dev Sets up the contract by initializing various addresses and fees.
    @param _vault_impl_addr The address of the vault implementation.
    @param _payment_token_addr The address of the payment token.
    @param _nft_contract_addr The address of the NFT contract.
    @param _delegation_registry_addr The address of the delegation registry.
    @param _max_protocol_fee The maximum protocol fee that can be set.
    @param _protocol_fee The initial protocol fee.
    @param _protocol_wallet The wallet to receive protocol fees.
    @param _protocol_admin The administrator of the protocol.
    """

    assert _vault_impl_addr != empty(address), "vault impl is the zero addr"
    assert _payment_token_addr != empty(address), "payment token is the zero addr"
    assert _nft_contract_addr != empty(address), "nft contract is the zero addr"
    assert _delegation_registry_addr != empty(address), "deleg registry is the zero addr"
    assert _max_protocol_fee <= 10000, "max protocol fee > 100%"
    assert _protocol_fee <= _max_protocol_fee, "protocol fee > max fee"
    assert _protocol_wallet != empty(address), "protocol wallet not set"
    assert _protocol_admin != empty(address), "admin wallet not set"

    vault_impl_addr = _vault_impl_addr
    payment_token_addr = _payment_token_addr
    nft_contract_addr = _nft_contract_addr
    delegation_registry_addr = _delegation_registry_addr
    max_protocol_fee = _max_protocol_fee

    self.protocol_wallet = _protocol_wallet
    self.protocol_fee = _protocol_fee
    self.protocol_admin = _protocol_admin


@external
def create_vaults_and_deposit(token_ids: DynArray[uint256, 32], price: uint256, min_duration: uint256, max_duration: uint256, delegate: address):

    """
    @notice Create new vaults and deposit NFTs with specified listing terms.
    @dev Iterates over a list of token ids, creating vaults and depositing NFTs with the given listing terms.
    @param token_ids An array of NFT token ids to create vaults for and deposit.
    @param price Rental price per hour for each NFT, 0 meaning unlisted.
    @param min_duration Minimum rental duration in hours.
    @param max_duration Maximum rental duration in hours, 0 for unlimited.
    @param delegate Address to delegate the NFT to while listed.
    """

    vault_logs: DynArray[VaultLog, 32] = empty(DynArray[VaultLog, 32])

    for token_id in token_ids:
        vault: address = self._create_vault_and_deposit(token_id, price, min_duration, max_duration, delegate)
        vault_logs.append(VaultLog({
            vault: vault,
            token_id: token_id
        }))

    log VaultsCreated(
        msg.sender,
        nft_contract_addr,
        min_duration,
        max_duration,
        price,
        vault_logs,
        delegate
    )


@external
def deposit(token_ids: DynArray[uint256, 32], price: uint256, min_duration: uint256, max_duration: uint256, delegate: address):

    """
    @notice Deposit NFTs into existing vaults with specified listing terms.
    @dev Iterates over a list of token ids, depositing NFTs into their respective vaults with the given listing terms.
    @param token_ids An array of NFT token ids to deposit.
    @param price Rental price per hour for each NFT, 0 meaning unlisted.
    @param min_duration Minimum rental duration in hours.
    @param max_duration Maximum rental duration in hours, 0 for unlimited.
    @param delegate Address to delegate the NFT to while listed.
    """

    vault_logs: DynArray[VaultLog, 32] = empty(DynArray[VaultLog, 32])

    for token_id in token_ids:
        vault: address = self._deposit_nft(token_id, price, min_duration, max_duration, delegate)
        vault_logs.append(VaultLog({
            vault: vault,
            token_id: token_id
        }))

    log NftsDeposited(
        msg.sender,
        nft_contract_addr,
        min_duration,
        max_duration,
        price,
        vault_logs,
        delegate
    )


@external
def set_listings(
    token_contexts: DynArray[TokenContext, 32],
    price: uint256,
    min_duration: uint256,
    max_duration: uint256,
    delegate: address
):

    """
    @notice Set listings for multiple NFTs in their respective vaults.
    @dev Iterates over a list of token contexts, updating the listings with the given terms.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    @param price Rental price per hour for each NFT, 0 meaning unlisted.
    @param min_duration Minimum rental duration in hours.
    @param max_duration Maximum rental duration in hours, 0 for unlimited.
    @param delegate Address to delegate the NFT to while listed.
    """

    vault_logs: DynArray[VaultLog, 32] = empty(DynArray[VaultLog, 32])

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        IVault(vault).set_listing(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing
            }),
            token_context.token_id,
            msg.sender,
            price,
            min_duration,
            max_duration,
            delegate
        )

        vault_logs.append(VaultLog({
            vault: vault,
            token_id: token_context.token_id
        }))

    log ListingsChanged(
        msg.sender,
        nft_contract_addr,
        min_duration,
        max_duration,
        price,
        vault_logs,
        delegate,
    )

@external
def cancel_listings(token_contexts: DynArray[TokenContext, 32], delegate: address):

    """
    @notice Cancel listings for multiple NFTs in their respective vaults.
    @dev Iterates over a list of token contexts, canceling the listings in their respective vaults.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    @param delegate Address to delegate the NFT to while unlisted.
    """

    vaults: DynArray[VaultLog, 32] = empty(DynArray[VaultLog, 32])

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        IVault(vault).set_listing(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing
            }),
            token_context.token_id,
            msg.sender,
            0,
            0,
            0,
            delegate
        )

        vaults.append(VaultLog({
            vault: vault,
            token_id: token_context.token_id
        }))

    log ListingsCancelled(
        msg.sender,
        nft_contract_addr,
        vaults,
        delegate
    )


@external
def start_rentals(token_contexts: DynArray[TokenContext, 32], duration: uint256, delegate: address):

    """
    @notice Start rentals for multiple NFTs based on their token contexts.
    @dev Iterates over token contexts to begin rentals for each NFT in their respective vaults.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    @param duration The duration of the rentals in hours.
    @param delegate The address to delegate the NFT to during the rental period.
    """

    rental_logs: DynArray[RentalLog, 32] = []

    expiration: uint256 = block.timestamp + duration * 3600

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        rental: Rental = IVault(vault).start_rental(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing,
            }),
            msg.sender,
            expiration,
            delegate,
            self.protocol_fee,
            self.protocol_wallet
        )

        rental_logs.append(RentalLog({
            id: rental.id,
            vault: vault,
            owner: rental.owner,
            token_id: token_context.token_id,
            start: rental.start,
            min_expiration: rental.min_expiration,
            expiration: expiration,
            amount: rental.amount,
            protocol_fee: rental.protocol_fee,
            protocol_wallet: rental.protocol_wallet
        }))

    log RentalStarted(msg.sender, delegate, nft_contract_addr, rental_logs)


@external
def close_rentals(token_contexts: DynArray[TokenContext, 32]):

    """
    @notice Close rentals for multiple NFTs, allowing for early rental cancelation by the renter.
    @dev Iterates over token contexts to end rentals for each NFT in their respective vaults.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    """

    rental_logs: DynArray[RentalLog, 32] = []

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        amount: uint256 = IVault(vault).close_rental(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing
            }),
            msg.sender
        )

        rental_logs.append(RentalLog({
            id: token_context.active_rental.id,
            vault: vault,
            owner: token_context.active_rental.owner,
            token_id: token_context.active_rental.token_id,
            start: token_context.active_rental.start,
            min_expiration: token_context.active_rental.min_expiration,
            expiration: block.timestamp,
            amount: amount,
            protocol_fee: token_context.active_rental.protocol_fee,
            protocol_wallet: token_context.active_rental.protocol_wallet
        }))

    log RentalClosed(msg.sender, nft_contract_addr, rental_logs)


@external
def claim(token_contexts: DynArray[TokenContext, 32]):

    """
    @notice Claim rewards and protocol fees for multiple NFTs.
    @dev Iterates over token contexts to claim any unclaimed rewards and fees from the vaults.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    """

    reward_logs: DynArray[RewardLog, 32] = []
    active_rental: Rental = empty(Rental)
    rewards: uint256 = 0
    protocol_fee_amount: uint256 = 0

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        active_rental, rewards, protocol_fee_amount = IVault(vault).claim(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing
            }),
            msg.sender
        )

        reward_logs.append(RewardLog({
            vault: vault,
            token_id: token_context.token_id,
            amount: rewards,
            protocol_fee_amount: protocol_fee_amount,
            active_rental_amount: active_rental.amount
        }))

    log RewardsClaimed(msg.sender, nft_contract_addr, reward_logs)


@external
def withdraw(token_contexts: DynArray[TokenContext, 32]):

    """
    @notice Withdraw multiple NFTs and claim rewards and protocol fees.
    @dev Iterates over token contexts to withdraw NFTs from their vaults and claim any unclaimed rewards and fees.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    """

    withdrawal_log: DynArray[WithdrawalLog, 32] = empty(DynArray[WithdrawalLog, 32])
    total_rewards: uint256 = 0
    rewards: uint256 = 0
    protocol_fee_amount: uint256 = 0

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        self.active_vaults[token_context.token_id] = empty(address)

        rewards, protocol_fee_amount = IVault(vault).withdraw(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing
            }),
            msg.sender
        )

        withdrawal_log.append(WithdrawalLog({
            vault: vault,
            token_id: token_context.token_id,
            rewards: rewards,
            protocol_fee_amount: protocol_fee_amount
        }))
        total_rewards += rewards

    log NftsWithdrawn(
        msg.sender,
        nft_contract_addr,
        total_rewards,
        withdrawal_log
    )

@external
def delegate_to_wallet(token_contexts: DynArray[TokenContext, 32], delegate: address):

    """
    @notice Delegate NFTs to a specified wallet.
    @dev Iterates over token contexts to set the delegation of NFTs in their vaults.
    @param token_contexts An array of token contexts, each containing the vault state for an NFT.
    @param delegate The address to delegate the NFTs to.
    """

    vaults: DynArray[VaultLog, 32] = empty(DynArray[VaultLog, 32])

    for token_context in token_contexts:
        vault: address = self.active_vaults[token_context.token_id]
        assert vault != empty(address), "no vault exists for token_id"

        IVault(vault).delegate_to_wallet(
            VaultState({
                active_rental: token_context.active_rental,
                listing: token_context.listing
            }),
            msg.sender,
            delegate
        )

        vaults.append(VaultLog({
            vault: vault,
            token_id: token_context.token_id
        }))

    log DelegatedToWallet(
        msg.sender,
        delegate,
        nft_contract_addr,
        vaults,
    )

@external
def set_protocol_fee(protocol_fee: uint256):

    """
    @notice Set the protocol fee for the renting process.
    @dev Updates the protocol fee, ensuring it doesn't exceed the maximum allowed.
    @param protocol_fee The new protocol fee to be set, in bps (e.g., 500 for 5%).
    """

    assert msg.sender == self.protocol_admin, "not protocol admin"
    assert protocol_fee <= max_protocol_fee, "protocol fee > max fee"
    assert protocol_fee != self.protocol_fee, "protocol fee is the same"

    log ProtocolFeeSet(
        self.protocol_fee,
        protocol_fee,
        self.protocol_wallet
    )

    self.protocol_fee = protocol_fee


@external
def change_protocol_wallet(new_protocol_wallet: address):

    """
    @notice Change the wallet address that receives the protocol fees.
    @dev Updates the protocol wallet address.
    @param new_protocol_wallet The new address for the protocol wallet.
    """

    assert msg.sender == self.protocol_admin, "not protocol admin"
    assert new_protocol_wallet != empty(address), "wallet is the zero address"

    log ProtocolWalletChanged(
        self.protocol_wallet,
        new_protocol_wallet
    )

    self.protocol_wallet = new_protocol_wallet


@external
def propose_admin(_address: address):

    """
    @notice Propose a new administrator for the protocol.
    @dev Sets a new proposed admin, which needs to claim ownership to become effective.
    @param _address The address of the proposed new admin.
    """

    assert msg.sender == self.protocol_admin, "not the admin"
    assert _address != empty(address), "_address is the zero address"
    assert self.protocol_admin != _address, "proposed admin addr is the admin"
    assert self.proposed_admin != _address, "proposed admin addr is the same"

    self.proposed_admin = _address

    log AdminProposed(
        self.protocol_admin,
        _address
    )


@external
def claim_ownership():

    """
    @notice Claim the role of protocol administrator.
    @dev Finalizes the admin transfer process by setting the caller as the new admin.
    """

    assert msg.sender == self.proposed_admin, "not the proposed"

    log OwnershipTransferred(
        self.protocol_admin,
        self.proposed_admin
    )

    self.protocol_admin = self.proposed_admin
    self.proposed_admin = empty(address)


##### INTERNAL METHODS #####

@pure
@internal
def _compute_address(salt: bytes32, bytecode_hash: bytes32, deployer: address) -> address:
    """
    @dev An `internal` helper function that returns the address
         where a contract will be stored if deployed via `deployer`
         using the `CREATE2` opcode. Any change in the `bytecode_hash`
         or `salt` values will result in a new destination address.
    @param salt The 32-byte random value used to create the contract
           address.
    @param bytecode_hash The 32-byte bytecode digest of the contract
           creation bytecode.
    @param deployer The 20-byte deployer address.
    @return address The 20-byte address where a contract will be stored.
    """
    data: bytes32 = keccak256(concat(_COLLISION_OFFSET, convert(deployer, bytes20), salt, bytecode_hash))
    return self._convert_keccak256_2_address(data)


@pure
@internal
def _convert_keccak256_2_address(digest: bytes32) -> address:
    """
    @dev Converts a 32-byte keccak256 digest to an address.
    @param digest The 32-byte keccak256 digest.
    @return address The converted 20-byte address.
    """
    return convert(convert(digest, uint256) & convert(max_value(uint160), uint256), address)


@internal
def _create_vault_and_deposit(token_id: uint256, price: uint256, min_duration: uint256, max_duration: uint256, delegate: address) -> address:
    assert self.active_vaults[token_id] == empty(address), "vault exists for token_id"

    vault: address = create_minimal_proxy_to(vault_impl_addr, salt=convert(token_id, bytes32))

    self.active_vaults[token_id] = vault

    IVault(vault).initialise(msg.sender)
    IVault(vault).deposit(token_id, price, min_duration, max_duration, delegate)

    return vault


@internal
def _deposit_nft(token_id: uint256, price: uint256, min_duration: uint256, max_duration: uint256, delegate: address) -> address:
    assert ISelf(self).is_vault_available(token_id), "vault is not available"

    vault: address = ISelf(self).tokenid_to_vault(token_id)
    self.active_vaults[token_id] = vault

    IVault(vault).initialise(msg.sender)

    IVault(vault).deposit(token_id, price, min_duration, max_duration, delegate)

    return vault


##### EXTERNAL METHODS - VIEW #####

@view
@external
def is_vault_available(token_id: uint256) -> bool:

    """
    @notice Check if a vault is available for a given NFT token id.
    @dev Determines if a vault exists and is available, ie not in use.
    @param token_id The NFT token id to check.
    @return True if the vault is available, False otherwise.
    """

    vault: address = ISelf(self).tokenid_to_vault(token_id)
    return self.active_vaults[token_id] == empty(address) and vault.is_contract and not IVault(vault).is_initialised()


@view
@external
def tokenid_to_vault(token_id: uint256) -> address:

    """
    @notice Get the vault address for a given NFT token id.
    @dev Computes the address of the vault (existent or yet to be created) associated with the specified token id.
    @param token_id The NFT token id.
    @return The address of the vault associated with the given token id.
    """

    return self._compute_address(
        convert(token_id, bytes32),
        keccak256(concat(
            _DEPLOYMENT_CODE,
            _PRE,
            convert(vault_impl_addr, bytes20),
            _POST
        )),
        self
    )


@view
@external
def get_nft_contract() -> address:
    return nft_contract_addr


@view
@external
def get_payment_token() -> address:
    return payment_token_addr


@view
@external
def get_delegation_registry() -> address:
    return delegation_registry_addr

Contract Security Audit

Contract ABI

[{"name":"VaultsCreated","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"min_duration","type":"uint256","indexed":false},{"name":"max_duration","type":"uint256","indexed":false},{"name":"price","type":"uint256","indexed":false},{"name":"vaults","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"}],"indexed":false},{"name":"delegate","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"NftsDeposited","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"min_duration","type":"uint256","indexed":false},{"name":"max_duration","type":"uint256","indexed":false},{"name":"price","type":"uint256","indexed":false},{"name":"vaults","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"}],"indexed":false},{"name":"delegate","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"NftsWithdrawn","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"total_rewards","type":"uint256","indexed":false},{"name":"withdrawals","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"},{"name":"rewards","type":"uint256"},{"name":"protocol_fee_amount","type":"uint256"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"ListingsChanged","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"min_duration","type":"uint256","indexed":false},{"name":"max_duration","type":"uint256","indexed":false},{"name":"price","type":"uint256","indexed":false},{"name":"vaults","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"}],"indexed":false},{"name":"delegate","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ListingsCancelled","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"vaults","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"}],"indexed":false},{"name":"delegate","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"RentalStarted","inputs":[{"name":"renter","type":"address","indexed":false},{"name":"delegate","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"rentals","type":"tuple[]","components":[{"name":"id","type":"bytes32"},{"name":"vault","type":"address"},{"name":"owner","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"RentalClosed","inputs":[{"name":"renter","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"rentals","type":"tuple[]","components":[{"name":"id","type":"bytes32"},{"name":"vault","type":"address"},{"name":"owner","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"RewardsClaimed","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"rewards","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee_amount","type":"uint256"},{"name":"active_rental_amount","type":"uint256"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"DelegatedToWallet","inputs":[{"name":"owner","type":"address","indexed":false},{"name":"delegate","type":"address","indexed":false},{"name":"nft_contract","type":"address","indexed":false},{"name":"vaults","type":"tuple[]","components":[{"name":"vault","type":"address"},{"name":"token_id","type":"uint256"}],"indexed":false}],"anonymous":false,"type":"event"},{"name":"ProtocolFeeSet","inputs":[{"name":"old_fee","type":"uint256","indexed":false},{"name":"new_fee","type":"uint256","indexed":false},{"name":"fee_wallet","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ProtocolWalletChanged","inputs":[{"name":"old_wallet","type":"address","indexed":false},{"name":"new_wallet","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"AdminProposed","inputs":[{"name":"admin","type":"address","indexed":false},{"name":"proposed_admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"OwnershipTransferred","inputs":[{"name":"old_admin","type":"address","indexed":false},{"name":"new_admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_vault_impl_addr","type":"address"},{"name":"_payment_token_addr","type":"address"},{"name":"_nft_contract_addr","type":"address"},{"name":"_delegation_registry_addr","type":"address"},{"name":"_max_protocol_fee","type":"uint256"},{"name":"_protocol_fee","type":"uint256"},{"name":"_protocol_wallet","type":"address"},{"name":"_protocol_admin","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"create_vaults_and_deposit","inputs":[{"name":"token_ids","type":"uint256[]"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"deposit","inputs":[{"name":"token_ids","type":"uint256[]"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_listings","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"cancel_listings","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"start_rentals","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]},{"name":"duration","type":"uint256"},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"close_rentals","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"claim","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"delegate_to_wallet","inputs":[{"name":"token_contexts","type":"tuple[]","components":[{"name":"token_id","type":"uint256"},{"name":"active_rental","type":"tuple","components":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"},{"name":"renter","type":"address"},{"name":"delegate","type":"address"},{"name":"token_id","type":"uint256"},{"name":"start","type":"uint256"},{"name":"min_expiration","type":"uint256"},{"name":"expiration","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"protocol_fee","type":"uint256"},{"name":"protocol_wallet","type":"address"}]},{"name":"listing","type":"tuple","components":[{"name":"token_id","type":"uint256"},{"name":"price","type":"uint256"},{"name":"min_duration","type":"uint256"},{"name":"max_duration","type":"uint256"}]}]},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_protocol_fee","inputs":[{"name":"protocol_fee","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"change_protocol_wallet","inputs":[{"name":"new_protocol_wallet","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"propose_admin","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"claim_ownership","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"is_vault_available","inputs":[{"name":"token_id","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"tokenid_to_vault","inputs":[{"name":"token_id","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_nft_contract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_payment_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_delegation_registry","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"vault_impl_addr","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"payment_token_addr","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"nft_contract_addr","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"delegation_registry_addr","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"max_protocol_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"protocol_wallet","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"protocol_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"protocol_admin","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"proposed_admin","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"active_vaults","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}]}]

Deployed Bytecode

0x6003361161000c57612b9c565b5f3560e01c34612f625763fe80cbc08118610033576020612f735f395f5160405260206040f35b635d6bc8c58118610050576020612f935f395f5160405260206040f35b6304cca53b811861006d576020612fb35f395f5160405260206040f35b638afbd8ce811861008a576020612fd35f395f5160405260206040f35b635fb8322181186100a7576020612ff35f395f5160405260206040f35b6367db749981186100bd575f5460405260206040f35b631655273281186100d45760015460405260206040f35b63d9aa692481186100eb5760025460405260206040f35b63abf6141781186101025760035460405260206040f35b63f5d699de811861012d5760243610612f625760046004356020525f5260405f205460405260206040f35b63941f5bcb81186102b65760c43610612f62576004356004016020813511612f62578035602082018160051b80826101e0375050806101c05250506084358060a01c612f62576105e0525f610600525f6101c05160208111612f625780156101fe57905b8060051b6101e00151610e2052610e2051604052606060246060376105e05160c0526101be610e60612ba0565b610e6051610e405261060051601f8111612f62578060061b61062001610e40518152610e2051602082015250600181016106005250600101818118610191575b50507ff540bd3f500decf52df8e0cc191154819fa1ad815d44db6aacbb9d361f194bd260e033610e20526020612fb35f395f51610e405260406044610e6037602435610ea05280610ec05280610e20015f610600518083528060061b5f8260208111612f6257801561029857905b8060061b60208701018160061b610620018051825260208101516020830152505060010181811861026c575b505082016020019150509050810190506105e051610ee052610e20a1005b630eea0087811861043f5760c43610612f62576004356004016020813511612f62578035602082018160051b80826101e0375050806101c05250506084358060a01c612f62576105e0525f610600525f6101c05160208111612f6257801561038757905b8060051b6101e00151610e2052610e2051604052606060246060376105e05160c052610347610e60612d1b565b610e6051610e405261060051601f8111612f62578060061b61062001610e40518152610e205160208201525060018101610600525060010181811861031a575b50507fb2f81edd9cc49f0f0c690b0701d32fa8b03c9ef872e23a54f60115a95337cc4060e033610e20526020612fb35f395f51610e405260406044610e6037602435610ea05280610ec05280610e20015f610600518083528060061b5f8260208111612f6257801561042157905b8060061b60208701018160061b61062001805182526020810151602083015250506001018181186103f5575b505082016020019150509050810190506105e051610ee052610e20a1005b636b8c855b811861085e5760c43610612f62576004356004016020813511612f625780355f8160208111612f6257801561055c57905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f62576101408301525050610180820161018082018035825260208101356020830152604081013560408301526060810135606083015250505050600101818118610475575b50508060405250506084358060a01c612f6257614060525f614080525f60405160208111612f625780156107a657905b8060091b60600180516148a0526020810180516148c05260208101516148e05260408101516149005260608101516149205260808101516149405260a08101516149605260c08101516149805260e08101516149a0526101008101516149c0526101208101516149e052610140810151614a00525061018081018051614a20526020810151614a40526040810151614a60526060810151614a8052505060046148a0516020525f5260405f2054614aa052614aa0516106aa57601c614ac0527f6e6f207661756c742065786973747320666f7220746f6b656e5f696400000000614ae052614ac050614ac05180614ae001601f825f031636823750506308c379a0614a80526020614aa052601f19601f614ac0510116604401614a9cfd5b614aa051637ab94167614ac0526148c051614ae0526148e051614b005261490051614b205261492051614b405261494051614b605261496051614b805261498051614ba0526149a051614bc0526149c051614be0526149e051614c0052614a0051614c2052614a2051614c4052614a4051614c6052614a6051614c8052614a8051614ca0526148a051614cc05233614ce05260606024614d003761406051614d6052803b15612f62575f614ac06102a4614adc5f855af161076d573d5f5f3e3d5ffd5b5061408051601f8111612f62578060061b6140a001614aa05181526148a05160208201525060018101614080525060010181811861058c575b50507f8bb1034cc02572a6ade2b04b8761e9847724df461ce431b75645004c24709f2160e0336148a0526020612fb35f395f516148c052604060446148e037602435614920528061494052806148a0015f614080518083528060061b5f8260208111612f6257801561084057905b8060061b60208701018160061b6140a00180518252602081015160208301525050600101818118610814575b5050820160200191505090508101905061406051614960526148a0a1005b636acfeed68118610c6d5760643610612f62576004356004016020813511612f625780355f8160208111612f6257801561097b57905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f62576101408301525050610180820161018082018035825260208101356020830152604081013560408301526060810135606083015250505050600101818118610894575b50508060405250506024358060a01c612f6257614060525f614080525f60405160208111612f62578015610bc457905b8060091b60600180516148a0526020810180516148c05260208101516148e05260408101516149005260608101516149205260808101516149405260a08101516149605260c08101516149805260e08101516149a0526101008101516149c0526101208101516149e052610140810151614a00525061018081018051614a20526020810151614a40526040810151614a60526060810151614a8052505060046148a0516020525f5260405f2054614aa052614aa051610ac957601c614ac0527f6e6f207661756c742065786973747320666f7220746f6b656e5f696400000000614ae052614ac050614ac05180614ae001601f825f031636823750506308c379a0614a80526020614aa052601f19601f614ac0510116604401614a9cfd5b614aa051637ab94167614ac0526148c051614ae0526148e051614b005261490051614b205261492051614b405261494051614b605261496051614b805261498051614ba0526149a051614bc0526149c051614be0526149e051614c0052614a0051614c2052614a2051614c4052614a4051614c6052614a6051614c8052614a8051614ca0526148a051614cc05233614ce052606036614d003761406051614d6052803b15612f62575f614ac06102a4614adc5f855af1610b8b573d5f5f3e3d5ffd5b5061408051601f8111612f62578060061b6140a001614aa05181526148a0516020820152506001810161408052506001018181186109ab575b50507f4e68b1b0ec72def03d12ecf30d1464bc8d00398ce94fd50fa6194e5457d923266080336148a0526020612fb35f395f516148c052806148e052806148a0015f614080518083528060061b5f8260208111612f62578015610c4f57905b8060061b60208701018160061b6140a00180518252602081015160208301525050600101818118610c23575b5050820160200191505090508101905061406051614900526148a0a1005b6363df82e781186112305760843610612f62576004356004016020813511612f625780355f8160208111612f62578015610d8a57905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f62576101408301525050610180820161018082018035825260208101356020830152604081013560408301526060810135606083015250505050600101818118610ca3575b50508060405250506044358060a01c612f6257614060525f6140805242602435610e10810281610e10820418612f62579050808201828110612f6257905090506168a0525f60405160208111612f6257801561113057905b8060091b60600180516168c0526020810180516168e05260208101516169005260408101516169205260608101516169405260808101516169605260a08101516169805260c08101516169a05260e08101516169c0526101008101516169e052610120810151616a0052610140810151616a20525061018081018051616a40526020810151616a60526040810151616a80526060810151616aa052505060046168c0516020525f5260405f2054616ac052616ac051610f0057601c616ae0527f6e6f207661756c742065786973747320666f7220746f6b656e5f696400000000616b0052616ae050616ae05180616b0001601f825f031636823750506308c379a0616aa0526020616ac052601f19601f616ae0510116604401616abcfd5b616ac051631b9b938c616c40526168e051616c605261690051616c805261692051616ca05261694051616cc05261696051616ce05261698051616d00526169a051616d20526169c051616d40526169e051616d6052616a0051616d8052616a2051616da052616a4051616dc052616a6051616de052616a8051616e0052616aa051616e205233616e40526168a051616e605261406051616e8052600154616ea0525f54616ec052610160616c40610284616c5c5f855af1610fc3573d5f5f3e3d5ffd5b6101603d10612f6257616c4051616ee052616c60518060a01c612f6257616f0052616c80518060a01c612f6257616f2052616ca0518060a01c612f6257616f4052616cc051616f6052616ce051616f8052616d0051616fa052616d2051616fc052616d4051616fe052616d605161700052616d80518060a01c612f625761702052616ee090508051616ae0526020810151616b00526040810151616b20526060810151616b40526080810151616b605260a0810151616b805260c0810151616ba05260e0810151616bc052610100810151616be052610120810151616c0052610140810151616c20525061408051601f8111612f625761014081026140a001616ae0518152616ac0516020820152616b005160408201526168c0516060820152616b80516080820152616ba05160a08201526168a05160c0820152616be05160e0820152616c0051610100820152616c205161012082015250600181016140805250600101818118610de2575b50507f4f963e45b1ee871ffc1daf88d84511ac5b8e86e7bbb6d5f8f52a4405384a947a6080336168c052614060516168e0526020612fb35f395f51616900528061692052806168c0015f6140805180835261014081025f8260208111612f6257801561121a57905b6101408102602087010161014082026140a001805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008101516101008301526101208101516101208301525050600101818118611198575b505082016020019150509050810190506168c0a1005b633b51f4b281186116bb5760443610612f62576004356004016020813511612f625780355f8160208111612f6257801561134d57905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f62576101408301525050610180820161018082018035825260208101356020830152604081013560408301526060810135606083015250505050600101818118611266575b50508060405250505f614060525f60405160208111612f625780156115c357905b8060091b6060018051616880526020810180516168a05260208101516168c05260408101516168e05260608101516169005260808101516169205260a08101516169405260c08101516169605260e0810151616980526101008101516169a0526101208101516169c0526101408101516169e0525061018081018051616a00526020810151616a20526040810151616a40526060810151616a605250506004616880516020525f5260405f2054616a8052616a805161148c57601c616aa0527f6e6f207661756c742065786973747320666f7220746f6b656e5f696400000000616ac052616aa050616aa05180616ac001601f825f031636823750506308c379a0616a60526020616a8052601f19601f616aa0510116604401616a7cfd5b616a8051639d827f71616ac0526168a051616ae0526168c051616b00526168e051616b205261690051616b405261692051616b605261694051616b805261696051616ba05261698051616bc0526169a051616be0526169c051616c00526169e051616c2052616a0051616c4052616a2051616c6052616a4051616c8052616a6051616ca05233616cc0526020616ac0610204616adc5f855af1611531573d5f5f3e3d5ffd5b60203d10612f6257616ac0905051616aa05261406051601f8111612f62576101408102614080016168a0518152616a805160208201526168c05160408201526169205160608201526169405160808201526169605160a08201524260c0820152616aa05160e08201526169c0516101008201526169e0516101208201525060018101614060525060010181811861136e575b50507f8cd83aef45ff0b44bcbcee50bfcde42d75f5a4d5010457b8e79a4585c320439e606033616880526020612fb35f395f516168a052806168c05280616880015f6140605180835261014081025f8260208111612f625780156116a557905b61014081026020870101610140820261408001805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008101516101008301526101208101516101208301525050600101818118611623575b50508201602001915050905081019050616880a1005b63edf243868118611bec5760443610612f62576004356004016020813511612f625780355f8160208111612f625780156117d857905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f625761014083015250506101808201610180820180358252602081013560208301526040810135604083015260608101356060830152505050506001018181186116f1575b50508060405250505f6140605261016036615480376040366155e0375f60405160208111612f62578015611b2d57905b8060091b6060018051615620526020810180516156405260208101516156605260408101516156805260608101516156a05260808101516156c05260a08101516156e05260c08101516157005260e08101516157205261010081015161574052610120810151615760526101408101516157805250610180810180516157a05260208101516157c05260408101516157e05260608101516158005250506004615620516020525f5260405f2054615820526158205161192657601c615840527f6e6f207661756c742065786973747320666f7220746f6b656e5f6964000000006158605261584050615840518061586001601f825f031636823750506308c379a061580052602061582052601f19601f61584051011660440161581cfd5b61582051631c730bcc6158405261564051615860526156605161588052615680516158a0526156a0516158c0526156c0516158e0526156e051615900526157005161592052615720516159405261574051615960526157605161598052615780516159a0526157a0516159c0526157c0516159e0526157e051615a005261580051615a205233615a40526101a061584061020461585c5f855af16119cc573d5f5f3e3d5ffd5b6101a03d10612f625761584051615a6052615860518060a01c612f6257615a8052615880518060a01c612f6257615aa0526158a0518060a01c612f6257615ac0526158c051615ae0526158e051615b005261590051615b205261592051615b405261594051615b605261596051615b8052615980518060a01c612f6257615ba0526159a051615bc0526159c051615be052615a60905080516154805260208101516154a05260408101516154c05260608101516154e05260808101516155005260a08101516155205260c08101516155405260e081015161556052610100810151615580526101208101516155a0526101408101516155c0526101608101516155e052610180810151615600525061406051601f8111612f625760a08102614080016158205181526156205160208201526155e051604082015261560051606082015261558051608082015250600181016140605250600101818118611808575b50507f5ce001d3b84e2d2a6a1e2ea3dcc6fb945ca1514733f138a2912d8630e8e5f213606033615620526020612fb35f395f5161564052806156605280615620015f6140605180835260a081025f8260208111612f62578015611bd657905b60a08102602087010160a082026140800180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050600101818118611b8c575b50508201602001915050905081019050615620a1005b63d67aa17181186120485760443610612f62576004356004016020813511612f625780355f8160208111612f62578015611d0957905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f62576101408301525050610180820161018082018035825260208101356020830152604081013560408301526060810135606083015250505050600101818118611c22575b50508060405250505f614060525f615080526040366150a0375f60405160208111612f62578015611f8b57905b8060091b60600180516150e0526020810180516151005260208101516151205260408101516151405260608101516151605260808101516151805260a08101516151a05260c08101516151c05260e08101516151e05261010081015161520052610120810151615220526101408101516152405250610180810180516152605260208101516152805260408101516152a05260608101516152c052505060046150e0516020525f5260405f20546152e0526152e051611e5457601c615300527f6e6f207661756c742065786973747320666f7220746f6b656e5f6964000000006153205261530050615300518061532001601f825f031636823750506308c379a06152c05260206152e052601f19601f6153005101166044016152dcfd5b5f60046150e0516020525f5260405f20556152e0516390fe63a1615300526151005161532052615120516153405261514051615360526151605161538052615180516153a0526151a0516153c0526151c0516153e0526151e051615400526152005161542052615220516154405261524051615460526152605161548052615280516154a0526152a0516154c0526152c0516154e0523361550052604061530061020461531c5f855af1611f0a573d5f5f3e3d5ffd5b60403d10612f6257615300905080516150a05260208101516150c0525061406051601f8111612f62578060071b614080016152e05181526150e05160208201526150a05160408201526150c051606082015250600181016140605250615080516150a051808201828110612f62579050905061508052600101818118611d36575b50507f75db1e0f514912330c97aa13445425933e319ebf310da139421af35399fa8bb26080336150e0526020612fb35f395f516151005261508051615120528061514052806150e0015f614060518083528060071b5f8260208111612f6257801561203257905b8060071b60208701018160071b61408001805182526020810151602083015260408101516040830152606081015160608301525050600101818118611ff2575b505082016020019150509050810190506150e0a1005b634bf7dce981186124485760643610612f62576004356004016020813511612f625780355f8160208111612f6257801561216557905b8060091b6060018160091b60208601018035825260208201602082018035825260208101358060a01c612f6257602083015260408101358060a01c612f6257604083015260608101358060a01c612f625760608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e08301526101008101356101008301526101208101356101208301526101408101358060a01c612f6257610140830152505061018082016101808201803582526020810135602083015260408101356040830152606081013560608301525050505060010181811861207e575b50508060405250506024358060a01c612f6257614060525f614080525f60405160208111612f6257801561239f57905b8060091b60600180516148a0526020810180516148c05260208101516148e05260408101516149005260608101516149205260808101516149405260a08101516149605260c08101516149805260e08101516149a0526101008101516149c0526101208101516149e052610140810151614a00525061018081018051614a20526020810151614a40526040810151614a60526060810151614a8052505060046148a0516020525f5260405f2054614aa052614aa0516122b357601c614ac0527f6e6f207661756c742065786973747320666f7220746f6b656e5f696400000000614ae052614ac050614ac05180614ae001601f825f031636823750506308c379a0614a80526020614aa052601f19601f614ac0510116604401614a9cfd5b614aa051634992efb3614ac0526148c051614ae0526148e051614b005261490051614b205261492051614b405261494051614b605261496051614b805261498051614ba0526149a051614bc0526149c051614be0526149e051614c0052614a0051614c2052614a2051614c4052614a4051614c6052614a6051614c8052614a8051614ca05233614cc05261406051614ce052803b15612f62575f614ac0610224614adc5f855af1612366573d5f5f3e3d5ffd5b5061408051601f8111612f62578060061b6140a001614aa05181526148a051602082015250600181016140805250600101818118612195575b50507f7fcaf5307ea3e5c35bd915f8a03c59f2a94386a469ebd9833192f0dcb8af92ae6080336148a052614060516148c0526020612fb35f395f516148e0528061490052806148a0015f614080518083528060061b5f8260208111612f6257801561243257905b8060061b60208701018160061b6140a00180518252602081015160208301525050600101818118612406575b505082016020019150509050810190506148a0a1005b63c2b82de481186125d25760243610612f62576002543318156124c05760126040527f6e6f742070726f746f636f6c2061646d696e000000000000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b6020612ff35f395f51600435111561252d5760166040527f70726f746f636f6c20666565203e206d6178206665650000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b600154600435186125935760186040527f70726f746f636f6c20666565206973207468652073616d65000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b7faf7807c71b0e34bca82bd3067b4b5a4c760067c32fd82f2a714ef2624a33ce436001546040526004356060525f5460805260606040a1600435600155005b6372e76f1381186126f45760243610612f62576004358060a01c612f62576040526002543318156126595760126060527f6e6f742070726f746f636f6c2061646d696e000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516126bc57601a6060527f77616c6c657420697320746865207a65726f206164647265737300000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b7f6defa6e1a7dcc97f459fb552cf25427ab19cd60692b94e4f38660850a6e917e85f5460605260405160805260406060a16040515f55005b635f11b0a181186128e65760243610612f62576004358060a01c612f625760405260025433181561277b57600d6060527f6e6f74207468652061646d696e0000000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516127de57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600254186128455760206060527f70726f706f7365642061646d696e2061646472206973207468652061646d696e60805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600354186128ac57601f6060527f70726f706f7365642061646d696e2061646472206973207468652073616d650060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516003557ffd22260ca7b3d2a5f6332770491ab546b6235bc73909c334f5e304d2fae455b160025460605260405160805260406060a1005b63f7a79a028118612994576003543318156129565760106040527f6e6f74207468652070726f706f7365640000000000000000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060025460405260035460605260406040a16003546002555f600355005b63c1f285b58118612a5b5760243610612f62573063b6b92522606052600435608052602060606024607c845afa6129cd573d5f5f3e3d5ffd5b60203d10612f62576060518060a01c612f625760a05260a090505160405260046004356020525f5260405f2054612a50576040513b15612a4a5760405163a9c3f664606052602060606004607c845afa612a29573d5f5f3e3d5ffd5b60203d10612f62576060518060011c612f625760a05260a090505115612a52565b5f612a52565b5f5b60c052602060c0f35b63b6b925228118612b435760243610612f625760206004356060525f7f602d3d8160093d39f300000000000000000000000000000000000000000000008161018001526009810190507f363d3d373d3d3d363d7300000000000000000000000000000000000000000000816101800152600a810190506020612f735f395f518060601b90508161018001526014810190507f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000816101800152600f81019050806101605261016090508051602082012090506080523060a052612b3e6101c0612ed5565b6101c0f35b6357acc1b68118612b60576020612fb35f395f5160405260206040f35b63018ec85b8118612b7d576020612f935f395f5160405260206040f35b638593e6018118612b9a576020612fd35f395f5160405260206040f35b505b5f5ffd5b60046040516020525f5260405f205415612c1257601960e0527f7661756c742065786973747320666f7220746f6b656e5f6964000000000000006101005260e05060e0518061010001601f825f031636823750506308c379a060a052602060c052601f19601f60e051011660440160bcfd5b7f602d3d8160093d39f3363d3d373d3d3d363d7300000000000000000000000000610100526020612f735f395f5160601b610113527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006101275260405160366101005ff58015612f625760e05260e05160046040516020525f5260405f205560e051639d6a890f610100523361012052803b15612f62575f610100602461011c5f855af1612cc2573d5f5f3e3d5ffd5b5060e05163365d0ed76101005260405161012052606051610140526080516101605260a0516101805260c0516101a052803b15612f62575f61010060a461011c5f855af1612d12573d5f5f3e3d5ffd5b5060e051815250565b3063c1f285b560e05260405161010052602060e0602460fc845afa612d42573d5f5f3e3d5ffd5b60203d10612f625760e0518060011c612f625761012052610120905051612dc8576016610140527f7661756c74206973206e6f7420617661696c61626c65000000000000000000006101605261014050610140518061016001601f825f031636823750506308c379a061010052602061012052601f19601f61014051011660440161011cfd5b3063b6b9252261010052604051610120526020610100602461011c845afa612df2573d5f5f3e3d5ffd5b60203d10612f6257610100518060a01c612f62576101405261014090505160e05260e05160046040516020525f5260405f205560e051639d6a890f610100523361012052803b15612f62575f610100602461011c5f855af1612e56573d5f5f3e3d5ffd5b5060e05163365d0ed76101005260405161012052606051610140526080516101605260a0516101805260c0516101a052803b15612f62575f61010060a461011c5f855af1612ea6573d5f5f3e3d5ffd5b5060e051815250565b73ffffffffffffffffffffffffffffffffffffffff604051168060a01c612f6257815250565b5f7fff0000000000000000000000000000000000000000000000000000000000000081610100015260018101905060a0518060601b90508161010001526014810190506060518161010001526020810190506080518161010001526020810190508060e05260e0905080516020820120905060c05260c051604052612f5a60e0612eaf565b60e051815250565b5f80fda165767970657283000309000b000000000000000000000000f73108afca1e0a662604f8f062cdb6faa8661a7a0000000000000000000000004d224452801aced8b2f0aebe155379bb5d5943810000000000000000000000003bdca51226202fc2a64211aa35a8d95d61c6ca99000000000000000000000000c3aa9bc72bd623168860a1e5c6a4530d3d80456c00000000000000000000000000000000000000000000000000000000000003e8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.