ETH Price: $2,581.12 (-1.48%)

Contract

0x3F518b9f83d4f407A24faE7829a2a3d97EdCfB57

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Mint Policy1186304672024-04-11 18:21:51187 days ago1712859711IN
0x3F518b9f...97EdCfB57
0.001 ETH0.000030692740.0619687
Mint Policy1184718632024-04-08 2:15:03190 days ago1712542503IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000033086390.00662365
Mint Policy1184080652024-04-06 14:48:27192 days ago1712414907IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000041802960.00836837
Mint Policy1184034202024-04-06 12:13:37192 days ago1712405617IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000057917970.01164891
Mint Policy1183758722024-04-05 20:55:21192 days ago1712350521IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000305089790.06156451
Mint Policy1183716302024-04-05 18:33:57193 days ago1712342037IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000059313270.01186791
Mint Policy1183653082024-04-05 15:03:13193 days ago1712329393IN
0x3F518b9f...97EdCfB57
0.001 ETH0.000007756330.01550508
Mint Policy1183652822024-04-05 15:02:21193 days ago1712329341IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000077102270.01542287
Mint Policy1183652582024-04-05 15:01:33193 days ago1712329293IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000075469980.01510012
Mint Policy1183652302024-04-05 15:00:37193 days ago1712329237IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000076917840.01539785
Mint Policy1183609152024-04-05 12:36:47193 days ago1712320607IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000125645430.02530902
Mint Policy1183509232024-04-05 7:03:43193 days ago1712300623IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000209893470.04237562
Mint Policy1183460782024-04-05 4:22:13193 days ago1712290933IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000278901710.0563434
Mint Policy1183459832024-04-05 4:19:03193 days ago1712290743IN
0x3F518b9f...97EdCfB57
0.001 ETH0.000028101290.05676547
Mint Policy1183290252024-04-04 18:53:47194 days ago1712256827IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000305752530.06161858
Mint Policy1183268982024-04-04 17:42:53194 days ago1712252573IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000300277430.06051685
Mint Policy1183268492024-04-04 17:41:15194 days ago1712252475IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000304195810.06130252
Mint Policy1183268312024-04-04 17:40:39194 days ago1712252439IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000301033150.06066284
Mint Policy1183268122024-04-04 17:40:01194 days ago1712252401IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000296386690.05970175
Mint Policy1183235922024-04-04 15:52:41194 days ago1712245961IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000300034620.06047467
Mint Policy1183235132024-04-04 15:50:03194 days ago1712245803IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000299714630.06041377
Mint Policy1183208072024-04-04 14:19:51194 days ago1712240391IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000307027170.06191175
Mint Policy1183186782024-04-04 13:08:53194 days ago1712236133IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000302319970.06101866
Mint Policy1183152462024-04-04 11:14:29194 days ago1712229269IN
0x3F518b9f...97EdCfB57
0.001 ETH0.0000206160670.06135958
Mint Policy1183152402024-04-04 11:14:17194 days ago1712229257IN
0x3F518b9f...97EdCfB57
0.001 ETH0.000030666810.06190857
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1186304672024-04-11 18:21:51187 days ago1712859711
0x3F518b9f...97EdCfB57
0.001 ETH
1184718632024-04-08 2:15:03190 days ago1712542503
0x3F518b9f...97EdCfB57
0.001 ETH
1184080652024-04-06 14:48:27192 days ago1712414907
0x3F518b9f...97EdCfB57
0.001 ETH
1184034202024-04-06 12:13:37192 days ago1712405617
0x3F518b9f...97EdCfB57
0.001 ETH
1183758722024-04-05 20:55:21192 days ago1712350521
0x3F518b9f...97EdCfB57
0.001 ETH
1183716302024-04-05 18:33:57193 days ago1712342037
0x3F518b9f...97EdCfB57
0.001 ETH
1183653082024-04-05 15:03:13193 days ago1712329393
0x3F518b9f...97EdCfB57
0.001 ETH
1183652822024-04-05 15:02:21193 days ago1712329341
0x3F518b9f...97EdCfB57
0.001 ETH
1183652582024-04-05 15:01:33193 days ago1712329293
0x3F518b9f...97EdCfB57
0.001 ETH
1183652302024-04-05 15:00:37193 days ago1712329237
0x3F518b9f...97EdCfB57
0.001 ETH
1183609152024-04-05 12:36:47193 days ago1712320607
0x3F518b9f...97EdCfB57
0.001 ETH
1183509232024-04-05 7:03:43193 days ago1712300623
0x3F518b9f...97EdCfB57
0.001 ETH
1183460782024-04-05 4:22:13193 days ago1712290933
0x3F518b9f...97EdCfB57
0.001 ETH
1183459832024-04-05 4:19:03193 days ago1712290743
0x3F518b9f...97EdCfB57
0.001 ETH
1183290252024-04-04 18:53:47194 days ago1712256827
0x3F518b9f...97EdCfB57
0.001 ETH
1183268982024-04-04 17:42:53194 days ago1712252573
0x3F518b9f...97EdCfB57
0.001 ETH
1183268492024-04-04 17:41:15194 days ago1712252475
0x3F518b9f...97EdCfB57
0.001 ETH
1183268312024-04-04 17:40:39194 days ago1712252439
0x3F518b9f...97EdCfB57
0.001 ETH
1183268122024-04-04 17:40:01194 days ago1712252401
0x3F518b9f...97EdCfB57
0.001 ETH
1183235922024-04-04 15:52:41194 days ago1712245961
0x3F518b9f...97EdCfB57
0.001 ETH
1183235132024-04-04 15:50:03194 days ago1712245803
0x3F518b9f...97EdCfB57
0.001 ETH
1183208072024-04-04 14:19:51194 days ago1712240391
0x3F518b9f...97EdCfB57
0.001 ETH
1183186782024-04-04 13:08:53194 days ago1712236133
0x3F518b9f...97EdCfB57
0.001 ETH
1183152462024-04-04 11:14:29194 days ago1712229269
0x3F518b9f...97EdCfB57
0.001 ETH
1183152402024-04-04 11:14:17194 days ago1712229257
0x3F518b9f...97EdCfB57
0.001 ETH
View All Internal Transactions

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
File 1 of 10 : Shepherd.sol
// 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;
  }
}

File 2 of 10 : Address.sol
// 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();
        }
    }
}

File 3 of 10 : ILlamaCore.sol
// 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);
}

File 4 of 10 : ILlamaPolicy.sol
// 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;
}

File 5 of 10 : ILlamaStrategy.sol
// 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);
}

File 6 of 10 : Structs.sol
// 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.
}

File 7 of 10 : Enums.sol
// 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
}

File 8 of 10 : UDVTs.sol
// 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;

File 9 of 10 : ILlamaAccount.sol
// 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);
}

File 10 of 10 : ILlamaActionGuard.sol
// 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;
}

Settings
{
  "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

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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