Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 13 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
20154891 | 37 days ago | 0 ETH | |||||
20154891 | 37 days ago | 0 ETH | |||||
20154891 | 37 days ago | 0 ETH | |||||
20154891 | 37 days ago | 0 ETH | |||||
20154891 | 37 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | 0 ETH | |||||
20032915 | 54 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Minimal Proxy Contract for 0xf350533c3003f6a2df04656a81e911789a987faa
Contract Name:
Zharta Renting Vault Contract
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# @version 0.3.10 """ @title Zharta Renting Vault Contract @author [Zharta](https://zharta.io/) @notice This contract is the vault implementation for the LOTM Renting Protocol. @dev This is the implementation contract for each vault, which is deployed as a minimal proxy (ERC1167) by `RentingV3.vy` and accepts only calls from it. This contract holds the assets (NFTs) ) but does not store any information regarding the token, so pre-conditions must be validated by the caller (`RentingV3.vy`). It implement the functions required for token delegation and staking. Delegations are performed by warm.xyz HotWalletProxy. """ # Interfaces from vyper.interfaces import ERC20 as IERC20 from vyper.interfaces import ERC721 as IERC721 interface IDelegationRegistry: def getHotWallet(cold_wallet: address) -> address: view def setHotWallet(hot_wallet_address: address, expiration_timestamp: uint256, lock_hot_wallet_address: bool): nonpayable def setExpirationTimestamp(expiration_timestamp: uint256): nonpayable # Structs struct SingleNft: tokenId: uint32 amount: uint224 # Global Variables caller: public(address) payment_token: public(immutable(IERC20)) nft_contract: public(immutable(IERC721)) delegation_registry: public(immutable(IDelegationRegistry)) ##### EXTERNAL METHODS - WRITE ##### @payable @external def __init__( _payment_token_addr: address, _nft_contract_addr: address, _delegation_registry_addr: address, ): """ @dev Sets up the contract by initializing the payment token, NFT contract, delegation registry and staking contract addresses. @param _payment_token_addr The address of the payment token contract. @param _nft_contract_addr The address of the NFT contract. @param _delegation_registry_addr The address of the delegation registry contract. """ assert _payment_token_addr != empty(address), "payment token addr not set" assert _nft_contract_addr != empty(address), "nft contract addr not set" assert _delegation_registry_addr != empty(address), "delegation addr not set" payment_token = IERC20(_payment_token_addr) nft_contract = IERC721(_nft_contract_addr) delegation_registry = IDelegationRegistry(_delegation_registry_addr) # Functions @external def initialise(): """ @notice Initialize a vault contract, setting the caller as the contract deployer. @dev Ensures that the vault is not already initialized. """ assert self.caller == empty(address), "already initialised" self.caller = msg.sender @external def deposit(token_id: uint256, nft_owner: address, delegate: address): """ @notice Deposit an NFT into the vault and optionaly sets up delegation. @dev Transfers the NFT from the owner to the vault and optionally sets up delegation. @param token_id The id of the NFT to be deposited. @param nft_owner The address of the NFT owner. @param delegate The address to delegate the NFT to. If empty no delegation is done. """ assert msg.sender == self.caller, "not caller" nft_contract.safeTransferFrom(nft_owner, self, token_id, b"") if delegate != empty(address): self._delegate_to_wallet(delegate, max_value(uint256)) @external def withdraw(token_id: uint256, wallet: address): """ @notice Withdraw an NFT from the vault and transfer it to the wallet. @dev Transfers the NFT from the vault to the wallet and clears the delegation. @param token_id The id of the NFT to be withdrawn. @param wallet The address of the wallet to receive the NFT. """ assert msg.sender == self.caller, "not caller" nft_contract.safeTransferFrom(self, wallet, token_id, b"") self._delegate_to_wallet(empty(address), 0) @external def delegate_to_wallet(delegate: address, expiration: uint256): """ @notice Delegate the NFT to a wallet. @dev Delegates the NFT to the given address. @param delegate The address to delegate the NFT to. @param expiration The expiration timestamp for the delegation. """ assert msg.sender == self.caller, "not caller" self._delegate_to_wallet(delegate, expiration) @external def staking_deposit(sender: address, amount: uint256, token_id: uint256, staking_addr: address, pool_method_id: bytes4): """ @notice Deposit the payment token into the staking contract. @dev Deposits the payment token into the staking contract. @param sender The address of the payment token sender. @param amount The amount of the payment token to deposit. @param token_id The id of the NFT supporting the deposit, which must be deposited in the vault. @param staking_addr The address of the staking contract. @param pool_method_id The method id of the staking pool deposit function. """ assert msg.sender == self.caller, "not caller" self._staking_deposit(sender, amount, token_id, staking_addr, pool_method_id) @external def staking_withdraw(wallet: address, amount: uint256, token_id: uint256, staking_addr: address, pool_method_id: bytes4): """ @notice Withdraw the payment token from the staking contract. @dev Withdraws the payment token from the staking contract. @param wallet The address of the wallet to receive the payment token. @param amount The amount of the payment token to withdraw. @param token_id The id of the NFT supporting the withdrawal, which must be deposited in the vault. @param staking_addr The address of the staking contract. @param pool_method_id The method id of the staking pool withdraw function. """ assert msg.sender == self.caller, "not caller" self._staking_withdraw(wallet, amount, token_id, staking_addr, pool_method_id) @external def staking_claim(wallet: address, token_id: uint256, staking_addr: address, pool_method_id: bytes4): """ @notice Claim the staking rewards. @dev Claims the staking rewards. @param wallet The address of the wallet to receive the staking rewards. @param token_id The id of the NFT supporting the claim, which must be deposited in the vault. @param staking_addr The address of the staking contract. @param pool_method_id The method id of the staking pool claim function. """ assert msg.sender == self.caller, "not caller" self._staking_claim(wallet, token_id, staking_addr, pool_method_id) @external def staking_compound(token_id: uint256, staking_addr: address, pool_claim_method_id: bytes4, pool_deposit_method_id: bytes4): """ @notice Compound the staking rewards. @dev Compounds the staking rewards by claiming and depositing them. No validations are performed regarding staking limits or minimal deposit amounts. @param token_id The id of the NFT supporting the compound, which must be deposited in the vault. @param staking_addr The address of the staking contract. @param pool_claim_method_id The method id of the staking pool claim function. @param pool_deposit_method_id The method id of the staking pool deposit function. """ assert msg.sender == self.caller, "not caller" self._staking_claim(self, token_id, staking_addr, pool_claim_method_id) self._staking_deposit(self, payment_token.balanceOf(self), token_id, staking_addr, pool_deposit_method_id) @view @external def onERC721Received(_operator: address, _from: address, _tokenId: uint256, _data: Bytes[1024]) -> bytes4: """ @notice ERC721 token receiver callback. @dev Returns the ERC721 receiver callback selector. @param _operator The address which called `safeTransferFrom` function. @param _from The address which previously owned the token. @param _tokenId The NFT identifier which is being transferred. @param _data Additional data with no specified format. @return The ERC721 receiver callback selector. """ return method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes4) @internal def _delegate_to_wallet(delegate: address, expiration: uint256): if delegation_registry.getHotWallet(self) == delegate: delegation_registry.setExpirationTimestamp(expiration) else: delegation_registry.setHotWallet(delegate, expiration, False) @internal def _staking_deposit(wallet: address, amount: uint256, token_id: uint256, staking_addr: address, pool_method_id: bytes4): payment_token.approve(staking_addr, amount) nfts: DynArray[SingleNft, 1] = [SingleNft({tokenId: convert(token_id, uint32), amount: convert(amount, uint224)})] raw_call(staking_addr, concat(pool_method_id, _abi_encode(nfts))) @internal def _staking_withdraw(wallet: address, amount: uint256, token_id: uint256, staking_addr: address, pool_method_id: bytes4): nfts: DynArray[SingleNft, 1] = [SingleNft({tokenId: convert(token_id, uint32), amount: convert(amount, uint224)})] raw_call(staking_addr, concat(pool_method_id, _abi_encode(nfts, wallet))) @internal def _staking_claim(wallet: address, token_id: uint256, staking_addr: address, pool_method_id: bytes4): nfts: DynArray[uint256, 1] = [token_id] raw_call(staking_addr, concat(pool_method_id, _abi_encode(nfts, wallet)))
[{"stateMutability":"payable","type":"constructor","inputs":[{"name":"_payment_token_addr","type":"address"},{"name":"_nft_contract_addr","type":"address"},{"name":"_delegation_registry_addr","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"initialise","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"deposit","inputs":[{"name":"token_id","type":"uint256"},{"name":"nft_owner","type":"address"},{"name":"delegate","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"token_id","type":"uint256"},{"name":"wallet","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"delegate_to_wallet","inputs":[{"name":"delegate","type":"address"},{"name":"expiration","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"staking_deposit","inputs":[{"name":"sender","type":"address"},{"name":"amount","type":"uint256"},{"name":"token_id","type":"uint256"},{"name":"staking_addr","type":"address"},{"name":"pool_method_id","type":"bytes4"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"staking_withdraw","inputs":[{"name":"wallet","type":"address"},{"name":"amount","type":"uint256"},{"name":"token_id","type":"uint256"},{"name":"staking_addr","type":"address"},{"name":"pool_method_id","type":"bytes4"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"staking_claim","inputs":[{"name":"wallet","type":"address"},{"name":"token_id","type":"uint256"},{"name":"staking_addr","type":"address"},{"name":"pool_method_id","type":"bytes4"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"staking_compound","inputs":[{"name":"token_id","type":"uint256"},{"name":"staking_addr","type":"address"},{"name":"pool_claim_method_id","type":"bytes4"},{"name":"pool_deposit_method_id","type":"bytes4"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"onERC721Received","inputs":[{"name":"_operator","type":"address"},{"name":"_from","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"outputs":[{"name":"","type":"bytes4"}]},{"stateMutability":"view","type":"function","name":"caller","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"payment_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"nft_contract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"delegation_registry","inputs":[],"outputs":[{"name":"","type":"address"}]}]
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.