Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
1 address found via BlockscanLatest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60c06040 | 16437873 | 129 days 1 hr ago | IN | Create: YearnTokenAdapter | 0 ETH | 0.01013935 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
YearnTokenAdapter
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /// @notice An error used to indicate that an action could not be completed because either the `msg.sender` or /// `msg.origin` is not authorized. error Unauthorized(); /// @notice An error used to indicate that an action could not be completed because the contract either already existed /// or entered an illegal condition which is not recoverable from. error IllegalState(); /// @notice An error used to indicate that an action could not be completed because of an illegal argument was passed /// to the function. error IllegalArgument();
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "../../IERC20Minimal.sol"; import "../../IERC20Metadata.sol"; /// @title IYearnVaultV2 /// @author Yearn Finance interface IYearnVaultV2 is IERC20Minimal, IERC20Metadata { struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; bool enforceChangeLimit; uint256 profitLimitRatio; uint256 lossLimitRatio; address customCheck; } function apiVersion() external pure returns (string memory); function permit( address owner, address spender, uint256 amount, uint256 expiry, bytes calldata signature ) external returns (bool); // NOTE: Vyper produces multiple signatures for a given function with "default" args function deposit() external returns (uint256); function deposit(uint256 amount) external returns (uint256); function deposit(uint256 amount, address recipient) external returns (uint256); // NOTE: Vyper produces multiple signatures for a given function with "default" args function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function withdraw( uint256 maxShares, address recipient, uint256 maxLoss ) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); function pricePerShare() external view returns (uint256); function totalAssets() external view returns (uint256); function depositLimit() external view returns (uint256); function maxAvailableShares() external view returns (uint256); /// @notice View how much the Vault would increase this Strategy's borrow limit, based on its present performance /// (since its last report). Can be used to determine expectedReturn in your Strategy. function creditAvailable() external view returns (uint256); /// @notice View how much the Vault would like to pull back from the Strategy, based on its present performance /// (since its last report). Can be used to determine expectedReturn in your Strategy. function debtOutstanding() external view returns (uint256); /// @notice View how much the Vault expect this Strategy to return at the current block, based on its present /// performance (since its last report). Can be used to determine expectedReturn in your Strategy. function expectedReturn() external view returns (uint256); /// @notice This is the main contact point where the Strategy interacts with the Vault. It is critical that this call /// is handled as intended by the Strategy. Therefore, this function will be called by BaseStrategy to make /// sure the integration is correct. function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /// @notice This function should only be used in the scenario where the Strategy is being retired but no migration of /// the positions are possible, or in the extreme scenario that the Strategy needs to be put into /// "Emergency Exit" mode in order for it to exit as quickly as possible. The latter scenario could be for any /// reason that is considered "critical" that the Strategy exits its position as fast as possible, such as a /// sudden change in market conditions leading to losses, or an imminent failure in an external dependency. function revokeStrategy() external; /// @notice View the governance address of the Vault to assert privileged functions can only be called by governance. /// The Strategy serves the Vault, so it is subject to governance defined by the Vault. function governance() external view returns (address); /// @notice View the management address of the Vault to assert privileged functions can only be called by management. /// The Strategy serves the Vault, so it is subject to management defined by the Vault. function management() external view returns (address); /// @notice View the guardian address of the Vault to assert privileged functions can only be called by guardian. The /// Strategy serves the Vault, so it is subject to guardian defined by the Vault. function guardian() external view returns (address); }
//SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./IERC20Minimal.sol"; /// @title IERC20Burnable /// @author Mellow Finance interface IERC20Burnable is IERC20Minimal { /// @notice Burns `amount` tokens from the balance of `msg.sender`. /// /// @param amount The amount of tokens to burn. /// /// @return If burning the tokens was successful. function burn(uint256 amount) external returns (bool); /// @notice Burns `amount` tokens from `owner`'s balance. /// /// @param owner The address to burn tokens from. /// @param amount The amount of tokens to burn. /// /// @return If burning the tokens was successful. function burnFrom(address owner, uint256 amount) external returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity >=0.5.0; /// @title IERC20Metadata /// @author Mellow Finance interface IERC20Metadata { /// @notice Gets the name of the token. /// /// @return The name. function name() external view returns (string memory); /// @notice Gets the symbol of the token. /// /// @return The symbol. function symbol() external view returns (string memory); /// @notice Gets the number of decimals that the token has. /// /// @return The number of decimals. function decimals() external view returns (uint8); }
//SPDX-License-Identifier: MIT pragma solidity >=0.5.0; /// @title IERC20Minimal /// @author Mellow Finance interface IERC20Minimal { /// @notice An event which is emitted when tokens are transferred between two parties. /// /// @param owner The owner of the tokens from which the tokens were transferred. /// @param recipient The recipient of the tokens to which the tokens were transferred. /// @param amount The amount of tokens which were transferred. event Transfer(address indexed owner, address indexed recipient, uint256 amount); /// @notice An event which is emitted when an approval is made. /// /// @param owner The address which made the approval. /// @param spender The address which is allowed to transfer tokens on behalf of `owner`. /// @param amount The amount of tokens that `spender` is allowed to transfer. event Approval(address indexed owner, address indexed spender, uint256 amount); /// @notice Gets the current total supply of tokens. /// /// @return The total supply. function totalSupply() external view returns (uint256); /// @notice Gets the balance of tokens that an account holds. /// /// @param account The account address. /// /// @return The balance of the account. function balanceOf(address account) external view returns (uint256); /// @notice Gets the allowance that an owner has allotted for a spender. /// /// @param owner The owner address. /// @param spender The spender address. /// /// @return The number of tokens that `spender` is allowed to transfer on behalf of `owner`. function allowance(address owner, address spender) external view returns (uint256); /// @notice Transfers `amount` tokens from `msg.sender` to `recipient`. /// /// @notice Emits a {Transfer} event. /// /// @param recipient The address which will receive the tokens. /// @param amount The amount of tokens to transfer. /// /// @return If the transfer was successful. function transfer(address recipient, uint256 amount) external returns (bool); /// @notice Approves `spender` to transfer `amount` tokens on behalf of `msg.sender`. /// /// @notice Emits a {Approval} event. /// /// @param spender The address which is allowed to transfer tokens on behalf of `msg.sender`. /// @param amount The amount of tokens that `spender` is allowed to transfer. /// /// @return If the approval was successful. function approve(address spender, uint256 amount) external returns (bool); /// @notice Transfers `amount` tokens from `owner` to `recipient` using an approval that `owner` gave to `msg.sender`. /// /// @notice Emits a {Approval} event. /// @notice Emits a {Transfer} event. /// /// @param owner The address to transfer tokens from. /// @param recipient The address that will receive the tokens. /// @param amount The amount of tokens to transfer. /// /// @return If the transfer was successful. function transferFrom(address owner, address recipient, uint256 amount) external returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./IERC20Minimal.sol"; /// @title IERC20Mintable /// @author Mellow Finance interface IERC20Mintable is IERC20Minimal { /// @notice Mints `amount` tokens to `recipient`. /// /// @param recipient The address which will receive the minted tokens. /// @param amount The amount of tokens to mint. /// /// @return If minting the tokens was successful. function mint(address recipient, uint256 amount) external returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity >=0.5.0; /// @title ITokenAdapter /// @author Mellow Finance interface ITokenAdapter { /// @notice Gets the current version. /// /// @return The version. function version() external view returns (string memory); /// @notice Gets the address of the yield token that this adapter supports. /// /// @return The address of the yield token. function token() external view returns (address); /// @notice Gets the address of the underlying token that the yield token wraps. /// /// @return The address of the underlying token. function underlyingToken() external view returns (address); /// @notice Gets the number of underlying tokens that a single whole yield token is redeemable for. /// /// @return The price. function price() external view returns (uint256); /// @notice Wraps `amount` underlying tokens into the yield token. /// /// @param amount The amount of the underlying token to wrap. /// @param recipient The address which will receive the yield tokens. /// /// @return amountYieldTokens The amount of yield tokens minted to `recipient`. function wrap(uint256 amount, address recipient) external returns (uint256 amountYieldTokens); /// @notice Unwraps `amount` yield tokens into the underlying token. /// /// @param amount The amount of yield-tokens to redeem. /// @param recipient The recipient of the resulting underlying-tokens. /// /// @return amountUnderlyingTokens The amount of underlying tokens unwrapped to `recipient`. function unwrap(uint256 amount, address recipient) external returns (uint256 amountUnderlyingTokens); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "../interfaces/IERC20Burnable.sol"; import "../interfaces/IERC20Metadata.sol"; import "../interfaces/IERC20Minimal.sol"; import "../interfaces/IERC20Mintable.sol"; /// @title TokenUtils /// @author Mellow Finance library TokenUtils { /// @notice An error used to indicate that a call to an ERC20 contract failed. /// /// @param target The target address. /// @param success If the call to the token was a success. /// @param data The resulting data from the call. This is error data when the call was not a success. Otherwise, /// this is malformed data when the call was a success. error ERC20CallFailed(address target, bool success, bytes data); /// @dev A safe function to get the decimals of an ERC20 token. /// /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value. /// /// @param token The target token. /// /// @return The amount of decimals of the token. function expectDecimals(address token) internal view returns (uint8) { (bool success, bytes memory data) = token.staticcall( abi.encodeWithSelector(IERC20Metadata.decimals.selector) ); if (!success || data.length < 32) { revert ERC20CallFailed(token, success, data); } return abi.decode(data, (uint8)); } /// @dev Gets the balance of tokens held by an account. /// /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value. /// /// @param token The token to check the balance of. /// @param account The address of the token holder. /// /// @return The balance of the tokens held by an account. function safeBalanceOf(address token, address account) internal view returns (uint256) { (bool success, bytes memory data) = token.staticcall( abi.encodeWithSelector(IERC20Minimal.balanceOf.selector, account) ); if (!success || data.length < 32) { revert ERC20CallFailed(token, success, data); } return abi.decode(data, (uint256)); } /// @dev Transfers tokens to another address. /// /// @dev Reverts with a {CallFailed} error if execution of the transfer failed or returns an unexpected value. /// /// @param token The token to transfer. /// @param recipient The address of the recipient. /// @param amount The amount of tokens to transfer. function safeTransfer(address token, address recipient, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20Minimal.transfer.selector, recipient, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Approves tokens for the smart contract. /// /// @dev Reverts with a {CallFailed} error if execution of the approval fails or returns an unexpected value. /// /// @param token The token to approve. /// @param spender The contract to spend the tokens. /// @param value The amount of tokens to approve. function safeApprove(address token, address spender, uint256 value) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20Minimal.approve.selector, spender, value) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Transfer tokens from one address to another address. /// /// @dev Reverts with a {CallFailed} error if execution of the transfer fails or returns an unexpected value. /// /// @param token The token to transfer. /// @param owner The address of the owner. /// @param recipient The address of the recipient. /// @param amount The amount of tokens to transfer. function safeTransferFrom(address token, address owner, address recipient, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20Minimal.transferFrom.selector, owner, recipient, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Mints tokens to an address. /// /// @dev Reverts with a {CallFailed} error if execution of the mint fails or returns an unexpected value. /// /// @param token The token to mint. /// @param recipient The address of the recipient. /// @param amount The amount of tokens to mint. function safeMint(address token, address recipient, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20Mintable.mint.selector, recipient, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Burns tokens. /// /// Reverts with a `CallFailed` error if execution of the burn fails or returns an unexpected value. /// /// @param token The token to burn. /// @param amount The amount of tokens to burn. function safeBurn(address token, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20Burnable.burn.selector, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Burns tokens from its total supply. /// /// @dev Reverts with a {CallFailed} error if execution of the burn fails or returns an unexpected value. /// /// @param token The token to burn. /// @param owner The owner of the tokens. /// @param amount The amount of tokens to burn. function safeBurnFrom(address token, address owner, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20Burnable.burnFrom.selector, owner, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } }
pragma solidity ^0.8.11; import {IllegalState} from "./base/Errors.sol"; import "./interfaces/ITokenAdapter.sol"; import "./interfaces/external/yearn/IYearnVaultV2.sol"; import "./libraries/TokenUtils.sol"; /// @title YearnTokenAdapter /// @author Mellow Finance contract YearnTokenAdapter is ITokenAdapter { uint256 private constant MAXIMUM_SLIPPAGE = 10000; string public constant override version = "2.1.0"; address public immutable override token; address public immutable override underlyingToken; constructor(address _token, address _underlyingToken) { token = _token; underlyingToken = _underlyingToken; } /// @inheritdoc ITokenAdapter function price() external view override returns (uint256) { return IYearnVaultV2(token).pricePerShare(); } /// @inheritdoc ITokenAdapter function wrap(uint256 amount, address recipient) external override returns (uint256) { TokenUtils.safeTransferFrom(underlyingToken, msg.sender, address(this), amount); TokenUtils.safeApprove(underlyingToken, token, amount); return IYearnVaultV2(token).deposit(amount, recipient); } /// @inheritdoc ITokenAdapter function unwrap(uint256 amount, address recipient) external override returns (uint256) { TokenUtils.safeTransferFrom(token, msg.sender, address(this), amount); uint256 balanceBefore = TokenUtils.safeBalanceOf(token, address(this)); uint256 amountWithdrawn = IYearnVaultV2(token).withdraw(amount, recipient, MAXIMUM_SLIPPAGE); uint256 balanceAfter = TokenUtils.safeBalanceOf(token, address(this)); // If the Yearn vault did not burn all of the shares then revert. This is critical in mathematical operations // performed by the system because the system always expects that all of the tokens were unwrapped. In Yearn, // this sometimes does not happen in cases where strategies cannot withdraw all of the requested tokens (an // example strategy where this can occur is with Compound and AAVE where funds may not be accessible because // they were lent out). if (balanceBefore - balanceAfter != amount) { revert IllegalState(); } return amountWithdrawn; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_underlyingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC20CallFailed","type":"error"},{"inputs":[],"name":"IllegalState","type":"error"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b506040516109a73803806109a783398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516108af6100f860003960008181609201528181610146015261017201526000818161011d01528181610193015281816101de0152818161025901528181610287015281816102e00152818161035601526103b301526108af6000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806313bac820146100675780632495a5991461008d57806354fd4d50146100cc5780637647691d146100fd578063a035b1fe14610110578063fc0c546a14610118575b600080fd5b61007a610075366004610726565b61013f565b6040519081526020015b60405180910390f35b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610084565b6100f0604051806040016040528060058152602001640322e312e360dc1b81525081565b60405161008491906107be565b61007a61010b366004610726565b610252565b61007a6103af565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b600061016d7f0000000000000000000000000000000000000000000000000000000000000000333086610438565b6101b87f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085610541565b604051636e553f6560e01b8152600481018490526001600160a01b0383811660248301527f00000000000000000000000000000000000000000000000000000000000000001690636e553f65906044016020604051808303816000875af1158015610227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024b91906107d1565b9392505050565b60006102807f0000000000000000000000000000000000000000000000000000000000000000333086610438565b60006102ac7f000000000000000000000000000000000000000000000000000000000000000030610638565b604051631cc6d2f960e31b8152600481018690526001600160a01b03858116602483015261271060448301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063e63697c8906064016020604051808303816000875af1158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d91906107d1565b9050600061037b7f000000000000000000000000000000000000000000000000000000000000000030610638565b90508561038882856107ea565b146103a657604051634a613c4160e01b815260040160405180910390fd5b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166399530b066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561040f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043391906107d1565b905090565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161049c919061080f565b6000604051808303816000865af19150503d80600081146104d9576040519150601f19603f3d011682016040523d82523d6000602084013e6104de565b606091505b509150915081158061050c575080511580159061050c57508080602001905181019061050a919061082b565b155b156105395785828260405163e7e40b5b60e01b81526004016105309392919061084d565b60405180910390fd5b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161059d919061080f565b6000604051808303816000865af19150503d80600081146105da576040519150601f19603f3d011682016040523d82523d6000602084013e6105df565b606091505b509150915081158061060d575080511580159061060d57508080602001905181019061060b919061082b565b155b156106315784828260405163e7e40b5b60e01b81526004016105309392919061084d565b5050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691610692919061080f565b600060405180830381855afa9150503d80600081146106cd576040519150601f19603f3d011682016040523d82523d6000602084013e6106d2565b606091505b50915091508115806106e5575060208151105b156107095784828260405163e7e40b5b60e01b81526004016105309392919061084d565b8080602001905181019061071d91906107d1565b95945050505050565b6000806040838503121561073957600080fd5b8235915060208301356001600160a01b038116811461075757600080fd5b809150509250929050565b60005b8381101561077d578181015183820152602001610765565b8381111561078c576000848401525b50505050565b600081518084526107aa816020860160208601610762565b601f01601f19169290920160200192915050565b60208152600061024b6020830184610792565b6000602082840312156107e357600080fd5b5051919050565b60008282101561080a57634e487b7160e01b600052601160045260246000fd5b500390565b60008251610821818460208701610762565b9190910192915050565b60006020828403121561083d57600080fd5b8151801515811461024b57600080fd5b6001600160a01b0384168152821515602082015260606040820181905260009061071d9083018461079256fea2646970667358221220b7d3db0b60142dd8bbbc04b43b5b963c05df831cb60d188abadb14cc620880e164736f6c634300080b0033000000000000000000000000a354f35829ae975e850e23e9615b11da1b3dc4de000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a354f35829ae975e850e23e9615b11da1b3dc4de000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
-----Decoded View---------------
Arg [0] : _token (address): 0xa354F35829Ae975e850e23e9615b11Da1B3dC4DE
Arg [1] : _underlyingToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a354f35829ae975e850e23e9615b11da1b3dc4de
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.