Source Code
Overview
ETH Balance
0.001 ETH
Eth Value
$1.96 (@ $1,958.99/ETH)Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit | 24335530 | 18 days ago | IN | 0.001 ETH | 0.00000536 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
AdvancedVault
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
prague EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {PredicateClient} from "../../mixins/PredicateClient.sol";
import {Attestation} from "../../interfaces/IPredicateRegistry.sol";
/**
* @title AdvancedVault
* @author Predicate Labs, Inc (https://predicate.io)
* @notice Minimal example using PredicateClient for function and value-based authorization
* @dev Demonstrates PredicateClient when your policy needs to validate:
* - WHICH function is called (withdraw vs transfer)
* - HOW MUCH value (amount limits)
* - WHAT parameters (recipient addresses)
*
* The key difference: policies can enforce different rules per function
*/
contract AdvancedVault is PredicateClient, Ownable {
mapping(address => uint256) public balances;
event Deposit(address indexed user, uint256 amount);
event Withdrawal(address indexed user, address indexed to, uint256 amount);
event Transfer(address indexed from, address indexed to, uint256 amount);
constructor(
address _owner,
address _registry,
string memory _policyID
) Ownable(_owner) {
_initPredicateClient(_registry, _policyID);
}
/**
* @notice Deposit ETH - no attestation required
*/
function deposit() external payable {
balances[msg.sender] += msg.value;
emit Deposit(msg.sender, msg.value);
}
/**
* @notice Withdraw with amount validation
* @dev Policy can enforce max withdrawal limits
* @param _amount Amount to withdraw (validated by policy)
* @param _attestation Must include encoded function data
*/
function withdraw(
uint256 _amount,
Attestation calldata _attestation
) external {
require(balances[msg.sender] >= _amount, "Insufficient balance");
// Encode function signature and parameters for policy validation
bytes memory encoded = abi.encodeWithSignature("_executeWithdraw(address,uint256)", msg.sender, _amount);
// Advanced authorization with function details
require(_authorizeTransaction(_attestation, encoded, msg.sender, 0), "Unauthorized");
_executeWithdraw(msg.sender, _amount);
}
/**
* @notice Withdraw to specific address with full parameter validation
* @dev Policy validates BOTH recipient AND amount
* @param _to Recipient address (validated by policy)
* @param _amount Amount (validated by policy)
* @param _attestation Must include encoded function data
*/
function withdrawTo(
address _to,
uint256 _amount,
Attestation calldata _attestation
) external {
require(balances[msg.sender] >= _amount, "Insufficient balance");
// Policy sees different function signature and parameters
bytes memory encoded = abi.encodeWithSignature("_executeWithdraw(address,uint256)", _to, _amount);
require(_authorizeTransaction(_attestation, encoded, msg.sender, 0), "Unauthorized");
_executeWithdraw(_to, _amount);
}
/**
* @notice Transfer between users - different policy rules than withdraw
* @dev Shows how policies can have function-specific rules
* @param _to Recipient
* @param _amount Amount to transfer
* @param _attestation Must include encoded transfer data
*/
function transfer(
address _to,
uint256 _amount,
Attestation calldata _attestation
) external {
require(balances[msg.sender] >= _amount, "Insufficient balance");
// Different function = different policy rules possible
bytes memory encoded =
abi.encodeWithSignature("_executeTransfer(address,address,uint256)", msg.sender, _to, _amount);
require(_authorizeTransaction(_attestation, encoded, msg.sender, 0), "Unauthorized");
_executeTransfer(msg.sender, _to, _amount);
}
/**
* @notice Payable function example - policy validates msg.value
* @dev Shows value-based authorization for payable functions
* @param _lockPeriod Lock period parameter
* @param _attestation Must include msg.value in validation
*/
function depositAndLock(
uint256 _lockPeriod,
Attestation calldata _attestation
) external payable {
require(msg.value > 0, "Must send ETH");
bytes memory encoded =
abi.encodeWithSignature("_executeLock(address,uint256,uint256)", msg.sender, msg.value, _lockPeriod);
// Note: msg.value passed for validation
require(_authorizeTransaction(_attestation, encoded, msg.sender, msg.value), "Unauthorized");
balances[msg.sender] += msg.value;
emit Deposit(msg.sender, msg.value);
// Lock logic would go here
}
// Internal execution functions
function _executeWithdraw(
address _to,
uint256 _amount
) internal {
balances[msg.sender] -= _amount;
payable(_to).transfer(_amount);
emit Withdrawal(msg.sender, _to, _amount);
}
function _executeTransfer(
address _from,
address _to,
uint256 _amount
) internal {
balances[_from] -= _amount;
balances[_to] += _amount;
emit Transfer(_from, _to, _amount);
}
function _executeLock(
address _user,
uint256 _amount,
uint256 _period
) internal {
// Lock implementation would go here
}
/**
* @notice Required: Set policy ID with access control
* @dev Business logic contracts MUST implement this with proper access control
*/
function setPolicyID(
string memory _policyID
) external onlyOwner {
_setPolicyID(_policyID);
}
/**
* @notice Required: Set registry with access control
* @dev Business logic contracts MUST implement this with proper access control
*/
function setRegistry(
address _registry
) external onlyOwner {
_setRegistry(_registry);
}
/**
* @notice Required: Expose policy ID getter
* @dev Inherited from PredicateClient - no implementation needed
*/
// function getPolicyID() external view returns (string memory) - inherited
/**
* @notice Required: Expose registry getter
* @dev Inherited from PredicateClient - no implementation needed
*/
// function getRegistry() external view returns (address) - inherited
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.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 Ownable is Context {
address private _owner;
/**
* @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.
*/
constructor(address initialOwner) {
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) {
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 {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.4;
import {IPredicateRegistry, Attestation, Statement} from "../interfaces/IPredicateRegistry.sol";
import {IPredicateClient, PredicateClient__Unauthorized} from "../interfaces/IPredicateClient.sol";
/**
* @title PredicateClient
* @author Predicate Labs, Inc (https://predicate.io)
* @notice Abstract contract for integrating Predicate attestation validation
* @dev Provides core functionality for contracts to validate attestations before executing transactions.
* Implements ERC-7201 namespaced storage to prevent collisions in upgradeable contracts.
*
* Usage:
* 1. Inherit this contract
* 2. Call _initPredicateClient() in your constructor
* 3. Use _authorizeTransaction() to validate attestations before business logic
*
* Example:
* ```solidity
* contract MyContract is PredicateClient {
* constructor(address _registry, string memory _policy) {
* _initPredicateClient(_registry, _policy);
* }
*
* function protectedFunction(Attestation calldata _attestation) external {
* bytes memory encoded = abi.encodeWithSignature("_internal()");
* require(_authorizeTransaction(_attestation, encoded, msg.sender, msg.value));
* _internal();
* }
* }
* ```
* @custom:security-contact [email protected]
*/
abstract contract PredicateClient is IPredicateClient {
/// @notice Struct to contain stateful values for PredicateClient-type contracts
/// @custom:storage-location erc7201:predicate.storage.PredicateClient
struct PredicateClientStorage {
IPredicateRegistry registry;
string policy;
}
/// @notice the storage slot for the PredicateClientStorage struct
/// @dev keccak256(abi.encode(uint256(keccak256("predicate.storage.PredicateClient")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant _PREDICATE_CLIENT_STORAGE_SLOT =
0x804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b99300;
/// @notice Emitted when the PredicateRegistry address is updated
/// @param oldRegistry The previous PredicateRegistry contract address
/// @param newRegistry The new PredicateRegistry contract address
event PredicateRegistryUpdated(address indexed oldRegistry, address indexed newRegistry);
/// @notice Emitted when the policy ID is updated
/// @param oldPolicyID The previous policy identifier
/// @param newPolicyID The new policy identifier
event PredicatePolicyIDUpdated(string oldPolicyID, string newPolicyID);
function _getPredicateClientStorage() private pure returns (PredicateClientStorage storage $) {
assembly {
$.slot := _PREDICATE_CLIENT_STORAGE_SLOT
}
}
/**
* @notice Initializes the Predicate client with registry and policy ID
* @dev Must be called in the constructor of the inheriting contract.
* Sets both the registry address and initial policy ID.
* @param _registryAddress The address of the PredicateRegistry contract
* @param _policyID The initial policy identifier for this contract (typically "x-{hash[:16]}")
*/
function _initPredicateClient(
address _registryAddress,
string memory _policyID
) internal {
PredicateClientStorage storage $ = _getPredicateClientStorage();
$.registry = IPredicateRegistry(_registryAddress);
_setPolicyID(_policyID);
}
/**
* @notice Updates the policy ID for this contract
* @dev Updates local storage and registers with PredicateRegistry.
* Should typically be restricted to owner/admin.
* Emits PredicatePolicyIDUpdated event only when the policy actually changes.
* @param _policyID The new policy identifier to set
*/
function _setPolicyID(
string memory _policyID
) internal {
PredicateClientStorage storage $ = _getPredicateClientStorage();
string memory oldPolicyID = $.policy;
// Only update if policy has changed
if (keccak256(bytes(oldPolicyID)) != keccak256(bytes(_policyID))) {
$.policy = _policyID;
$.registry.setPolicyID(_policyID);
emit PredicatePolicyIDUpdated(oldPolicyID, _policyID);
}
}
/**
* @notice Returns the current policy ID for this contract
* @dev Returns the policy identifier stored in ERC-7201 namespaced storage
* @return policyID The policy identifier associated with this contract
*/
function getPolicyID() external view returns (string memory policyID) {
return _getPolicyID();
}
function _getPolicyID() internal view returns (string memory policyID) {
return _getPredicateClientStorage().policy;
}
/**
* @notice Updates the PredicateRegistry address
* @dev Should typically be restricted to owner/admin for security.
* Automatically re-registers the cached policy with the new registry to prevent desynchronization.
* Emits PredicateRegistryUpdated event only when the registry actually changes.
* @param _registryAddress The new PredicateRegistry contract address
* @custom:security Changing registry is sensitive - ensure proper access control
*/
function _setRegistry(
address _registryAddress
) internal {
PredicateClientStorage storage $ = _getPredicateClientStorage();
address oldRegistry = address($.registry);
// Only update if registry has changed
if (oldRegistry != _registryAddress) {
$.registry = IPredicateRegistry(_registryAddress);
// Re-register cached policy with new registry to prevent desynchronization
// This ensures off-chain attesters can query the new registry and get the correct policy
string memory cachedPolicy = $.policy;
if (bytes(cachedPolicy).length > 0) {
$.registry.setPolicyID(cachedPolicy);
}
emit PredicateRegistryUpdated(oldRegistry, _registryAddress);
}
}
/**
* @notice Returns the current PredicateRegistry contract address
* @dev Returns the registry address stored in ERC-7201 namespaced storage
* @return The address of the PredicateRegistry contract used for attestation validation
*/
function getRegistry() external view returns (address) {
return _getRegistry();
}
function _getRegistry() internal view returns (address) {
return address(_getPredicateClientStorage().registry);
}
modifier onlyPredicateRegistry() {
if (msg.sender != address(_getPredicateClientStorage().registry)) {
revert PredicateClient__Unauthorized();
}
_;
}
/**
* @notice Validates a transaction by verifying the attestation
* @dev Constructs a Statement from parameters and validates it against the attestation.
* This is the core authorization function that should be called before executing
* any protected business logic.
*
* Process:
* 1. Builds Statement struct with transaction parameters
* 2. Calls PredicateRegistry.validateAttestation()
* 3. Registry verifies signature and checks attestation validity
* 4. Returns true if valid (reverts if invalid)
*
* @param _attestation The attestation containing UUID, expiration, attester, and signature
* @param _encodedSigAndArgs The encoded function signature and arguments (use abi.encodeWithSignature)
* @param _msgSender The original transaction sender (typically msg.sender)
* @param _msgValue The ETH value sent with the transaction (typically msg.value)
* @return success Always returns true (reverts on validation failure)
*
* @custom:security Always use this before executing protected functions
* @custom:security Encode the internal function call, not the public one
*/
function _authorizeTransaction(
Attestation memory _attestation,
bytes memory _encodedSigAndArgs,
address _msgSender,
uint256 _msgValue
) internal returns (bool success) {
PredicateClientStorage storage $ = _getPredicateClientStorage();
Statement memory statement = Statement({
msgSender: _msgSender,
target: address(this),
msgValue: _msgValue,
encodedSigAndArgs: _encodedSigAndArgs,
policy: $.policy,
expiration: _attestation.expiration,
uuid: _attestation.uuid
});
return $.registry.validateAttestation(statement, _attestation);
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.4;
/**
* @notice Struct that bundles together a statement's parameters for validation
* @dev A statement represents a claim or assertion about a transaction to be executed.
* It contains all the necessary information to validate that a transaction
* is authorized by an attester according to a specific policy.
* @custom:security UUID must be unique per statement to prevent replay attacks
*/
struct Statement {
// the unique identifier for the statement
string uuid;
// the address of the sender of the statement
address msgSender;
// the address of the target contract for the statement
address target;
// the value to send with the statement
uint256 msgValue;
// the encoded signature and arguments for the statement
bytes encodedSigAndArgs;
// the policy associated with the statement
string policy;
// the timestamp by which the statement must be executed
uint256 expiration;
}
/**
* @notice Struct that bundles together an attestation's parameters for validation
* @dev An attestation is a signed approval from an authorized attester.
* The signature is created by signing the hash of the corresponding Statement.
* The hash includes chain ID for domain separation to prevent cross-chain replay.
* @custom:security signature must be generated using hashStatementWithExpiry()
*/
struct Attestation {
// the unique identifier for the attestation
string uuid;
// the timestamp by which the attestation must be executed
uint256 expiration;
// the address of the attester
address attester;
// the signature from the attestation
bytes signature;
}
/**
* @title IPredicateRegistry
* @author Predicate Labs, Inc (https://predicate.io)
* @notice Interface for the core registry managing attesters, policies, and statement validation
* @dev Defines the contract interface for PredicateRegistry implementation
*/
interface IPredicateRegistry {
/**
* @notice Sets a policy ID for the sender, defining execution rules for statements
* @dev Associates a policy identifier with msg.sender. Policy ID format:
* - Typically: "x-{hash(policy)[:16]}" (e.g., "x-a1b2c3d4e5f6g7h8")
* - Can be any string: IPFS CID, URL, or custom identifier
* - No format validation - any string accepted
* @param policyID The unique identifier for the policy
*/
function setPolicyID(
string memory policyID
) external;
/**
* @notice Retrieves the policy ID associated with a client address
* @param client The address to query
* @return policyID The policy identifier, empty string if none set
*/
function getPolicyID(
address client
) external view returns (string memory policyID);
/**
* @notice Validates an attestation to authorize a statement execution
* @dev Verifies:
* - Attestation not expired
* - Statement UUID not previously used (replay protection)
* - UUIDs match between statement and attestation
* - Expirations match
* - Signature is valid (ECDSA recovery)
* - Attester is registered
* @param _statement The statement to validate
* @param _attestation The signed attestation authorizing the statement
* @return isVerified True if valid, reverts otherwise
* @custom:security Marks UUID as spent to prevent replay attacks
*/
function validateAttestation(
Statement memory _statement,
Attestation memory _attestation
) external returns (bool isVerified);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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 Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.4;
/**
* @notice error type for unauthorized access
*/
error PredicateClient__Unauthorized();
/**
* @notice Interface for a PredicateClient-type contract to set policy, registry and validate tasks
*/
interface IPredicateClient {
/**
* @notice Sets a policy ID for the calling address
* @param _policyID The policy identifier. Typically "x-{hash(policy)[:16]}" but can be any string
* @dev This function enables clients to define execution rules or parameters for statements they submit.
* The policy ID governs how statements are validated, ensuring compliance with predefined rules.
*/
function setPolicyID(
string memory _policyID
) external;
/**
* @notice Sets the Predicate Registry for the calling address
* @param _registry address of the registry
* @dev This function enables clients to set the Predicate Registry for the calling address
* @dev Authorized only by the owner of the contract
*/
function setRegistry(
address _registry
) external;
/**
* @notice Retrieves the policy ID for the calling address
* @return policyID The policy identifier associated with the calling address
*/
function getPolicyID() external view returns (string memory policyID);
/**
* @notice Function for getting the Predicate Registry
* @return address of the registry
*/
function getRegistry() external view returns (address);
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"solmate/=lib/solmate/src/",
"openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"utils/=lib/utils/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "prague",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_registry","type":"address"},{"internalType":"string","name":"_policyID","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldPolicyID","type":"string"},{"indexed":false,"internalType":"string","name":"newPolicyID","type":"string"}],"name":"PredicatePolicyIDUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"PredicateRegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockPeriod","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"attester","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Attestation","name":"_attestation","type":"tuple"}],"name":"depositAndLock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getPolicyID","outputs":[{"internalType":"string","name":"policyID","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_policyID","type":"string"}],"name":"setPolicyID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"attester","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Attestation","name":"_attestation","type":"tuple"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"attester","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Attestation","name":"_attestation","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"attester","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Attestation","name":"_attestation","type":"tuple"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f5ffd5b50604051612b02380380612b028339818101604052810190610031919061054c565b825f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009991906105c7565b60405180910390fd5b6100b1816100ca60201b60201c565b506100c2828261018b60201b60201c565b50505061095c565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61019a6101f160201b60201c565b905082815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101ec8261021860201b60201c565b505050565b5f7f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b99300905090565b5f6102276101f160201b60201c565b90505f8160010180546102399061060d565b80601f01602080910402602001604051908101604052809291908181526020018280546102659061060d565b80156102b05780601f10610287576101008083540402835291602001916102b0565b820191905f5260205f20905b81548152906001019060200180831161029357829003601f168201915b5050505050905082805190602001208180519060200120146103a057828260010190816102dd91906107f0565b50815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f33fd2f846040518263ffffffff1660e01b81526004016103399190610907565b5f604051808303815f87803b158015610350575f5ffd5b505af1158015610362573d5f5f3e3d5ffd5b505050507f22c658286008a7684f36a2ca38b26e9292d39f14d062e215667f5f92552c69a98184604051610397929190610927565b60405180910390a15b505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103df826103b6565b9050919050565b6103ef816103d5565b81146103f9575f5ffd5b50565b5f8151905061040a816103e6565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61045e82610418565b810181811067ffffffffffffffff8211171561047d5761047c610428565b5b80604052505050565b5f61048f6103a5565b905061049b8282610455565b919050565b5f67ffffffffffffffff8211156104ba576104b9610428565b5b6104c382610418565b9050602081019050919050565b8281835e5f83830152505050565b5f6104f06104eb846104a0565b610486565b90508281526020810184848401111561050c5761050b610414565b5b6105178482856104d0565b509392505050565b5f82601f83011261053357610532610410565b5b81516105438482602086016104de565b91505092915050565b5f5f5f60608486031215610563576105626103ae565b5b5f610570868287016103fc565b9350506020610581868287016103fc565b925050604084015167ffffffffffffffff8111156105a2576105a16103b2565b5b6105ae8682870161051f565b9150509250925092565b6105c1816103d5565b82525050565b5f6020820190506105da5f8301846105b8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061062457607f821691505b602082108103610637576106366105e0565b5b50919050565b5f81519050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610668565b6106ad8683610668565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106f16106ec6106e7846106c5565b6106ce565b6106c5565b9050919050565b5f819050919050565b61070a836106d7565b61071e610716826106f8565b848454610674565b825550505050565b5f5f905090565b610735610726565b610740818484610701565b505050565b5b81811015610763576107585f8261072d565b600181019050610746565b5050565b601f8211156107a85761077981610647565b61078284610659565b81016020851015610791578190505b6107a561079d85610659565b830182610745565b50505b505050565b5f82821c905092915050565b5f6107c85f19846008026107ad565b1980831691505092915050565b5f6107e083836107b9565b9150826002028217905092915050565b6107f98261063d565b67ffffffffffffffff81111561081257610811610428565b5b61081c825461060d565b610827828285610767565b5f60209050601f831160018114610858575f8415610846578287015190505b61085085826107d5565b8655506108b7565b601f19841661086686610647565b5f5b8281101561088d57848901518255600182019150602085019450602081019050610868565b868310156108aa57848901516108a6601f8916826107b9565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b5f6108d98261063d565b6108e381856108bf565b93506108f38185602086016104d0565b6108fc81610418565b840191505092915050565b5f6020820190508181035f83015261091f81846108cf565b905092915050565b5f6040820190508181035f83015261093f81856108cf565b9050818103602083015261095381846108cf565b90509392505050565b612199806109695f395ff3fe6080604052600436106100c1575f3560e01c8063715018a61161007e578063a91ee0dc11610058578063a91ee0dc14610229578063d0e30db014610251578063ed83c89d1461025b578063f2fde38b14610283576100c1565b8063715018a6146101cd5780638da5cb5b146101e3578063a7123a0d1461020d576100c1565b80630f33fd2f146100c557806327e235e3146100ed5780632c8116ed1461012957806349e22757146101515780635ab1bd531461017b5780636392e027146101a5575b5f5ffd5b3480156100d0575f5ffd5b506100eb60048036038101906100e6919061158f565b6102ab565b005b3480156100f8575f5ffd5b50610113600480360381019061010e9190611630565b6102bf565b6040516101209190611673565b60405180910390f35b348015610134575f5ffd5b5061014f600480360381019061014a91906116d8565b6102d4565b005b34801561015c575f5ffd5b5061016561044a565b6040516101729190611792565b60405180910390f35b348015610186575f5ffd5b5061018f610459565b60405161019c91906117c1565b60405180910390f35b3480156101b0575f5ffd5b506101cb60048036038101906101c691906117da565b610467565b005b3480156101d8575f5ffd5b506101e16105de565b005b3480156101ee575f5ffd5b506101f76105f1565b60405161020491906117c1565b60405180910390f35b610227600480360381019061022291906116d8565b610618565b005b348015610234575f5ffd5b5061024f600480360381019061024a9190611630565b6107e9565b005b6102596107fd565b005b348015610266575f5ffd5b50610281600480360381019061027c91906117da565b6108a0565b005b34801561028e575f5ffd5b506102a960048036038101906102a49190611630565b610a1a565b005b6102b3610a9e565b6102bc81610b25565b50565b6001602052805f5260405f205f915090505481565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b90611890565b60405180910390fd5b5f33836040516024016103689291906118ae565b6040516020818303038152906040527fc04b310b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506103fc826103f490611a28565b82335f610cac565b61043b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043290611a84565b60405180910390fd5b6104453384610e54565b505050565b6060610454610f54565b905090565b5f610462610fed565b905090565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156104e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104de90611890565b60405180910390fd5b5f83836040516024016104fb9291906118ae565b6040516020818303038152906040527fc04b310b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061058f8261058790611a28565b82335f610cac565b6105ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c590611a84565b60405180910390fd5b6105d88484610e54565b50505050565b6105e6610a9e565b6105ef5f61101d565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f341161065a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065190611aec565b60405180910390fd5b5f33348460405160240161067093929190611b0a565b6040516020818303038152906040527f3aa279b8000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610704826106fc90611a28565b823334610cac565b610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90611a84565b60405180910390fd5b3460015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461078f9190611b6c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516107dc9190611673565b60405180910390a2505050565b6107f1610a9e565b6107fa816110de565b50565b3460015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108499190611b6c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516108969190611673565b60405180910390a2565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790611890565b60405180910390fd5b5f33848460405160240161093693929190611b9f565b6040516020818303038152906040527f33a738c9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506109ca826109c290611a28565b82335f610cac565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090611a84565b60405180910390fd5b610a14338585611304565b50505050565b610a22610a9e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a92575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a8991906117c1565b60405180910390fd5b610a9b8161101d565b50565b610aa6611414565b73ffffffffffffffffffffffffffffffffffffffff16610ac46105f1565b73ffffffffffffffffffffffffffffffffffffffff1614610b2357610ae7611414565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610b1a91906117c1565b60405180910390fd5b565b5f610b2e61141b565b90505f816001018054610b4090611c01565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c90611c01565b8015610bb75780601f10610b8e57610100808354040283529160200191610bb7565b820191905f5260205f20905b815481529060010190602001808311610b9a57829003601f168201915b505050505090508280519060200120818051906020012014610ca75782826001019081610be49190611dd1565b50815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f33fd2f846040518263ffffffff1660e01b8152600401610c409190611792565b5f604051808303815f87803b158015610c57575f5ffd5b505af1158015610c69573d5f5f3e3d5ffd5b505050507f22c658286008a7684f36a2ca38b26e9292d39f14d062e215667f5f92552c69a98184604051610c9e929190611ea0565b60405180910390a15b505050565b5f5f610cb661141b565b90505f6040518060e00160405280885f015181526020018673ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001858152602001878152602001836001018054610d2090611c01565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4c90611c01565b8015610d975780601f10610d6e57610100808354040283529160200191610d97565b820191905f5260205f20905b815481529060010190602001808311610d7a57829003601f168201915b5050505050815260200188602001518152509050815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663244ddbb382896040518363ffffffff1660e01b8152600401610e0892919061209b565b6020604051808303815f875af1158015610e24573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e489190612105565b92505050949350505050565b8060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610ea09190612130565b925050819055508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610eea573d5f5f3e3d5ffd5b508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b639883604051610f489190611673565b60405180910390a35050565b6060610f5e61141b565b6001018054610f6c90611c01565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9890611c01565b8015610fe35780601f10610fba57610100808354040283529160200191610fe3565b820191905f5260205f20905b815481529060010190602001808311610fc657829003601f168201915b5050505050905090565b5f610ff661141b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6110e761141b565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ff5782825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f82600101805461119390611c01565b80601f01602080910402602001604051908101604052809291908181526020018280546111bf90611c01565b801561120a5780601f106111e15761010080835404028352916020019161120a565b820191905f5260205f20905b8154815290600101906020018083116111ed57829003601f168201915b505050505090505f815111156112a357825f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f33fd2f826040518263ffffffff1660e01b81526004016112759190611792565b5f604051808303815f87803b15801561128c575f5ffd5b505af115801561129e573d5f5f3e3d5ffd5b505050505b8373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5a9113e22196a56f3ce3c77271fa4f29435f72c4cca0128acdc79e45112a1c1060405160405180910390a3505b505050565b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113509190612130565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113a39190611b6c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114079190611673565b60405180910390a3505050565b5f33905090565b5f7f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b99300905090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6114a18261145b565b810181811067ffffffffffffffff821117156114c0576114bf61146b565b5b80604052505050565b5f6114d2611442565b90506114de8282611498565b919050565b5f67ffffffffffffffff8211156114fd576114fc61146b565b5b6115068261145b565b9050602081019050919050565b828183375f83830152505050565b5f61153361152e846114e3565b6114c9565b90508281526020810184848401111561154f5761154e611457565b5b61155a848285611513565b509392505050565b5f82601f83011261157657611575611453565b5b8135611586848260208601611521565b91505092915050565b5f602082840312156115a4576115a361144b565b5b5f82013567ffffffffffffffff8111156115c1576115c061144f565b5b6115cd84828501611562565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115ff826115d6565b9050919050565b61160f816115f5565b8114611619575f5ffd5b50565b5f8135905061162a81611606565b92915050565b5f602082840312156116455761164461144b565b5b5f6116528482850161161c565b91505092915050565b5f819050919050565b61166d8161165b565b82525050565b5f6020820190506116865f830184611664565b92915050565b6116958161165b565b811461169f575f5ffd5b50565b5f813590506116b08161168c565b92915050565b5f5ffd5b5f608082840312156116cf576116ce6116b6565b5b81905092915050565b5f5f604083850312156116ee576116ed61144b565b5b5f6116fb858286016116a2565b925050602083013567ffffffffffffffff81111561171c5761171b61144f565b5b611728858286016116ba565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61176482611732565b61176e818561173c565b935061177e81856020860161174c565b6117878161145b565b840191505092915050565b5f6020820190508181035f8301526117aa818461175a565b905092915050565b6117bb816115f5565b82525050565b5f6020820190506117d45f8301846117b2565b92915050565b5f5f5f606084860312156117f1576117f061144b565b5b5f6117fe8682870161161c565b935050602061180f868287016116a2565b925050604084013567ffffffffffffffff8111156118305761182f61144f565b5b61183c868287016116ba565b9150509250925092565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f61187a60148361173c565b915061188582611846565b602082019050919050565b5f6020820190508181035f8301526118a78161186e565b9050919050565b5f6040820190506118c15f8301856117b2565b6118ce6020830184611664565b9392505050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156118f7576118f661146b565b5b6119008261145b565b9050602081019050919050565b5f61191f61191a846118dd565b6114c9565b90508281526020810184848401111561193b5761193a611457565b5b611946848285611513565b509392505050565b5f82601f83011261196257611961611453565b5b813561197284826020860161190d565b91505092915050565b5f608082840312156119905761198f6118d5565b5b61199a60806114c9565b90505f82013567ffffffffffffffff8111156119b9576119b86118d9565b5b6119c584828501611562565b5f8301525060206119d8848285016116a2565b60208301525060406119ec8482850161161c565b604083015250606082013567ffffffffffffffff811115611a1057611a0f6118d9565b5b611a1c8482850161194e565b60608301525092915050565b5f611a33368361197b565b9050919050565b7f556e617574686f72697a656400000000000000000000000000000000000000005f82015250565b5f611a6e600c8361173c565b9150611a7982611a3a565b602082019050919050565b5f6020820190508181035f830152611a9b81611a62565b9050919050565b7f4d7573742073656e6420455448000000000000000000000000000000000000005f82015250565b5f611ad6600d8361173c565b9150611ae182611aa2565b602082019050919050565b5f6020820190508181035f830152611b0381611aca565b9050919050565b5f606082019050611b1d5f8301866117b2565b611b2a6020830185611664565b611b376040830184611664565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611b768261165b565b9150611b818361165b565b9250828201905080821115611b9957611b98611b3f565b5b92915050565b5f606082019050611bb25f8301866117b2565b611bbf60208301856117b2565b611bcc6040830184611664565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611c1857607f821691505b602082108103611c2b57611c2a611bd4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611c8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611c52565b611c978683611c52565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611cd2611ccd611cc88461165b565b611caf565b61165b565b9050919050565b5f819050919050565b611ceb83611cb8565b611cff611cf782611cd9565b848454611c5e565b825550505050565b5f5f905090565b611d16611d07565b611d21818484611ce2565b505050565b5b81811015611d4457611d395f82611d0e565b600181019050611d27565b5050565b601f821115611d8957611d5a81611c31565b611d6384611c43565b81016020851015611d72578190505b611d86611d7e85611c43565b830182611d26565b50505b505050565b5f82821c905092915050565b5f611da95f1984600802611d8e565b1980831691505092915050565b5f611dc18383611d9a565b9150826002028217905092915050565b611dda82611732565b67ffffffffffffffff811115611df357611df261146b565b5b611dfd8254611c01565b611e08828285611d48565b5f60209050601f831160018114611e39575f8415611e27578287015190505b611e318582611db6565b865550611e98565b601f198416611e4786611c31565b5f5b82811015611e6e57848901518255600182019150602085019450602081019050611e49565b86831015611e8b5784890151611e87601f891682611d9a565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f830152611eb8818561175a565b90508181036020830152611ecc818461175a565b90509392505050565b5f82825260208201905092915050565b5f611eef82611732565b611ef98185611ed5565b9350611f0981856020860161174c565b611f128161145b565b840191505092915050565b611f26816115f5565b82525050565b611f358161165b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f611f5f82611f3b565b611f698185611f45565b9350611f7981856020860161174c565b611f828161145b565b840191505092915050565b5f60e083015f8301518482035f860152611fa78282611ee5565b9150506020830151611fbc6020860182611f1d565b506040830151611fcf6040860182611f1d565b506060830151611fe26060860182611f2c565b5060808301518482036080860152611ffa8282611f55565b91505060a083015184820360a08601526120148282611ee5565b91505060c083015161202960c0860182611f2c565b508091505092915050565b5f608083015f8301518482035f86015261204e8282611ee5565b91505060208301516120636020860182611f2c565b5060408301516120766040860182611f1d565b506060830151848203606086015261208e8282611f55565b9150508091505092915050565b5f6040820190508181035f8301526120b38185611f8d565b905081810360208301526120c78184612034565b90509392505050565b5f8115159050919050565b6120e4816120d0565b81146120ee575f5ffd5b50565b5f815190506120ff816120db565b92915050565b5f6020828403121561211a5761211961144b565b5b5f612127848285016120f1565b91505092915050565b5f61213a8261165b565b91506121458361165b565b925082820390508181111561215d5761215c611b3f565b5b9291505056fea26469706673582212202828376ce665abbd6924bd5a714828ad89d6b8fb810a2a217dd9ac7b51fd738c64736f6c634300081c0033000000000000000000000000380ad2e410688e0153125d01a6af9c4c27f7f0ec000000000000000000000000e15a8ca5bd8464283818088c1760d8f23b6a216e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000031782d6d616e616765642d706f6c6963792d3531643435303239653862646531616262666431343063303331643434336336000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100c1575f3560e01c8063715018a61161007e578063a91ee0dc11610058578063a91ee0dc14610229578063d0e30db014610251578063ed83c89d1461025b578063f2fde38b14610283576100c1565b8063715018a6146101cd5780638da5cb5b146101e3578063a7123a0d1461020d576100c1565b80630f33fd2f146100c557806327e235e3146100ed5780632c8116ed1461012957806349e22757146101515780635ab1bd531461017b5780636392e027146101a5575b5f5ffd5b3480156100d0575f5ffd5b506100eb60048036038101906100e6919061158f565b6102ab565b005b3480156100f8575f5ffd5b50610113600480360381019061010e9190611630565b6102bf565b6040516101209190611673565b60405180910390f35b348015610134575f5ffd5b5061014f600480360381019061014a91906116d8565b6102d4565b005b34801561015c575f5ffd5b5061016561044a565b6040516101729190611792565b60405180910390f35b348015610186575f5ffd5b5061018f610459565b60405161019c91906117c1565b60405180910390f35b3480156101b0575f5ffd5b506101cb60048036038101906101c691906117da565b610467565b005b3480156101d8575f5ffd5b506101e16105de565b005b3480156101ee575f5ffd5b506101f76105f1565b60405161020491906117c1565b60405180910390f35b610227600480360381019061022291906116d8565b610618565b005b348015610234575f5ffd5b5061024f600480360381019061024a9190611630565b6107e9565b005b6102596107fd565b005b348015610266575f5ffd5b50610281600480360381019061027c91906117da565b6108a0565b005b34801561028e575f5ffd5b506102a960048036038101906102a49190611630565b610a1a565b005b6102b3610a9e565b6102bc81610b25565b50565b6001602052805f5260405f205f915090505481565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b90611890565b60405180910390fd5b5f33836040516024016103689291906118ae565b6040516020818303038152906040527fc04b310b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506103fc826103f490611a28565b82335f610cac565b61043b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043290611a84565b60405180910390fd5b6104453384610e54565b505050565b6060610454610f54565b905090565b5f610462610fed565b905090565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156104e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104de90611890565b60405180910390fd5b5f83836040516024016104fb9291906118ae565b6040516020818303038152906040527fc04b310b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061058f8261058790611a28565b82335f610cac565b6105ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c590611a84565b60405180910390fd5b6105d88484610e54565b50505050565b6105e6610a9e565b6105ef5f61101d565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f341161065a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065190611aec565b60405180910390fd5b5f33348460405160240161067093929190611b0a565b6040516020818303038152906040527f3aa279b8000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610704826106fc90611a28565b823334610cac565b610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90611a84565b60405180910390fd5b3460015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461078f9190611b6c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516107dc9190611673565b60405180910390a2505050565b6107f1610a9e565b6107fa816110de565b50565b3460015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108499190611b6c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516108969190611673565b60405180910390a2565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790611890565b60405180910390fd5b5f33848460405160240161093693929190611b9f565b6040516020818303038152906040527f33a738c9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506109ca826109c290611a28565b82335f610cac565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090611a84565b60405180910390fd5b610a14338585611304565b50505050565b610a22610a9e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a92575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a8991906117c1565b60405180910390fd5b610a9b8161101d565b50565b610aa6611414565b73ffffffffffffffffffffffffffffffffffffffff16610ac46105f1565b73ffffffffffffffffffffffffffffffffffffffff1614610b2357610ae7611414565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610b1a91906117c1565b60405180910390fd5b565b5f610b2e61141b565b90505f816001018054610b4090611c01565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c90611c01565b8015610bb75780601f10610b8e57610100808354040283529160200191610bb7565b820191905f5260205f20905b815481529060010190602001808311610b9a57829003601f168201915b505050505090508280519060200120818051906020012014610ca75782826001019081610be49190611dd1565b50815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f33fd2f846040518263ffffffff1660e01b8152600401610c409190611792565b5f604051808303815f87803b158015610c57575f5ffd5b505af1158015610c69573d5f5f3e3d5ffd5b505050507f22c658286008a7684f36a2ca38b26e9292d39f14d062e215667f5f92552c69a98184604051610c9e929190611ea0565b60405180910390a15b505050565b5f5f610cb661141b565b90505f6040518060e00160405280885f015181526020018673ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001858152602001878152602001836001018054610d2090611c01565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4c90611c01565b8015610d975780601f10610d6e57610100808354040283529160200191610d97565b820191905f5260205f20905b815481529060010190602001808311610d7a57829003601f168201915b5050505050815260200188602001518152509050815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663244ddbb382896040518363ffffffff1660e01b8152600401610e0892919061209b565b6020604051808303815f875af1158015610e24573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e489190612105565b92505050949350505050565b8060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610ea09190612130565b925050819055508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610eea573d5f5f3e3d5ffd5b508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b639883604051610f489190611673565b60405180910390a35050565b6060610f5e61141b565b6001018054610f6c90611c01565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9890611c01565b8015610fe35780601f10610fba57610100808354040283529160200191610fe3565b820191905f5260205f20905b815481529060010190602001808311610fc657829003601f168201915b5050505050905090565b5f610ff661141b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6110e761141b565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ff5782825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f82600101805461119390611c01565b80601f01602080910402602001604051908101604052809291908181526020018280546111bf90611c01565b801561120a5780601f106111e15761010080835404028352916020019161120a565b820191905f5260205f20905b8154815290600101906020018083116111ed57829003601f168201915b505050505090505f815111156112a357825f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f33fd2f826040518263ffffffff1660e01b81526004016112759190611792565b5f604051808303815f87803b15801561128c575f5ffd5b505af115801561129e573d5f5f3e3d5ffd5b505050505b8373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5a9113e22196a56f3ce3c77271fa4f29435f72c4cca0128acdc79e45112a1c1060405160405180910390a3505b505050565b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113509190612130565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113a39190611b6c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114079190611673565b60405180910390a3505050565b5f33905090565b5f7f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b99300905090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6114a18261145b565b810181811067ffffffffffffffff821117156114c0576114bf61146b565b5b80604052505050565b5f6114d2611442565b90506114de8282611498565b919050565b5f67ffffffffffffffff8211156114fd576114fc61146b565b5b6115068261145b565b9050602081019050919050565b828183375f83830152505050565b5f61153361152e846114e3565b6114c9565b90508281526020810184848401111561154f5761154e611457565b5b61155a848285611513565b509392505050565b5f82601f83011261157657611575611453565b5b8135611586848260208601611521565b91505092915050565b5f602082840312156115a4576115a361144b565b5b5f82013567ffffffffffffffff8111156115c1576115c061144f565b5b6115cd84828501611562565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115ff826115d6565b9050919050565b61160f816115f5565b8114611619575f5ffd5b50565b5f8135905061162a81611606565b92915050565b5f602082840312156116455761164461144b565b5b5f6116528482850161161c565b91505092915050565b5f819050919050565b61166d8161165b565b82525050565b5f6020820190506116865f830184611664565b92915050565b6116958161165b565b811461169f575f5ffd5b50565b5f813590506116b08161168c565b92915050565b5f5ffd5b5f608082840312156116cf576116ce6116b6565b5b81905092915050565b5f5f604083850312156116ee576116ed61144b565b5b5f6116fb858286016116a2565b925050602083013567ffffffffffffffff81111561171c5761171b61144f565b5b611728858286016116ba565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61176482611732565b61176e818561173c565b935061177e81856020860161174c565b6117878161145b565b840191505092915050565b5f6020820190508181035f8301526117aa818461175a565b905092915050565b6117bb816115f5565b82525050565b5f6020820190506117d45f8301846117b2565b92915050565b5f5f5f606084860312156117f1576117f061144b565b5b5f6117fe8682870161161c565b935050602061180f868287016116a2565b925050604084013567ffffffffffffffff8111156118305761182f61144f565b5b61183c868287016116ba565b9150509250925092565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f61187a60148361173c565b915061188582611846565b602082019050919050565b5f6020820190508181035f8301526118a78161186e565b9050919050565b5f6040820190506118c15f8301856117b2565b6118ce6020830184611664565b9392505050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156118f7576118f661146b565b5b6119008261145b565b9050602081019050919050565b5f61191f61191a846118dd565b6114c9565b90508281526020810184848401111561193b5761193a611457565b5b611946848285611513565b509392505050565b5f82601f83011261196257611961611453565b5b813561197284826020860161190d565b91505092915050565b5f608082840312156119905761198f6118d5565b5b61199a60806114c9565b90505f82013567ffffffffffffffff8111156119b9576119b86118d9565b5b6119c584828501611562565b5f8301525060206119d8848285016116a2565b60208301525060406119ec8482850161161c565b604083015250606082013567ffffffffffffffff811115611a1057611a0f6118d9565b5b611a1c8482850161194e565b60608301525092915050565b5f611a33368361197b565b9050919050565b7f556e617574686f72697a656400000000000000000000000000000000000000005f82015250565b5f611a6e600c8361173c565b9150611a7982611a3a565b602082019050919050565b5f6020820190508181035f830152611a9b81611a62565b9050919050565b7f4d7573742073656e6420455448000000000000000000000000000000000000005f82015250565b5f611ad6600d8361173c565b9150611ae182611aa2565b602082019050919050565b5f6020820190508181035f830152611b0381611aca565b9050919050565b5f606082019050611b1d5f8301866117b2565b611b2a6020830185611664565b611b376040830184611664565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611b768261165b565b9150611b818361165b565b9250828201905080821115611b9957611b98611b3f565b5b92915050565b5f606082019050611bb25f8301866117b2565b611bbf60208301856117b2565b611bcc6040830184611664565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611c1857607f821691505b602082108103611c2b57611c2a611bd4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611c8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611c52565b611c978683611c52565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611cd2611ccd611cc88461165b565b611caf565b61165b565b9050919050565b5f819050919050565b611ceb83611cb8565b611cff611cf782611cd9565b848454611c5e565b825550505050565b5f5f905090565b611d16611d07565b611d21818484611ce2565b505050565b5b81811015611d4457611d395f82611d0e565b600181019050611d27565b5050565b601f821115611d8957611d5a81611c31565b611d6384611c43565b81016020851015611d72578190505b611d86611d7e85611c43565b830182611d26565b50505b505050565b5f82821c905092915050565b5f611da95f1984600802611d8e565b1980831691505092915050565b5f611dc18383611d9a565b9150826002028217905092915050565b611dda82611732565b67ffffffffffffffff811115611df357611df261146b565b5b611dfd8254611c01565b611e08828285611d48565b5f60209050601f831160018114611e39575f8415611e27578287015190505b611e318582611db6565b865550611e98565b601f198416611e4786611c31565b5f5b82811015611e6e57848901518255600182019150602085019450602081019050611e49565b86831015611e8b5784890151611e87601f891682611d9a565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f830152611eb8818561175a565b90508181036020830152611ecc818461175a565b90509392505050565b5f82825260208201905092915050565b5f611eef82611732565b611ef98185611ed5565b9350611f0981856020860161174c565b611f128161145b565b840191505092915050565b611f26816115f5565b82525050565b611f358161165b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f611f5f82611f3b565b611f698185611f45565b9350611f7981856020860161174c565b611f828161145b565b840191505092915050565b5f60e083015f8301518482035f860152611fa78282611ee5565b9150506020830151611fbc6020860182611f1d565b506040830151611fcf6040860182611f1d565b506060830151611fe26060860182611f2c565b5060808301518482036080860152611ffa8282611f55565b91505060a083015184820360a08601526120148282611ee5565b91505060c083015161202960c0860182611f2c565b508091505092915050565b5f608083015f8301518482035f86015261204e8282611ee5565b91505060208301516120636020860182611f2c565b5060408301516120766040860182611f1d565b506060830151848203606086015261208e8282611f55565b9150508091505092915050565b5f6040820190508181035f8301526120b38185611f8d565b905081810360208301526120c78184612034565b90509392505050565b5f8115159050919050565b6120e4816120d0565b81146120ee575f5ffd5b50565b5f815190506120ff816120db565b92915050565b5f6020828403121561211a5761211961144b565b5b5f612127848285016120f1565b91505092915050565b5f61213a8261165b565b91506121458361165b565b925082820390508181111561215d5761215c611b3f565b5b9291505056fea26469706673582212202828376ce665abbd6924bd5a714828ad89d6b8fb810a2a217dd9ac7b51fd738c64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000380ad2e410688e0153125d01a6af9c4c27f7f0ec000000000000000000000000e15a8ca5bd8464283818088c1760d8f23b6a216e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000031782d6d616e616765642d706f6c6963792d3531643435303239653862646531616262666431343063303331643434336336000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0x380ad2e410688e0153125d01a6af9c4C27F7F0eC
Arg [1] : _registry (address): 0xe15a8Ca5BD8464283818088c1760d8f23B6a216E
Arg [2] : _policyID (string): x-managed-policy-51d45029e8bde1abbfd140c031d443c6
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000380ad2e410688e0153125d01a6af9c4c27f7f0ec
Arg [1] : 000000000000000000000000e15a8ca5bd8464283818088c1760d8f23b6a216e
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000031
Arg [4] : 782d6d616e616765642d706f6c6963792d353164343530323965386264653161
Arg [5] : 6262666431343063303331643434336336000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1.96
Net Worth in ETH
0.001
Token Allocations
ETH
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,959.18 | 0.001 | $1.96 |
Loading...
Loading
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.