More Info
Private Name Tags
ContractCreator
Sponsored
Latest 25 from a total of 221 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Policy | 118630467 | 187 days ago | IN | 0.001 ETH | 0.00003069274 | ||||
Mint Policy | 118471863 | 190 days ago | IN | 0.001 ETH | 0.000003308639 | ||||
Mint Policy | 118408065 | 192 days ago | IN | 0.001 ETH | 0.000004180296 | ||||
Mint Policy | 118403420 | 192 days ago | IN | 0.001 ETH | 0.000005791797 | ||||
Mint Policy | 118375872 | 192 days ago | IN | 0.001 ETH | 0.000030508979 | ||||
Mint Policy | 118371630 | 193 days ago | IN | 0.001 ETH | 0.000005931327 | ||||
Mint Policy | 118365308 | 193 days ago | IN | 0.001 ETH | 0.00000775633 | ||||
Mint Policy | 118365282 | 193 days ago | IN | 0.001 ETH | 0.000007710227 | ||||
Mint Policy | 118365258 | 193 days ago | IN | 0.001 ETH | 0.000007546998 | ||||
Mint Policy | 118365230 | 193 days ago | IN | 0.001 ETH | 0.000007691784 | ||||
Mint Policy | 118360915 | 193 days ago | IN | 0.001 ETH | 0.000012564543 | ||||
Mint Policy | 118350923 | 193 days ago | IN | 0.001 ETH | 0.000020989347 | ||||
Mint Policy | 118346078 | 193 days ago | IN | 0.001 ETH | 0.000027890171 | ||||
Mint Policy | 118345983 | 193 days ago | IN | 0.001 ETH | 0.00002810129 | ||||
Mint Policy | 118329025 | 194 days ago | IN | 0.001 ETH | 0.000030575253 | ||||
Mint Policy | 118326898 | 194 days ago | IN | 0.001 ETH | 0.000030027743 | ||||
Mint Policy | 118326849 | 194 days ago | IN | 0.001 ETH | 0.000030419581 | ||||
Mint Policy | 118326831 | 194 days ago | IN | 0.001 ETH | 0.000030103315 | ||||
Mint Policy | 118326812 | 194 days ago | IN | 0.001 ETH | 0.000029638669 | ||||
Mint Policy | 118323592 | 194 days ago | IN | 0.001 ETH | 0.000030003462 | ||||
Mint Policy | 118323513 | 194 days ago | IN | 0.001 ETH | 0.000029971463 | ||||
Mint Policy | 118320807 | 194 days ago | IN | 0.001 ETH | 0.000030702717 | ||||
Mint Policy | 118318678 | 194 days ago | IN | 0.001 ETH | 0.000030231997 | ||||
Mint Policy | 118315246 | 194 days ago | IN | 0.001 ETH | 0.000020616067 | ||||
Mint Policy | 118315240 | 194 days ago | IN | 0.001 ETH | 0.00003066681 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
118630467 | 187 days ago | 0.001 ETH | ||||
118471863 | 190 days ago | 0.001 ETH | ||||
118408065 | 192 days ago | 0.001 ETH | ||||
118403420 | 192 days ago | 0.001 ETH | ||||
118375872 | 192 days ago | 0.001 ETH | ||||
118371630 | 193 days ago | 0.001 ETH | ||||
118365308 | 193 days ago | 0.001 ETH | ||||
118365282 | 193 days ago | 0.001 ETH | ||||
118365258 | 193 days ago | 0.001 ETH | ||||
118365230 | 193 days ago | 0.001 ETH | ||||
118360915 | 193 days ago | 0.001 ETH | ||||
118350923 | 193 days ago | 0.001 ETH | ||||
118346078 | 193 days ago | 0.001 ETH | ||||
118345983 | 193 days ago | 0.001 ETH | ||||
118329025 | 194 days ago | 0.001 ETH | ||||
118326898 | 194 days ago | 0.001 ETH | ||||
118326849 | 194 days ago | 0.001 ETH | ||||
118326831 | 194 days ago | 0.001 ETH | ||||
118326812 | 194 days ago | 0.001 ETH | ||||
118323592 | 194 days ago | 0.001 ETH | ||||
118323513 | 194 days ago | 0.001 ETH | ||||
118320807 | 194 days ago | 0.001 ETH | ||||
118318678 | 194 days ago | 0.001 ETH | ||||
118315246 | 194 days ago | 0.001 ETH | ||||
118315240 | 194 days ago | 0.001 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Shepherd
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 19000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {Address} from "@openzeppelin/utils/Address.sol"; import {ILlamaCore} from "src/interfaces/ILlamaCore.sol"; import {ILlamaPolicy} from "src/interfaces/ILlamaPolicy.sol"; import {ILlamaStrategy} from "src/interfaces/ILlamaStrategy.sol"; import {ActionInfo} from "src/lib/Structs.sol"; /// @title Shepherd /// @author Llama ([email protected]) /// @notice This contract is a Policy Container that holds a Policy with the `Shepherd` role from a llama instance. It /// is used to issue a new policy on paying `mintFee` amount of ETH. contract Shepherd { /// @dev Only callable by a Llama instance's executor. error OnlyLlamaExecutor(); /// @dev Invalid ETH value error message. error InvalidEthValue(); /// @dev The address of the core contract that this policy gate is associated with. address public immutable LLAMA_CORE; /// @dev The address of the account that will receive the ETH when a policy is issued. address public immutable LLAMA_ACCOUNT; /// @dev The role ID of the Shepherd contract uint8 public immutable SHEPHERD_ROLE; /// @dev The role ID of Alpacas uint8 public immutable ALPACA_ROLE; /// @dev Instant Execution Strategy address public immutable INSTANT_EXECUTION_STRATEGY; /// @dev The amount of ETH required to issue a policy. uint256 public mintFee; /// @dev This contract is deployed as a minimal proxy from the factory's `deploy` function. The /// `_disableInitializers` locks the implementation (logic) contract, preventing any future initialization of it. constructor( address llamaCore, address llamaAccount, uint8 shepherdRole, uint8 alpacaRole, address instantExecutionStrategy ) { LLAMA_CORE = llamaCore; LLAMA_ACCOUNT = llamaAccount; SHEPHERD_ROLE = shepherdRole; ALPACA_ROLE = alpacaRole; INSTANT_EXECUTION_STRATEGY = instantExecutionStrategy; mintFee = 1e15; } /// @notice Issues a new policy on paying `mintFee` amount of ETH. /// @dev This function is a public function that can be called by anyone to issue a new policy on paying `mintFee` /// amount of ETH. The ETH is sent to the `LLAMA_ACCOUNT` address. function mintPolicy() external payable { if (msg.value != mintFee) revert InvalidEthValue(); // Transfer amount to Llama Account Address.sendValue(payable(LLAMA_ACCOUNT), msg.value); address target = address(ILlamaCore(LLAMA_CORE).policy()); bytes memory data = abi.encodeCall(ILlamaPolicy.setRoleHolder, (ALPACA_ROLE, msg.sender, 1, type(uint64).max)); // Create Action uint256 actionId = ILlamaCore(LLAMA_CORE).createAction( SHEPHERD_ROLE, ILlamaStrategy(INSTANT_EXECUTION_STRATEGY), target, 0, data, "# Mint Policy to Alpaca\n\n" ); ActionInfo memory actionInfo = ActionInfo(actionId, address(this), SHEPHERD_ROLE, ILlamaStrategy(INSTANT_EXECUTION_STRATEGY), target, 0, data); // Queue Action ILlamaCore(LLAMA_CORE).queueAction(actionInfo); // Execute Action ILlamaCore(LLAMA_CORE).executeAction(actionInfo); } /// @notice Sets the mint fee required to issue a policy. function setMintFee(uint256 _mintFee) external { if (msg.sender != address(ILlamaCore(LLAMA_CORE).executor())) revert OnlyLlamaExecutor(); mintFee = _mintFee; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // TODO This interface was generated from `cast interface`, so some types are not as strong as they // could be. For example, the existing `ILlamaStrategy` were all `address` until they were manually // changed. So there are probably other types that need to be updated also. pragma solidity ^0.8.23; import {ILlamaPolicy} from "src/interfaces/ILlamaPolicy.sol"; import {ILlamaStrategy} from "src/interfaces/ILlamaStrategy.sol"; import {ActionState} from "src/lib/Enums.sol"; import { Action, ActionInfo, LlamaInstanceConfig, LlamaPolicyConfig, PermissionData, RoleHolderData, RolePermissionData } from "src/lib/Structs.sol"; /// @title LlamaCore Interface /// @author Llama ([email protected]) /// @notice This is the interface for LlamaCore. interface ILlamaCore { error InvalidSignature(); error PolicyholderDoesNotHavePermission(); /// @dev The action is not in the expected state. /// @param current The current state of the action. error InvalidActionState(ActionState current); function actionGuard(address target, bytes4 selector) external view returns (address guard); function actionsCount() external view returns (uint256); function approvals(uint256 actionId, address policyholder) external view returns (bool hasApproved); function authorizedAccountLogics(address accountLogic) external view returns (bool isAuthorized); function authorizedScripts(address script) external view returns (bool isAuthorized); function authorizedStrategyLogics(ILlamaStrategy strategyLogic) external view returns (bool isAuthorized); function cancelAction(ActionInfo memory actionInfo) external; function cancelActionBySig(address policyholder, ActionInfo memory actionInfo, uint8 v, bytes32 r, bytes32 s) external; function castApproval(uint8 role, ActionInfo memory actionInfo, string memory reason) external returns (uint96); function castApprovalBySig( address policyholder, uint8 role, ActionInfo memory actionInfo, string memory reason, uint8 v, bytes32 r, bytes32 s ) external returns (uint96); function castDisapproval(uint8 role, ActionInfo memory actionInfo, string memory reason) external returns (uint96); function castDisapprovalBySig( address policyholder, uint8 role, ActionInfo memory actionInfo, string memory reason, uint8 v, bytes32 r, bytes32 s ) external returns (uint96); function createAccounts(address llamaAccountLogic, bytes[] memory accountConfigs) external; function createAction( uint8 role, ILlamaStrategy strategy, address target, uint256 value, bytes memory data, string memory description ) external returns (uint256 actionId); function createActionBySig( address policyholder, uint8 role, ILlamaStrategy strategy, address target, uint256 value, bytes memory data, string memory description, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 actionId); function createStrategies(address llamaStrategyLogic, bytes[] memory strategyConfigs) external; function disapprovals(uint256 actionId, address policyholder) external view returns (bool hasDisapproved); function executeAction(ActionInfo memory actionInfo) external payable; function executor() external view returns (address); function getAction(uint256 actionId) external view returns (Action memory); function getActionState(ActionInfo memory actionInfo) external view returns (uint8); function incrementNonce(bytes4 selector) external; function initialize(LlamaInstanceConfig memory config, address policyLogic, address policyMetadataLogic) external; function name() external view returns (string memory); function nonces(address policyholder, bytes4 selector) external view returns (uint256 currentNonce); function policy() external view returns (ILlamaPolicy); function queueAction(ActionInfo memory actionInfo) external; function setAccountLogicAuthorization(address accountLogic, bool authorized) external; function setGuard(address target, bytes4 selector, address guard) external; function setScriptAuthorization(address script, bool authorized) external; function setStrategyAuthorization(ILlamaStrategy strategy, bool authorized) external; function setStrategyLogicAuthorization(ILlamaStrategy strategyLogic, bool authorized) external; function strategies(ILlamaStrategy strategy) external view returns (bool deployed, bool authorized); }
// SPDX-License-Identifier: MIT // TODO This interface was generated from `cast interface`, so some types are not as strong as they // could be. pragma solidity ^0.8.23; import {RoleDescription} from "../lib/UDVTs.sol"; /// @title LlamaPolicy Interface /// @author Llama ([email protected]) /// @notice This is the interface for LlamaPolicy. interface ILlamaPolicy { event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); event ExpiredRoleRevoked(address indexed caller, address indexed policyholder, uint8 indexed role); event Initialized(uint8 version); event PolicyMetadataSet(address policyMetadata, address indexed policyMetadataLogic, bytes initializationData); event RoleAssigned(address indexed policyholder, uint8 indexed role, uint64 expiration, uint96 quantity); event RoleInitialized(uint8 indexed role, bytes32 description); event RolePermissionAssigned( uint8 indexed role, bytes32 indexed permissionId, PermissionData permissionData, bool hasPermission ); event Transfer(address indexed from, address indexed to, uint256 indexed id); struct LlamaPolicyConfig { RoleDescription[] roleDescriptions; RoleHolderData[] roleHolders; RolePermissionData[] rolePermissions; string color; string logo; } struct PermissionData { address target; bytes4 selector; address strategy; } struct Checkpoint { uint64 timestamp; uint64 expiration; uint96 quantity; } struct History { Checkpoint[] _checkpoints; } struct RoleHolderData { uint8 role; address policyholder; uint96 quantity; uint64 expiration; } struct RolePermissionData { uint8 role; PermissionData permissionData; bool hasPermission; } function approve(address, uint256) external pure; function balanceOf(address owner) external view returns (uint256); function canCreateAction(uint8 role, bytes32 permissionId) external view returns (bool hasPermission); function contractURI() external view returns (string memory); function getApproved(uint256) external view returns (address); function getPastQuantity(address policyholder, uint8 role, uint256 timestamp) external view returns (uint96); function getPastRoleSupplyAsNumberOfHolders(uint8 role, uint256 timestamp) external view returns (uint96 numberOfHolders); function getPastRoleSupplyAsQuantitySum(uint8 role, uint256 timestamp) external view returns (uint96 totalQuantity); function getQuantity(address policyholder, uint8 role) external view returns (uint96); function getRoleSupplyAsNumberOfHolders(uint8 role) external view returns (uint96 numberOfHolders); function getRoleSupplyAsQuantitySum(uint8 role) external view returns (uint96 totalQuantity); function hasPermissionId(address policyholder, uint8 role, bytes32 permissionId) external view returns (bool); function hasRole(address policyholder, uint8 role) external view returns (bool); function hasRole(address policyholder, uint8 role, uint256 timestamp) external view returns (bool); function initialize( string memory _name, LlamaPolicyConfig memory config, address policyMetadataLogic, address executor, PermissionData memory bootstrapPermissionData ) external; function initializeRole(RoleDescription description) external; function isApprovedForAll(address, address) external view returns (bool); function isRoleExpired(address policyholder, uint8 role) external view returns (bool); function llamaExecutor() external view returns (address); function llamaPolicyMetadata() external view returns (address); function name() external view returns (string memory); function numRoles() external view returns (uint8); function ownerOf(uint256 id) external view returns (address owner); function revokeExpiredRole(uint8 role, address policyholder) external; function revokePolicy(address policyholder) external; function roleBalanceCheckpoints(address policyholder, uint8 role, uint256 start, uint256 end) external view returns (History memory); function roleBalanceCheckpoints(address policyholder, uint8 role) external view returns (History memory); function roleBalanceCheckpointsLength(address policyholder, uint8 role) external view returns (uint256); function roleExpiration(address policyholder, uint8 role) external view returns (uint64); function roleSupplyCheckpoints(uint8 role, uint256 start, uint256 end) external view returns (History memory); function roleSupplyCheckpoints(uint8 role) external view returns (History memory); function roleSupplyCheckpointsLength(uint8 role) external view returns (uint256); function safeTransferFrom(address, address, uint256) external pure; function safeTransferFrom(address, address, uint256, bytes memory) external pure; function setAndInitializePolicyMetadata(address llamaPolicyMetadataLogic, bytes memory config) external; function setApprovalForAll(address, bool) external pure; function setRoleHolder(uint8 role, address policyholder, uint96 quantity, uint64 expiration) external; function setRolePermission(uint8 role, PermissionData memory permissionData, bool hasPermission) external; function supportsInterface(bytes4 interfaceId) external view returns (bool); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); function totalSupply() external view returns (uint256); function transferFrom(address, address, uint256) external pure; function updateRoleDescription(uint8 role, RoleDescription description) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {ActionInfo} from "src/lib/Structs.sol"; import {ILlamaCore} from "src/interfaces/ILlamaCore.sol"; import {ILlamaPolicy} from "src/interfaces/ILlamaPolicy.sol"; /// @title Llama Strategy Interface /// @author Llama ([email protected]) /// @notice This is the interface for Llama strategies which determine the rules of an action's process. /// @dev The interface is sorted by the stage of the action's lifecycle in which the method's are used. interface ILlamaStrategy { // -------- For Inspection -------- // These are not strictly required by the core, but are useful for inspecting a strategy contract. /// @notice Returns the address of the Llama core that this strategy is registered to. function llamaCore() external view returns (ILlamaCore); /// @notice Returns the name of the Llama policy that this strategy is registered to. function policy() external view returns (ILlamaPolicy); // -------- Required for Strategies used with LlamaTokenGovernor -------- /// @notice Returns the approval period of the strategy in seconds. function approvalPeriod() external view returns (uint64); /// @notice Returns the queuing period of the strategy in seconds. function queuingPeriod() external view returns (uint64); /// @notice The role that can approve an action. function approvalRole() external view returns (uint8); /// @notice The role that can disapprove an action. function disapprovalRole() external view returns (uint8); /// @notice Returns true if an action can force an action to be approved and false otherwise. function forceApprovalRole(uint8 role) external view returns (bool isForceApproval); /// @notice Returns true if an action can force an action to be disapproved and false otherwise. function forceDisapprovalRole(uint8 role) external view returns (bool isForceDisapproval); // -------- At Strategy Creation -------- /// @notice Initializes a new clone of the strategy. /// @dev This function is called by the `_deployStrategies` function in the `LlamaCore` contract. The `initializer` /// modifier ensures that this function can be invoked at most once. /// @param config The strategy configuration, encoded as bytes to support differing constructor arguments in /// different strategies. /// @return This return statement must be hardcoded to `true` to ensure that initializing an EOA /// (like the zero address) will revert. function initialize(bytes memory config) external returns (bool); // -------- At Action Creation -------- /// @notice Reverts if action creation is not allowed. /// @param actionInfo Data required to create an action. function validateActionCreation(ActionInfo calldata actionInfo) external view; // -------- When Casting Approval -------- /// @notice Reverts if approvals are not allowed with this strategy for the given policyholder when approving with /// role. /// @param actionInfo Data required to create an action. /// @param policyholder Address of the policyholder. /// @param role The role of the policyholder being used to cast approval. function checkIfApprovalEnabled(ActionInfo calldata actionInfo, address policyholder, uint8 role) external view; /// @notice Get the quantity of an approval of a policyholder at a specific timestamp. /// @param policyholder Address of the policyholder. /// @param role The role to check quantity for. /// @param timestamp The timestamp at which to get the approval quantity. /// @return The quantity of the policyholder's approval. function getApprovalQuantityAt(address policyholder, uint8 role, uint256 timestamp) external view returns (uint96); // -------- When Casting Disapproval -------- /// @notice Reverts if disapprovals are not allowed with this strategy for the given policyholder when disapproving /// with role. /// @param actionInfo Data required to create an action. /// @param policyholder Address of the policyholder. /// @param role The role of the policyholder being used to cast disapproval. function checkIfDisapprovalEnabled(ActionInfo calldata actionInfo, address policyholder, uint8 role) external view; /// @notice Get the quantity of a disapproval of a policyholder at a specific timestamp. /// @param policyholder Address of the policyholder. /// @param role The role to check quantity for. /// @param timestamp The timestamp at which to get the disapproval quantity. /// @return The quantity of the policyholder's disapproval. function getDisapprovalQuantityAt(address policyholder, uint8 role, uint256 timestamp) external view returns (uint96); // -------- When Queueing -------- /// @notice Returns the earliest timestamp, in seconds, at which an action can be executed. /// @param actionInfo Data required to create an action. /// @return The earliest timestamp at which an action can be executed. function minExecutionTime(ActionInfo calldata actionInfo) external view returns (uint64); // -------- When Canceling -------- /// @notice Reverts if the action cannot be canceled. /// @param actionInfo Data required to create an action. /// @param caller Policyholder initiating the cancelation. function validateActionCancelation(ActionInfo calldata actionInfo, address caller) external view; // -------- When Determining Action State -------- // These are used during casting of approvals and disapprovals, when queueing, and when executing. /// @notice Get whether an action is currently active. /// @param actionInfo Data required to create an action. /// @return Boolean value that is `true` if the action is currently active, `false` otherwise. function isActionActive(ActionInfo calldata actionInfo) external view returns (bool); /// @notice Get whether an action has passed the approval process. /// @param actionInfo Data required to create an action. /// @return Boolean value that is `true` if the action has passed the approval process. function isActionApproved(ActionInfo calldata actionInfo) external view returns (bool); /// @notice Get whether an action has been vetoed during the disapproval process. /// @param actionInfo Data required to create an action. /// @return Boolean value that is `true` if the action has been vetoed during the disapproval process. function isActionDisapproved(ActionInfo calldata actionInfo) external view returns (bool); /// @notice Returns `true` if the action is expired, `false` otherwise. /// @param actionInfo Data required to create an action. /// @return Boolean value that is `true` if the action is expired. function isActionExpired(ActionInfo calldata actionInfo) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {ILlamaAccount} from "src/interfaces/ILlamaAccount.sol"; import {ILlamaCore} from "src/interfaces/ILlamaCore.sol"; import {ILlamaActionGuard} from "src/interfaces/ILlamaActionGuard.sol"; import {ILlamaStrategy} from "src/interfaces/ILlamaStrategy.sol"; import {RoleDescription} from "src/lib/UDVTs.sol"; /// @dev Data required to create an action. struct ActionInfo { uint256 id; // ID of the action. address creator; // Address that created the action. uint8 creatorRole; // The role that created the action. ILlamaStrategy strategy; // Strategy used to govern the action. address target; // Contract being called by an action. uint256 value; // Value in wei to be sent when the action is executed. bytes data; // Data to be called on the target when the action is executed. } /// @dev Data that represents an action. struct Action { // Instead of storing all data required to execute an action in storage, we only save the hash to // make action creation cheaper. The hash is computed by taking the keccak256 hash of the concatenation of each // field in the `ActionInfo` struct. bytes32 infoHash; bool executed; // Has action executed. bool canceled; // Is action canceled. bool isScript; // Is the action's target a script. ILlamaActionGuard guard; // The action's guard. This is the address(0) if no guard is set on the action's target and // selector pair. uint64 creationTime; // The timestamp when action was created (used for policy snapshots). uint64 minExecutionTime; // Only set when an action is queued. The timestamp when action execution can begin. uint96 totalApprovals; // The total quantity of policyholder approvals. uint96 totalDisapprovals; // The total quantity of policyholder disapprovals. } /// @dev Data that represents a permission. struct PermissionData { address target; // Contract being called by an action. bytes4 selector; // Selector of the function being called by an action. ILlamaStrategy strategy; // Strategy used to govern the action. } /// @dev Data required to assign/revoke a role to/from a policyholder. struct RoleHolderData { uint8 role; // ID of the role to set (uint8 ensures onchain enumerability when burning policies). address policyholder; // Policyholder to assign the role to. uint96 quantity; // Quantity of the role to assign to the policyholder, i.e. their (dis)approval quantity. uint64 expiration; // When the role expires. } /// @dev Data required to assign/revoke a permission to/from a role. struct RolePermissionData { uint8 role; // ID of the role to set (uint8 ensures onchain enumerability when burning policies). PermissionData permissionData; // The `(target, selector, strategy)` tuple that will be keccak256 hashed to // generate the permission ID to assign or unassign to the role bool hasPermission; // Whether to assign the permission or remove the permission. } /// @dev Configuration of a new Llama instance. struct LlamaInstanceConfig { string name; // The name of the Llama instance. ILlamaStrategy strategyLogic; // The initial strategy implementation (logic) contract. ILlamaAccount accountLogic; // The initial account implementation (logic) contract. bytes[] initialStrategies; // Array of initial strategy configurations. bytes[] initialAccounts; // Array of initial account configurations. LlamaPolicyConfig policyConfig; // Configuration of the instance's policy. } /// @dev Configuration of a new Llama policy. struct LlamaPolicyConfig { RoleDescription[] roleDescriptions; // The initial role descriptions. RoleHolderData[] roleHolders; // The `role`, `policyholder`, `quantity` and `expiration` of the initial role holders. RolePermissionData[] rolePermissions; // The `role`, `permissionData`, and the `hasPermission` boolean. string color; // The primary color of the SVG representation of the instance's policy (e.g. #00FF00). string logo; // The SVG string representing the logo for the deployed Llama instance's NFT. }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; /// @dev Possible states of an action during its lifecycle. enum ActionState { Active, // Action created and approval period begins. Canceled, // Action canceled by creator. Failed, // Action approval failed. Approved, // Action approval succeeded and ready to be queued. Queued, // Action queued for queueing duration and disapproval period begins. Expired, // block.timestamp is greater than Action's executionTime + expirationDelay. Executed // Action has executed successfully. } /// @dev Possible states of a user cast vote. enum VoteType { Against, For, Abstain }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; // @dev We use this UDVT for stronger typing of the Role Description. type RoleDescription is bytes32;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; /// @title Llama Account Logic Interface /// @author Llama ([email protected]) /// @notice This is the interface for Llama accounts which can be used to hold assets for a Llama instance. interface ILlamaAccount { // -------- For Inspection -------- /// @notice Returns the address of the Llama instance's executor. function llamaExecutor() external view returns (address); // -------- At Account Creation -------- /// @notice Initializes a new clone of the account. /// @dev This function is called by the `_deployAccounts` function in the `LlamaCore` contract. The `initializer` /// modifier ensures that this function can be invoked at most once. /// @param config The account configuration, encoded as bytes to support differing constructor arguments in /// different account logic contracts. /// @return This return statement must be hardcoded to `true` to ensure that initializing an EOA /// (like the zero address) will revert. function initialize(bytes memory config) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {ActionInfo} from "src/lib/Structs.sol"; /// @title Llama Action Guard Interface /// @author Llama ([email protected]) /// @notice Executes checks on action creation and execution to verify that the action is allowed. /// @dev Methods are not `view` because (1) an action guard may write to it's own storage, and (2) /// Having `view` methods that can revert isn't great UX. Allowing guards to write to their own /// storage is useful to persist state between calls to the various guard methods. For example, a /// guard may: /// - Store the USD price of a token during action creation in `validateActionCreation`. /// - Verify the price has not changed by more than a given amount during `validatePreActionExecution` /// and save off the current USD value of an account. /// - Verify the USD value of an account has not decreased by more than a certain amount during /// execution, i.e. between `validatePreActionExecution` and `validatePostActionExecution`. interface ILlamaActionGuard { /// @notice Reverts if action creation is not allowed. /// @param actionInfo Data required to create an action. function validateActionCreation(ActionInfo calldata actionInfo) external; /// @notice Called immediately before action execution, and reverts if the action is not allowed /// to be executed. /// @param actionInfo Data required to create an action. function validatePreActionExecution(ActionInfo calldata actionInfo) external; /// @notice Called immediately after action execution, and reverts if the just-executed /// action should not have been allowed to execute. /// @param actionInfo Data required to create an action. function validatePostActionExecution(ActionInfo calldata actionInfo) external; }
{ "remappings": [ "@openzeppelin/=lib/openzeppelin-contracts/contracts/", "@solmate/=lib/solmate/src/", "@solady/=lib/solady/src/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/solmate/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "solady/=lib/solady/src/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 19000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"llamaCore","type":"address"},{"internalType":"address","name":"llamaAccount","type":"address"},{"internalType":"uint8","name":"shepherdRole","type":"uint8"},{"internalType":"uint8","name":"alpacaRole","type":"uint8"},{"internalType":"address","name":"instantExecutionStrategy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidEthValue","type":"error"},{"inputs":[],"name":"OnlyLlamaExecutor","type":"error"},{"inputs":[],"name":"ALPACA_ROLE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTANT_EXECUTION_STRATEGY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LLAMA_ACCOUNT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LLAMA_CORE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHEPHERD_ROLE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPolicy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61012060405234801561001157600080fd5b50604051610bed380380610bed83398101604081905261003091610092565b6001600160a01b0394851660805292841660a05260ff91821660c0521660e052166101005266038d7ea4c680006000556100f7565b80516001600160a01b038116811461007c57600080fd5b919050565b805160ff8116811461007c57600080fd5b600080600080600060a086880312156100aa57600080fd5b6100b386610065565b94506100c160208701610065565b93506100cf60408701610081565b92506100dd60608701610081565b91506100eb60808701610065565b90509295509295909350565b60805160a05160c05160e05161010051610a66610187600039600081816101980152818161045a015261051d015260008181610114015261030b0152600081816101cc0152818161043801526104e001526000818160bb015261024e015260008181610164015281816102770152818161040b015281816105840152818161062801526106990152610a666000f3fe60806040526004361061007b5760003560e01c80638c718d261161004e5780638c718d261461015257806398dcd09a14610186578063c8b2eb21146101ba578063eddd0d9c146101ee57600080fd5b806313966db5146100805780632d0e3b43146100a95780632f945c611461010257806363be9f0c14610148575b600080fd5b34801561008c57600080fd5b5061009660005481565b6040519081526020015b60405180910390f35b3480156100b557600080fd5b506100dd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a0565b34801561010e57600080fd5b506101367f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100a0565b61015061020e565b005b34801561015e57600080fd5b506100dd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561019257600080fd5b506100dd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101c657600080fd5b506101367f000000000000000000000000000000000000000000000000000000000000000081565b3480156101fa57600080fd5b5061015061020936600461086e565b610697565b6000543414610249576040517f715a6e9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102737f00000000000000000000000000000000000000000000000000000000000000003461078f565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630505c8c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030491906108ac565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001660248201523360448201526001606482015267ffffffffffffffff608482015290915060009060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2524842c00000000000000000000000000000000000000000000000000000000179052517fb3c678b000000000000000000000000000000000000000000000000000000000815290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3c678b090610488907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090889087908990600401610934565b6020604051808303816000875af11580156104a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cb91906109bf565b6040805160e0810182528281523060208201527f000000000000000000000000000000000000000000000000000000000000000060ff168183015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660608301528681166080830152600060a083015260c0820186905291517f2c7af570000000000000000000000000000000000000000000000000000000008152929350917f000000000000000000000000000000000000000000000000000000000000000090911690632c7af570906105bb9084906004016109d8565b600060405180830381600087803b1580156105d557600080fd5b505af11580156105e9573d6000803e3d6000fd5b50506040517f163db1d300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016925063163db1d3915061065f9084906004016109d8565b600060405180830381600087803b15801561067957600080fd5b505af115801561068d573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c34c08e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906108ac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461078a576040517f26bee1ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600055565b804710156107cf576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240160405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610829576040519150601f19603f3d011682016040523d82523d6000602084013e61082e565b606091505b5050905080610869576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020828403121561088057600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146108a957600080fd5b50565b6000602082840312156108be57600080fd5b81516108c981610887565b9392505050565b6000815180845260005b818110156108f6576020818501810151868301820152016108da565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60ff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525083606083015260c0608083015261097c60c08301846108d0565b82810360a0840152601981527f23204d696e7420506f6c69637920746f20416c706163610a0a000000000000006020820152604081019150509695505050505050565b6000602082840312156109d157600080fd5b5051919050565b60208152815160208201526000602083015173ffffffffffffffffffffffffffffffffffffffff808216604085015260ff60408601511660608501528060608601511660808501528060808601511660a0850152505060a083015160c083015260c083015160e080840152610a516101008401826108d0565b94935050505056fea164736f6c6343000817000a000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f7490000000000000000000000000770f9062d8f0dc6871d646a6daf51c2d86a3b56500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000ce6a1f03af254d0516c19130aeff3ec81f49ad85
Deployed Bytecode
0x60806040526004361061007b5760003560e01c80638c718d261161004e5780638c718d261461015257806398dcd09a14610186578063c8b2eb21146101ba578063eddd0d9c146101ee57600080fd5b806313966db5146100805780632d0e3b43146100a95780632f945c611461010257806363be9f0c14610148575b600080fd5b34801561008c57600080fd5b5061009660005481565b6040519081526020015b60405180910390f35b3480156100b557600080fd5b506100dd7f000000000000000000000000770f9062d8f0dc6871d646a6daf51c2d86a3b56581565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a0565b34801561010e57600080fd5b506101367f000000000000000000000000000000000000000000000000000000000000000381565b60405160ff90911681526020016100a0565b61015061020e565b005b34801561015e57600080fd5b506100dd7f000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f749081565b34801561019257600080fd5b506100dd7f000000000000000000000000ce6a1f03af254d0516c19130aeff3ec81f49ad8581565b3480156101c657600080fd5b506101367f000000000000000000000000000000000000000000000000000000000000000281565b3480156101fa57600080fd5b5061015061020936600461086e565b610697565b6000543414610249576040517f715a6e9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102737f000000000000000000000000770f9062d8f0dc6871d646a6daf51c2d86a3b5653461078f565b60007f000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f749073ffffffffffffffffffffffffffffffffffffffff16630505c8c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030491906108ac565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000031660248201523360448201526001606482015267ffffffffffffffff608482015290915060009060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2524842c00000000000000000000000000000000000000000000000000000000179052517fb3c678b000000000000000000000000000000000000000000000000000000000815290915060009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f7490169063b3c678b090610488907f0000000000000000000000000000000000000000000000000000000000000002907f000000000000000000000000ce6a1f03af254d0516c19130aeff3ec81f49ad8590889087908990600401610934565b6020604051808303816000875af11580156104a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cb91906109bf565b6040805160e0810182528281523060208201527f000000000000000000000000000000000000000000000000000000000000000260ff168183015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ce6a1f03af254d0516c19130aeff3ec81f49ad85811660608301528681166080830152600060a083015260c0820186905291517f2c7af570000000000000000000000000000000000000000000000000000000008152929350917f000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f749090911690632c7af570906105bb9084906004016109d8565b600060405180830381600087803b1580156105d557600080fd5b505af11580156105e9573d6000803e3d6000fd5b50506040517f163db1d300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f749016925063163db1d3915061065f9084906004016109d8565b600060405180830381600087803b15801561067957600080fd5b505af115801561068d573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f749073ffffffffffffffffffffffffffffffffffffffff1663c34c08e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906108ac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461078a576040517f26bee1ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600055565b804710156107cf576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240160405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610829576040519150601f19603f3d011682016040523d82523d6000602084013e61082e565b606091505b5050905080610869576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020828403121561088057600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146108a957600080fd5b50565b6000602082840312156108be57600080fd5b81516108c981610887565b9392505050565b6000815180845260005b818110156108f6576020818501810151868301820152016108da565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60ff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525083606083015260c0608083015261097c60c08301846108d0565b82810360a0840152601981527f23204d696e7420506f6c69637920746f20416c706163610a0a000000000000006020820152604081019150509695505050505050565b6000602082840312156109d157600080fd5b5051919050565b60208152815160208201526000602083015173ffffffffffffffffffffffffffffffffffffffff808216604085015260ff60408601511660608501528060608601511660808501528060808601511660a0850152505060a083015160c083015260c083015160e080840152610a516101008401826108d0565b94935050505056fea164736f6c6343000817000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f7490000000000000000000000000770f9062d8f0dc6871d646a6daf51c2d86a3b56500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000ce6a1f03af254d0516c19130aeff3ec81f49ad85
-----Decoded View---------------
Arg [0] : llamaCore (address): 0xD82c90dcbcBEC5Be03f93Ad0Ead45fE44a3f7490
Arg [1] : llamaAccount (address): 0x770F9062D8f0DC6871D646a6Daf51c2D86A3b565
Arg [2] : shepherdRole (uint8): 2
Arg [3] : alpacaRole (uint8): 3
Arg [4] : instantExecutionStrategy (address): 0xce6A1f03AF254d0516C19130aEFf3EC81f49AD85
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000d82c90dcbcbec5be03f93ad0ead45fe44a3f7490
Arg [1] : 000000000000000000000000770f9062d8f0dc6871d646a6daf51c2d86a3b565
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 000000000000000000000000ce6a1f03af254d0516c19130aeff3ec81f49ad85
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.