Source Code
Overview
MON Balance
MON Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 42279760 | 39 days ago | Contract Creation | 0 MON |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x61C5B1bE...d11728a8C in Linea Mainnet The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Packer
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 100 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.17 <0.9.0; import "../Types.sol"; /** * @title BufferPacker a library that provides packing and unpacking functions * for conditions. It allows packing externally provided ConditionsFlat[] into * a storage-optimized buffer, and later unpack it into memory. * @author Cristóvão Honorato - <[email protected]> */ library BufferPacker { // HEADER (stored as a single word in storage) // 2 bytes -> count (Condition count) // 1 bytes -> options (ExecutionOptions) // 1 bytes -> isWildcarded // 8 bytes -> unused // 20 bytes -> pointer (address containining packed conditions) uint256 private constant OFFSET_COUNT = 240; uint256 private constant OFFSET_OPTIONS = 224; uint256 private constant OFFSET_IS_WILDCARDED = 216; uint256 private constant MASK_COUNT = 0xffff << OFFSET_COUNT; uint256 private constant MASK_OPTIONS = 0xff << OFFSET_OPTIONS; uint256 private constant MASK_IS_WILDCARDED = 0x1 << OFFSET_IS_WILDCARDED; // CONDITION (stored as runtimeBytecode at pointer address kept in header) // 8 bits -> parent // 3 bits -> type // 5 bits -> operator uint256 private constant BYTES_PER_CONDITION = 2; uint16 private constant OFFSET_PARENT = 8; uint16 private constant OFFSET_PARAM_TYPE = 5; uint16 private constant OFFSET_OPERATOR = 0; uint16 private constant MASK_PARENT = uint16(0xff << OFFSET_PARENT); uint16 private constant MASK_PARAM_TYPE = uint16(0x07 << OFFSET_PARAM_TYPE); uint16 private constant MASK_OPERATOR = uint16(0x1f << OFFSET_OPERATOR); function packedSize( ConditionFlat[] memory conditions ) internal pure returns (uint256 result) { uint256 count = conditions.length; result = count * BYTES_PER_CONDITION; for (uint256 i; i < count; ++i) { if (conditions[i].operator >= Operator.EqualTo) { result += 32; } } } function packHeader( uint256 count, ExecutionOptions options, address pointer ) internal pure returns (bytes32) { return bytes32(count << OFFSET_COUNT) | (bytes32(uint256(options)) << OFFSET_OPTIONS) | bytes32(uint256(uint160(pointer))); } function packHeaderAsWildcarded( ExecutionOptions options ) internal pure returns (bytes32) { return bytes32(uint256(options) << OFFSET_OPTIONS) | bytes32(MASK_IS_WILDCARDED); } function unpackHeader( bytes32 header ) internal pure returns (uint256 count, address pointer) { count = (uint256(header) & MASK_COUNT) >> OFFSET_COUNT; pointer = address(bytes20(uint160(uint256(header)))); } function unpackOptions( bytes32 header ) internal pure returns (bool isWildcarded, ExecutionOptions options) { isWildcarded = uint256(header) & MASK_IS_WILDCARDED != 0; options = ExecutionOptions( (uint256(header) & MASK_OPTIONS) >> OFFSET_OPTIONS ); } function packCondition( bytes memory buffer, uint256 index, ConditionFlat memory condition ) internal pure { uint256 offset = index * BYTES_PER_CONDITION; buffer[offset] = bytes1(condition.parent); buffer[offset + 1] = bytes1( (uint8(condition.paramType) << uint8(OFFSET_PARAM_TYPE)) | uint8(condition.operator) ); } function packCompValue( bytes memory buffer, uint256 offset, ConditionFlat memory condition ) internal pure { bytes32 word = condition.operator == Operator.EqualTo ? keccak256(condition.compValue) : bytes32(condition.compValue); assembly { mstore(add(buffer, offset), word) } } function unpackBody( bytes memory buffer, uint256 count ) internal pure returns (ConditionFlat[] memory result, bytes32[] memory compValues) { result = new ConditionFlat[](count); compValues = new bytes32[](count); bytes32 word; uint256 offset = 32; uint256 compValueOffset = 32 + count * BYTES_PER_CONDITION; for (uint256 i; i < count; ) { assembly { word := mload(add(buffer, offset)) } offset += BYTES_PER_CONDITION; uint16 bits = uint16(bytes2(word)); ConditionFlat memory condition = result[i]; condition.parent = uint8((bits & MASK_PARENT) >> OFFSET_PARENT); condition.paramType = ParameterType( (bits & MASK_PARAM_TYPE) >> OFFSET_PARAM_TYPE ); condition.operator = Operator(bits & MASK_OPERATOR); if (condition.operator >= Operator.EqualTo) { assembly { word := mload(add(buffer, compValueOffset)) } compValueOffset += 32; compValues[i] = word; } unchecked { ++i; } } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title Enum - Collection of enums /// @author Richard Meissner - <[email protected]> contract Enum { enum Operation {Call, DelegateCall} }
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;
import {Enum} from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol";
import {ExecutionTracker} from "../signature/ExecutionTracker.sol";
import {IAvatar} from "../interfaces/IAvatar.sol";
import {Module} from "./Module.sol";
import {SignatureChecker} from "../signature/SignatureChecker.sol";
/// @title Modifier Interface - A contract that sits between a Module and an Avatar and enforce some additional logic.
abstract contract Modifier is
Module,
ExecutionTracker,
SignatureChecker,
IAvatar
{
address internal constant SENTINEL_MODULES = address(0x1);
/// Mapping of modules.
mapping(address => address) internal modules;
/// `sender` is not an authorized module.
/// @param sender The address of the sender.
error NotAuthorized(address sender);
/// `module` is invalid.
error InvalidModule(address module);
/// `pageSize` is invalid.
error InvalidPageSize();
/// `module` is already disabled.
error AlreadyDisabledModule(address module);
/// `module` is already enabled.
error AlreadyEnabledModule(address module);
/// @dev `setModules()` was already called.
error SetupModulesAlreadyCalled();
/*
--------------------------------------------------
You must override both of the following virtual functions,
execTransactionFromModule() and execTransactionFromModuleReturnData().
It is recommended that implementations of both functions make use the
onlyModule modifier.
*/
/// @dev Passes a transaction to the modifier.
/// @notice Can only be called by enabled modules.
/// @param to Destination address of module transaction.
/// @param value Ether value of module transaction.
/// @param data Data payload of module transaction.
/// @param operation Operation type of module transaction.
function execTransactionFromModule(
address to,
uint256 value,
bytes calldata data,
Enum.Operation operation
) public virtual returns (bool success);
/// @dev Passes a transaction to the modifier, expects return data.
/// @notice Can only be called by enabled modules.
/// @param to Destination address of module transaction.
/// @param value Ether value of module transaction.
/// @param data Data payload of module transaction.
/// @param operation Operation type of module transaction.
function execTransactionFromModuleReturnData(
address to,
uint256 value,
bytes calldata data,
Enum.Operation operation
) public virtual returns (bool success, bytes memory returnData);
/*
--------------------------------------------------
*/
modifier moduleOnly() {
if (modules[msg.sender] == address(0)) {
(bytes32 hash, address signer) = moduleTxSignedBy();
// is the signer a module?
if (modules[signer] == address(0)) {
revert NotAuthorized(msg.sender);
}
// is the provided signature fresh?
if (consumed[signer][hash]) {
revert HashAlreadyConsumed(hash);
}
consumed[signer][hash] = true;
emit HashExecuted(hash);
}
_;
}
function sentOrSignedByModule() internal view returns (address) {
if (modules[msg.sender] != address(0)) {
return msg.sender;
}
(, address signer) = moduleTxSignedBy();
if (modules[signer] != address(0)) {
return signer;
}
return address(0);
}
/// @dev Disables a module on the modifier.
/// @notice This can only be called by the owner.
/// @param prevModule Module that pointed to the module to be removed in the linked list.
/// @param module Module to be removed.
function disableModule(
address prevModule,
address module
) public override onlyOwner {
if (module == address(0) || module == SENTINEL_MODULES)
revert InvalidModule(module);
if (modules[prevModule] != module) revert AlreadyDisabledModule(module);
modules[prevModule] = modules[module];
modules[module] = address(0);
emit DisabledModule(module);
}
/// @dev Enables a module that can add transactions to the queue
/// @param module Address of the module to be enabled
/// @notice This can only be called by the owner
function enableModule(address module) public override onlyOwner {
if (module == address(0) || module == SENTINEL_MODULES)
revert InvalidModule(module);
if (modules[module] != address(0)) revert AlreadyEnabledModule(module);
modules[module] = modules[SENTINEL_MODULES];
modules[SENTINEL_MODULES] = module;
emit EnabledModule(module);
}
/// @dev Returns if an module is enabled
/// @return True if the module is enabled
function isModuleEnabled(
address _module
) public view override returns (bool) {
return SENTINEL_MODULES != _module && modules[_module] != address(0);
}
/// @dev Returns array of modules.
/// If all entries fit into a single page, the next pointer will be 0x1.
/// If another page is present, next will be the last element of the returned array.
/// @param start Start of the page. Has to be a module or start pointer (0x1 address)
/// @param pageSize Maximum number of modules that should be returned. Has to be > 0
/// @return array Array of modules.
/// @return next Start of the next page.
function getModulesPaginated(
address start,
uint256 pageSize
) external view override returns (address[] memory array, address next) {
if (start != SENTINEL_MODULES && !isModuleEnabled(start)) {
revert InvalidModule(start);
}
if (pageSize == 0) {
revert InvalidPageSize();
}
// Init array with max page size
array = new address[](pageSize);
// Populate return array
uint256 moduleCount = 0;
next = modules[start];
while (
next != address(0) && next != SENTINEL_MODULES && moduleCount < pageSize
) {
array[moduleCount] = next;
next = modules[next];
moduleCount++;
}
// Because of the argument validation we can assume that
// the `currentModule` will always be either a module address
// or sentinel address (aka the end). If we haven't reached the end
// inside the loop, we need to set the next pointer to the last element
// because it skipped over to the next module which is neither included
// in the current page nor won't be included in the next one
// if you pass it as a start.
if (next != SENTINEL_MODULES) {
next = array[moduleCount - 1];
}
// Set correct size of returned array
// solhint-disable-next-line no-inline-assembly
assembly {
mstore(array, moduleCount)
}
}
/// @dev Initializes the modules linked list.
/// @notice Should be called as part of the `setUp` / initializing function and can only be called once.
function setupModules() internal {
if (modules[SENTINEL_MODULES] != address(0))
revert SetupModulesAlreadyCalled();
modules[SENTINEL_MODULES] = SENTINEL_MODULES;
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;
import {Enum} from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol";
import {FactoryFriendly} from "../factory/FactoryFriendly.sol";
import {IAvatar} from "../interfaces/IAvatar.sol";
/// @title Module Interface - A contract that can pass messages to a Module Manager contract if enabled by that contract.
abstract contract Module is FactoryFriendly {
/// @dev Address that will ultimately execute function calls.
address public avatar;
/// @dev Address that this module will pass transactions to.
address public target;
/// @dev Emitted each time the avatar is set.
event AvatarSet(address indexed previousAvatar, address indexed newAvatar);
/// @dev Emitted each time the Target is set.
event TargetSet(address indexed previousTarget, address indexed newTarget);
/// @dev Sets the avatar to a new avatar (`newAvatar`).
/// @notice Can only be called by the current owner.
function setAvatar(address _avatar) public onlyOwner {
address previousAvatar = avatar;
avatar = _avatar;
emit AvatarSet(previousAvatar, _avatar);
}
/// @dev Sets the target to a new target (`newTarget`).
/// @notice Can only be called by the current owner.
function setTarget(address _target) public onlyOwner {
address previousTarget = target;
target = _target;
emit TargetSet(previousTarget, _target);
}
/// @dev Passes a transaction to be executed by the avatar.
/// @notice Can only be called by this contract.
/// @param to Destination address of module transaction.
/// @param value Ether value of module transaction.
/// @param data Data payload of module transaction.
/// @param operation Operation type of module transaction: 0 == call, 1 == delegate call.
function exec(
address to,
uint256 value,
bytes memory data,
Enum.Operation operation
) internal virtual returns (bool success) {
return
IAvatar(target).execTransactionFromModule(to, value, data, operation);
}
/// @dev Passes a transaction to be executed by the target and returns data.
/// @notice Can only be called by this contract.
/// @param to Destination address of module transaction.
/// @param value Ether value of module transaction.
/// @param data Data payload of module transaction.
/// @param operation Operation type of module transaction: 0 == call, 1 == delegate call.
function execAndReturnData(
address to,
uint256 value,
bytes memory data,
Enum.Operation operation
) internal virtual returns (bool success, bytes memory returnData) {
return
IAvatar(target).execTransactionFromModuleReturnData(
to,
value,
data,
operation
);
}
}// SPDX-License-Identifier: LGPL-3.0-only
/// @title Zodiac FactoryFriendly - A contract that allows other contracts to be initializable and pass bytes as arguments to define contract state
pragma solidity >=0.7.0 <0.9.0;
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
abstract contract FactoryFriendly is OwnableUpgradeable {
function setUp(bytes memory initializeParams) public virtual;
}// SPDX-License-Identifier: LGPL-3.0-only
/// @title Zodiac Avatar - A contract that manages modules that can execute transactions via this contract.
pragma solidity >=0.7.0 <0.9.0;
import {Enum} from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol";
interface IAvatar {
event EnabledModule(address module);
event DisabledModule(address module);
event ExecutionFromModuleSuccess(address indexed module);
event ExecutionFromModuleFailure(address indexed module);
/// @dev Enables a module on the avatar.
/// @notice Can only be called by the avatar.
/// @notice Modules should be stored as a linked list.
/// @notice Must emit EnabledModule(address module) if successful.
/// @param module Module to be enabled.
function enableModule(address module) external;
/// @dev Disables a module on the avatar.
/// @notice Can only be called by the avatar.
/// @notice Must emit DisabledModule(address module) if successful.
/// @param prevModule Address that pointed to the module to be removed in the linked list
/// @param module Module to be removed.
function disableModule(address prevModule, address module) external;
/// @dev Allows a Module to execute a transaction.
/// @notice Can only be called by an enabled module.
/// @notice Must emit ExecutionFromModuleSuccess(address module) if successful.
/// @notice Must emit ExecutionFromModuleFailure(address module) if unsuccessful.
/// @param to Destination address of module transaction.
/// @param value Ether value of module transaction.
/// @param data Data payload of module transaction.
/// @param operation Operation type of module transaction: 0 == call, 1 == delegate call.
function execTransactionFromModule(
address to,
uint256 value,
bytes memory data,
Enum.Operation operation
) external returns (bool success);
/// @dev Allows a Module to execute a transaction and return data
/// @notice Can only be called by an enabled module.
/// @notice Must emit ExecutionFromModuleSuccess(address module) if successful.
/// @notice Must emit ExecutionFromModuleFailure(address module) if unsuccessful.
/// @param to Destination address of module transaction.
/// @param value Ether value of module transaction.
/// @param data Data payload of module transaction.
/// @param operation Operation type of module transaction: 0 == call, 1 == delegate call.
function execTransactionFromModuleReturnData(
address to,
uint256 value,
bytes memory data,
Enum.Operation operation
) external returns (bool success, bytes memory returnData);
/// @dev Returns if an module is enabled
/// @return True if the module is enabled
function isModuleEnabled(address module) external view returns (bool);
/// @dev Returns array of modules.
/// @param start Start of the page.
/// @param pageSize Maximum number of modules that should be returned.
/// @return array Array of modules.
/// @return next Start of the next page.
function getModulesPaginated(
address start,
uint256 pageSize
) external view returns (address[] memory array, address next);
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.0 <0.9.0;
/// @title ExecutionTracker - A contract that keeps track of executed and invalidated hashes
contract ExecutionTracker {
error HashAlreadyConsumed(bytes32);
event HashExecuted(bytes32);
event HashInvalidated(bytes32);
mapping(address => mapping(bytes32 => bool)) public consumed;
function invalidate(bytes32 hash) external {
consumed[msg.sender][hash] = true;
emit HashInvalidated(hash);
}
}// SPDX-License-Identifier: LGPL-3.0-only
/* solhint-disable one-contract-per-file */
pragma solidity >=0.7.0 <0.9.0;
interface IERC1271 {
/**
* @notice EIP1271 method to validate a signature.
* @param hash Hash of the data signed on the behalf of address(this).
* @param signature Signature byte array associated with _data.
*
* MUST return the bytes4 magic value 0x1626ba7e when function passes.
* MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)
* MUST allow external calls
*/
function isValidSignature(
bytes32 hash,
bytes memory signature
) external view returns (bytes4);
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.0 <0.9.0;
import {IERC1271} from "./IERC1271.sol";
/// @title SignatureChecker - A contract that retrieves and validates signatures appended to transaction calldata.
/// @dev currently supports eip-712 and eip-1271 signatures
abstract contract SignatureChecker {
/**
* @notice Searches for a signature, validates it, and returns the signer's address.
* @dev When signature not found or invalid, zero address is returned
* @return The address of the signer.
*/
function moduleTxSignedBy() internal view returns (bytes32, address) {
bytes calldata data = msg.data;
/*
* The idea is to extend `onlyModule` and provide signature checking
* without code changes to inheriting contracts (Modifiers).
*
* Since it's a generic mechanism, there is no way to conclusively
* identify the trailing bytes as a signature. We simply slice those
* and recover signer.
*
* As a result, we impose a minimum calldata length equal to a function
* selector plus salt, plus a signature (i.e., 4 + 32 + 65 bytes), any
* shorter and calldata it guaranteed to not contain a signature.
*/
if (data.length < 4 + 32 + 65) {
return (bytes32(0), address(0));
}
(uint8 v, bytes32 r, bytes32 s) = _splitSignature(data);
uint256 end = data.length - (32 + 65);
bytes32 salt = bytes32(data[end:]);
/*
* When handling contract signatures:
* v - is zero
* r - contains the signer
* s - contains the offset within calldata where the signer specific
* signature is located
*
* We detect contract signatures by checking:
* 1- `v` is zero
* 2- `s` points within the buffer, is after selector, is before
* salt and delimits a non-zero length buffer
*/
if (v == 0) {
uint256 start = uint256(s);
if (start < 4 || start > end) {
return (bytes32(0), address(0));
}
address signer = address(uint160(uint256(r)));
bytes32 hash = moduleTxHash(data[:start], salt);
return
_isValidContractSignature(signer, hash, data[start:end])
? (hash, signer)
: (bytes32(0), address(0));
} else {
bytes32 hash = moduleTxHash(data[:end], salt);
return (hash, ecrecover(hash, v, r, s));
}
}
/**
* @notice Hashes the transaction EIP-712 data structure.
* @dev The produced hash is intended to be signed.
* @param data The current transaction's calldata.
* @param salt The salt value.
* @return The 32-byte hash that is to be signed.
*/
function moduleTxHash(
bytes calldata data,
bytes32 salt
) public view returns (bytes32) {
bytes32 domainSeparator = keccak256(
abi.encode(DOMAIN_SEPARATOR_TYPEHASH, block.chainid, this)
);
bytes memory moduleTxData = abi.encodePacked(
bytes1(0x19),
bytes1(0x01),
domainSeparator,
keccak256(abi.encode(MODULE_TX_TYPEHASH, keccak256(data), salt))
);
return keccak256(moduleTxData);
}
/**
* @dev Extracts signature from calldata, and divides it into `uint8 v, bytes32 r, bytes32 s`.
* @param data The current transaction's calldata.
* @return v The ECDSA v value
* @return r The ECDSA r value
* @return s The ECDSA s value
*/
function _splitSignature(
bytes calldata data
) private pure returns (uint8 v, bytes32 r, bytes32 s) {
v = uint8(bytes1(data[data.length - 1:]));
r = bytes32(data[data.length - 65:]);
s = bytes32(data[data.length - 33:]);
}
/**
* @dev Calls the signer contract, and validates the contract signature.
* @param signer The address of the signer contract.
* @param hash Hash of the data signed
* @param signature The contract signature.
* @return result Indicates whether the signature is valid.
*/
function _isValidContractSignature(
address signer,
bytes32 hash,
bytes calldata signature
) internal view returns (bool result) {
uint256 size;
// eslint-disable-line no-inline-assembly
assembly {
size := extcodesize(signer)
}
if (size == 0) {
return false;
}
(, bytes memory returnData) = signer.staticcall(
abi.encodeWithSelector(
IERC1271.isValidSignature.selector,
hash,
signature
)
);
return bytes4(returnData) == EIP1271_MAGIC_VALUE;
}
// keccak256(
// "EIP712Domain(uint256 chainId,address verifyingContract)"
// );
bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH =
0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;
// keccak256(
// "ModuleTx(bytes data,bytes32 salt)"
// );
bytes32 private constant MODULE_TX_TYPEHASH =
0x2939aeeda3ca260200c9f7b436b19e13207547ccc65cfedc857751c5ea6d91d4;
// bytes4(keccak256(
// "isValidSignature(bytes32,bytes)"
// ));
bytes4 private constant EIP1271_MAGIC_VALUE = 0x1626ba7e;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
/// @custom:storage-location erc7201:openzeppelin.storage.Ownable
struct OwnableStorage {
address _owner;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
assembly {
$.slot := OwnableStorageLocation
}
}
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
function __Ownable_init(address initialOwner) internal onlyInitializing {
__Ownable_init_unchained(initialOwner);
}
function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
OwnableStorage storage $ = _getOwnableStorage();
return $._owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
OwnableStorage storage $ = _getOwnableStorage();
address oldOwner = $._owner;
$._owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.20;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reininitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
assembly {
$.slot := INITIALIZABLE_STORAGE
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)
pragma solidity ^0.8.20;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.17 <0.9.0; import "@gnosis.pm/zodiac/contracts/core/Modifier.sol"; import "./BufferPacker.sol"; /** * @title Packer - a library that coordinates the process of packing * conditionsFlat into a storage optimized buffer. * @author Cristóvão Honorato - <[email protected]> */ library Packer { function pack( ConditionFlat[] memory conditionsFlat ) external pure returns (bytes memory buffer) { _removeExtraneousOffsets(conditionsFlat); buffer = new bytes(BufferPacker.packedSize(conditionsFlat)); uint256 count = conditionsFlat.length; uint256 offset = 32 + count * 2; for (uint256 i; i < count; ++i) { BufferPacker.packCondition(buffer, i, conditionsFlat[i]); if (conditionsFlat[i].operator >= Operator.EqualTo) { BufferPacker.packCompValue(buffer, offset, conditionsFlat[i]); offset += 32; } } } /** * @dev This function removes unnecessary offsets from compValue fields of * the `conditions` array. Its purpose is to ensure a consistent API where * every `compValue` provided for use in `Operations.EqualsTo` is obtained * by calling `abi.encode` directly. * * By removing the leading extraneous offsets this function makes * abi.encode(...) match the output produced by Decoder inspection. * Without it, the encoded fields would need to be patched externally * depending on whether the payload is fully encoded inline or not. * * @param conditionsFlat Array of ConditionFlat structs to remove extraneous * offsets from */ function _removeExtraneousOffsets( ConditionFlat[] memory conditionsFlat ) private pure { uint256 count = conditionsFlat.length; for (uint256 i; i < count; ++i) { if ( conditionsFlat[i].operator == Operator.EqualTo && !_isInline(conditionsFlat, i) ) { bytes memory compValue = conditionsFlat[i].compValue; uint256 length = compValue.length; assembly { compValue := add(compValue, 32) mstore(compValue, sub(length, 32)) } conditionsFlat[i].compValue = compValue; } } } function _isInline( ConditionFlat[] memory conditions, uint256 index ) private pure returns (bool) { ParameterType paramType = conditions[index].paramType; if (paramType == ParameterType.Static) { return true; } else if ( paramType == ParameterType.Dynamic || paramType == ParameterType.Array || paramType == ParameterType.Calldata || paramType == ParameterType.AbiEncoded ) { return false; } else { uint256 length = conditions.length; for (uint256 j = index + 1; j < length; ++j) { uint8 parent = conditions[j].parent; if (parent < index) { continue; } if (parent > index) { break; } if (!_isInline(conditions, j)) { return false; } } return true; } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.17 <0.9.0; /** * @title Types - a file that contains all of the type definitions used throughout * the Zodiac Roles Mod. * @author Cristóvão Honorato - <[email protected]> * @author Jan-Felix Schwarz - <[email protected]> */ enum ParameterType { None, Static, Dynamic, Tuple, Array, Calldata, AbiEncoded } enum Operator { // 00: EMPTY EXPRESSION (default, always passes) // paramType: Static / Dynamic / Tuple / Array // ❓ children (only for paramType: Tuple / Array to describe their structure) // 🚫 compValue /* 00: */ Pass, // ------------------------------------------------------------ // 01-04: LOGICAL EXPRESSIONS // paramType: None // ✅ children // 🚫 compValue /* 01: */ And, /* 02: */ Or, /* 03: */ Nor, /* 04: */ _Placeholder04, // ------------------------------------------------------------ // 05-14: COMPLEX EXPRESSIONS // paramType: Calldata / AbiEncoded / Tuple / Array, // ✅ children // 🚫 compValue /* 05: */ Matches, /* 06: */ ArraySome, /* 07: */ ArrayEvery, /* 08: */ ArraySubset, /* 09: */ _Placeholder09, /* 10: */ _Placeholder10, /* 11: */ _Placeholder11, /* 12: */ _Placeholder12, /* 13: */ _Placeholder13, /* 14: */ _Placeholder14, // ------------------------------------------------------------ // 15: SPECIAL COMPARISON (without compValue) // paramType: Static // 🚫 children // 🚫 compValue /* 15: */ EqualToAvatar, // ------------------------------------------------------------ // 16-31: COMPARISON EXPRESSIONS // paramType: Static / Dynamic / Tuple / Array // ❓ children (only for paramType: Tuple / Array to describe their structure) // ✅ compValue /* 16: */ EqualTo, // paramType: Static / Dynamic / Tuple / Array /* 17: */ GreaterThan, // paramType: Static /* 18: */ LessThan, // paramType: Static /* 19: */ SignedIntGreaterThan, // paramType: Static /* 20: */ SignedIntLessThan, // paramType: Static /* 21: */ Bitmask, // paramType: Static / Dynamic /* 22: */ Custom, // paramType: Static / Dynamic / Tuple / Array /* 23: */ _Placeholder23, /* 24: */ _Placeholder24, /* 25: */ _Placeholder25, /* 26: */ _Placeholder26, /* 27: */ _Placeholder27, /* 28: */ WithinAllowance, // paramType: Static /* 29: */ EtherWithinAllowance, // paramType: None /* 30: */ CallWithinAllowance, // paramType: None /* 31: */ _Placeholder31 } enum ExecutionOptions { None, Send, DelegateCall, Both } enum Clearance { None, Target, Function } // This struct is a flattened version of Condition // used for ABI encoding a scope config tree // (ABI does not support recursive types) struct ConditionFlat { uint8 parent; ParameterType paramType; Operator operator; bytes compValue; } struct Condition { ParameterType paramType; Operator operator; bytes32 compValue; Condition[] children; } struct ParameterPayload { uint256 location; uint256 size; ParameterPayload[] children; } struct TargetAddress { Clearance clearance; ExecutionOptions options; } struct Role { mapping(address => bool) members; mapping(address => TargetAddress) targets; mapping(bytes32 => bytes32) scopeConfig; } /// @notice The order of members in the `Allowance` struct is significant; members updated during accrual (`balance` and `timestamp`) should be stored in the same word. /// @custom:member refill Amount added to balance after each period elapses. /// @custom:member maxRefill Refilling stops when balance reaches this value. /// @custom:member period Duration, in seconds, before a refill occurs. If set to 0, the allowance is for one-time use and won't be replenished. /// @custom:member balance Remaining allowance available for use. Decreases with usage and increases after each refill by the specified refill amount. /// @custom:member timestamp Timestamp when the last refill occurred. struct Allowance { uint128 refill; uint128 maxRefill; uint64 period; uint128 balance; uint64 timestamp; } struct Consumption { bytes32 allowanceKey; uint128 balance; uint128 consumed; }
{
"evmVersion": "shanghai",
"optimizer": {
"enabled": true,
"runs": 100
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"uint8","name":"parent","type":"uint8"},{"internalType":"enum ParameterType","name":"paramType","type":"ParameterType"},{"internalType":"enum Operator","name":"operator","type":"Operator"},{"internalType":"bytes","name":"compValue","type":"bytes"}],"internalType":"struct ConditionFlat[]","name":"conditionsFlat","type":"tuple[]"}],"name":"pack","outputs":[{"internalType":"bytes","name":"buffer","type":"bytes"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
0x61085a610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063806362d214610038575b5f80fd5b61004b610046366004610602565b610061565b6040516100589190610735565b60405180910390f35b606061006c82610184565b61007582610246565b67ffffffffffffffff81111561008d5761008d610515565b6040519080825280601f01601f1916602001820160405280156100b7576020820181803683370190505b5082519091505f6100c9826002610794565b6100d49060206107ab565b90505f5b8281101561017c5761010484828784815181106100f7576100f76107be565b60200260200101516102bc565b6010858281518110610118576101186107be565b602002602001015160400151601f811115610135576101356107d2565b1061016c5761015e8483878481518110610151576101516107be565b6020026020010151610369565b6101696020836107ab565b91505b610175816107e6565b90506100d8565b505050919050565b80515f5b818110156102415760108382815181106101a4576101a46107be565b602002602001015160400151601f8111156101c1576101c16107d2565b1480156101d557506101d383826103b3565b155b15610231575f8382815181106101ed576101ed6107be565b60200260200101516060015190505f815190506020820191506020810382528185848151811061021f5761021f6107be565b60200260200101516060018190525050505b61023a816107e6565b9050610188565b505050565b80515f90610255600282610794565b91505f5b818110156102b5576010848281518110610275576102756107be565b602002602001015160400151601f811115610292576102926107d2565b106102a5576102a26020846107ab565b92505b6102ae816107e6565b9050610259565b5050919050565b5f6102c8600284610794565b9050815f015160f81b8482815181106102e3576102e36107be565b60200101906001600160f81b03191690815f1a9053508160400151601f81111561030f5761030f6107d2565b60208301516005906006811115610328576103286107d2565b60ff16901b1760f81b8461033d8360016107ab565b8151811061034d5761034d6107be565b60200101906001600160f81b03191690815f1a90535050505050565b5f60108260400151601f811115610382576103826107d2565b1461039a578160600151610395906107fe565b6103a7565b8160600151805190602001205b93909201929092525050565b5f808383815181106103c7576103c76107be565b6020026020010151602001519050600160068111156103e8576103e86107d2565b8160068111156103fa576103fa6107d2565b0361040957600191505061050f565b600281600681111561041d5761041d6107d2565b148061043a57506004816006811115610438576104386107d2565b145b8061045657506005816006811115610454576104546107d2565b145b8061047257506006816006811115610470576104706107d2565b145b15610480575f91505061050f565b83515f61048e8560016107ab565b90505b81811015610507575f8682815181106104ac576104ac6107be565b60200260200101515f01519050858160ff1610156104ca57506104f7565b858160ff1611156104db5750610507565b6104e587836103b3565b6104f5575f94505050505061050f565b505b610500816107e6565b9050610491565b506001925050505b92915050565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561054c5761054c610515565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561057b5761057b610515565b604052919050565b803560208110610591575f80fd5b919050565b5f82601f8301126105a5575f80fd5b813567ffffffffffffffff8111156105bf576105bf610515565b6105d2601f8201601f1916602001610552565b8181528460208386010111156105e6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020808385031215610613575f80fd5b823567ffffffffffffffff8082111561062a575f80fd5b818501915085601f83011261063d575f80fd5b81358181111561064f5761064f610515565b8060051b61065e858201610552565b9182528381018501918581019089841115610677575f80fd5b86860192505b8383101561072857823585811115610694575f8081fd5b86016080818c03601f19018113156106ab575f8081fd5b6106b3610529565b8983013560ff811681146106c6575f8081fd5b8152604083810135600781106106db575f8081fd5b828c015260606106ec858201610583565b83830152928401359289841115610704575f91508182fd5b6107128f8d86880101610596565b908301525084525050918601919086019061067d565b9998505050505050505050565b5f6020808352835180828501525f5b8181101561076057858101830151858201604001528201610744565b505f604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761050f5761050f610780565b8082018082111561050f5761050f610780565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f600182016107f7576107f7610780565b5060010190565b8051602080830151919081101561081e575f198160200360031b1b821691505b5091905056fea2646970667358221220846602d30c03a74612cec2230aa80d825d1a1f351c7e8939c0c2ec81a32434a064736f6c63430008150033
Deployed Bytecode
0x7361c5b1be435391fdd7bc6703f3740c0d11728a8c3014608060405260043610610034575f3560e01c8063806362d214610038575b5f80fd5b61004b610046366004610602565b610061565b6040516100589190610735565b60405180910390f35b606061006c82610184565b61007582610246565b67ffffffffffffffff81111561008d5761008d610515565b6040519080825280601f01601f1916602001820160405280156100b7576020820181803683370190505b5082519091505f6100c9826002610794565b6100d49060206107ab565b90505f5b8281101561017c5761010484828784815181106100f7576100f76107be565b60200260200101516102bc565b6010858281518110610118576101186107be565b602002602001015160400151601f811115610135576101356107d2565b1061016c5761015e8483878481518110610151576101516107be565b6020026020010151610369565b6101696020836107ab565b91505b610175816107e6565b90506100d8565b505050919050565b80515f5b818110156102415760108382815181106101a4576101a46107be565b602002602001015160400151601f8111156101c1576101c16107d2565b1480156101d557506101d383826103b3565b155b15610231575f8382815181106101ed576101ed6107be565b60200260200101516060015190505f815190506020820191506020810382528185848151811061021f5761021f6107be565b60200260200101516060018190525050505b61023a816107e6565b9050610188565b505050565b80515f90610255600282610794565b91505f5b818110156102b5576010848281518110610275576102756107be565b602002602001015160400151601f811115610292576102926107d2565b106102a5576102a26020846107ab565b92505b6102ae816107e6565b9050610259565b5050919050565b5f6102c8600284610794565b9050815f015160f81b8482815181106102e3576102e36107be565b60200101906001600160f81b03191690815f1a9053508160400151601f81111561030f5761030f6107d2565b60208301516005906006811115610328576103286107d2565b60ff16901b1760f81b8461033d8360016107ab565b8151811061034d5761034d6107be565b60200101906001600160f81b03191690815f1a90535050505050565b5f60108260400151601f811115610382576103826107d2565b1461039a578160600151610395906107fe565b6103a7565b8160600151805190602001205b93909201929092525050565b5f808383815181106103c7576103c76107be565b6020026020010151602001519050600160068111156103e8576103e86107d2565b8160068111156103fa576103fa6107d2565b0361040957600191505061050f565b600281600681111561041d5761041d6107d2565b148061043a57506004816006811115610438576104386107d2565b145b8061045657506005816006811115610454576104546107d2565b145b8061047257506006816006811115610470576104706107d2565b145b15610480575f91505061050f565b83515f61048e8560016107ab565b90505b81811015610507575f8682815181106104ac576104ac6107be565b60200260200101515f01519050858160ff1610156104ca57506104f7565b858160ff1611156104db5750610507565b6104e587836103b3565b6104f5575f94505050505061050f565b505b610500816107e6565b9050610491565b506001925050505b92915050565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561054c5761054c610515565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561057b5761057b610515565b604052919050565b803560208110610591575f80fd5b919050565b5f82601f8301126105a5575f80fd5b813567ffffffffffffffff8111156105bf576105bf610515565b6105d2601f8201601f1916602001610552565b8181528460208386010111156105e6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020808385031215610613575f80fd5b823567ffffffffffffffff8082111561062a575f80fd5b818501915085601f83011261063d575f80fd5b81358181111561064f5761064f610515565b8060051b61065e858201610552565b9182528381018501918581019089841115610677575f80fd5b86860192505b8383101561072857823585811115610694575f8081fd5b86016080818c03601f19018113156106ab575f8081fd5b6106b3610529565b8983013560ff811681146106c6575f8081fd5b8152604083810135600781106106db575f8081fd5b828c015260606106ec858201610583565b83830152928401359289841115610704575f91508182fd5b6107128f8d86880101610596565b908301525084525050918601919086019061067d565b9998505050505050505050565b5f6020808352835180828501525f5b8181101561076057858101830151858201604001528201610744565b505f604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761050f5761050f610780565b8082018082111561050f5761050f610780565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f600182016107f7576107f7610780565b5060010190565b8051602080830151919081101561081e575f198160200360031b1b821691505b5091905056fea2646970667358221220846602d30c03a74612cec2230aa80d825d1a1f351c7e8939c0c2ec81a32434a064736f6c63430008150033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.