Holesky Testnet

Contract

0x6025B4b71Eb3d463C255CB15ce5cD62cB8643fDD

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Send Coin33415042025-02-13 2:38:246 mins ago1739414304IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33413672025-02-13 2:08:2436 mins ago1739412504IN
0x6025B4b7...cB8643fDD
0 ETH0.000005020.05
Send Coin33412342025-02-13 1:39:121 hr ago1739410752IN
0x6025B4b7...cB8643fDD
0 ETH0.000005020.05
Send Coin33410952025-02-13 1:08:481 hr ago1739408928IN
0x6025B4b7...cB8643fDD
0 ETH0.000005020.05
Send Coin33409582025-02-13 0:38:242 hrs ago1739407104IN
0x6025B4b7...cB8643fDD
0 ETH0.000005020.05000001
Send Coin33408182025-02-13 0:08:242 hrs ago1739405304IN
0x6025B4b7...cB8643fDD
0 ETH0.000005020.05
Send Coin33406762025-02-12 23:38:243 hrs ago1739403504IN
0x6025B4b7...cB8643fDD
0 ETH0.000005020.05000001
Send Coin33405392025-02-12 23:08:243 hrs ago1739401704IN
0x6025B4b7...cB8643fDD
0 ETH0.000000120.00125001
Send Coin33404012025-02-12 22:39:124 hrs ago1739399952IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33402602025-02-12 22:08:244 hrs ago1739398104IN
0x6025B4b7...cB8643fDD
0 ETH0.000030120.30000001
Send Coin33401162025-02-12 21:38:245 hrs ago1739396304IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33399822025-02-12 21:08:245 hrs ago1739394504IN
0x6025B4b7...cB8643fDD
0 ETH0.000000140.00144376
Send Coin33398392025-02-12 20:38:246 hrs ago1739392704IN
0x6025B4b7...cB8643fDD
0 ETH0.000000140.00144375
Send Coin33397012025-02-12 20:08:246 hrs ago1739390904IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00105001
Send Coin33395662025-02-12 19:38:367 hrs ago1739389116IN
0x6025B4b7...cB8643fDD
0 ETH0.000005270.0525
Send Coin33394222025-02-12 19:08:247 hrs ago1739387304IN
0x6025B4b7...cB8643fDD
0 ETH0.000100421.00000001
Send Coin33392842025-02-12 18:38:248 hrs ago1739385504IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33391402025-02-12 18:08:368 hrs ago1739383716IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33390062025-02-12 17:38:489 hrs ago1739381928IN
0x6025B4b7...cB8643fDD
0 ETH0.000000110.00110001
Send Coin33388642025-02-12 17:08:249 hrs ago1739380104IN
0x6025B4b7...cB8643fDD
0 ETH0.000000110.00110001
Send Coin33387222025-02-12 16:38:4810 hrs ago1739378328IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33385782025-02-12 16:08:2410 hrs ago1739376504IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100002
Send Coin33384392025-02-12 15:38:2411 hrs ago1739374704IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33383052025-02-12 15:08:3611 hrs ago1739372916IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100001
Send Coin33381702025-02-12 14:38:4812 hrs ago1739371128IN
0x6025B4b7...cB8643fDD
0 ETH0.00000010.00100002
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MetaCoin

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 6 : MetaCoin.sol
// SPDX-License-Identifier: MIT
// Tells the Solidity compiler to compile only from v0.8.13 to v0.9.0
pragma solidity ^0.8.12;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

import {PredicateClient} from "../../mixins/PredicateClient.sol";
import {PredicateMessage} from "../../interfaces/IPredicateClient.sol";
import {IPredicateManager} from "../../interfaces/IPredicateManager.sol";

contract MetaCoin is PredicateClient, Ownable {
    mapping(address => uint256) public balances;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    constructor(address _owner, address _serviceManager, string memory _policyID) Ownable(_owner) {
        balances[_owner] = 10_000_000_000_000;
        _initPredicateClient(_serviceManager, _policyID);
    }

    function sendCoin(address _receiver, uint256 _amount, PredicateMessage calldata _message) external payable {
        bytes memory encodedSigAndArgs = abi.encodeWithSignature("_sendCoin(address,uint256)", _receiver, _amount);
        require(
            _authorizeTransaction(_message, encodedSigAndArgs, msg.sender, msg.value),
            "MetaCoin: unauthorized transaction"
        );

        // business logic function that is protected
        _sendCoin(_receiver, _amount);
    }

    function setPolicy(
        string memory _policyID
    ) external onlyOwner {
        _setPolicy(_policyID);
    }

    function setPredicateManager(
        address _predicateManager
    ) public onlyOwner {
        _setPredicateManager(_predicateManager);
    }

    function _sendCoin(address _receiver, uint256 _amount) internal {
        require(balances[msg.sender] >= _amount, "MetaCoin: insufficient balance");
        balances[msg.sender] -= _amount;
        balances[_receiver] += _amount;
        emit Transfer(msg.sender, _receiver, _amount);
    }

    function getBalance(
        address _addr
    ) public view returns (uint256) {
        return balances[_addr];
    }
}

File 2 of 6 : Ownable.sol
// 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);
    }
}

File 3 of 6 : PredicateClient.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.12;

import {IPredicateManager, Task} from "../interfaces/IPredicateManager.sol";
import "../interfaces/IPredicateClient.sol";

abstract contract PredicateClient is IPredicateClient {
    /// @notice Struct to contain stateful values for PredicateClient-type contracts
    /// @custom:storage-location erc7201:predicate.storage.PredicateClient
    struct PredicateClientStorage {
        IPredicateManager serviceManager;
        string policyID;
    }

    /// @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;

    function _getPredicateClientStorage() private pure returns (PredicateClientStorage storage $) {
        assembly {
            $.slot := _PREDICATE_CLIENT_STORAGE_SLOT
        }
    }

    function _initPredicateClient(address _serviceManagerAddress, string memory _policyID) internal {
        PredicateClientStorage storage $ = _getPredicateClientStorage();
        $.serviceManager = IPredicateManager(_serviceManagerAddress);
        $.policyID = _policyID;
    }

    function _setPolicy(
        string memory _policyID
    ) internal {
        PredicateClientStorage storage $ = _getPredicateClientStorage();
        $.policyID = _policyID;
    }

    function getPolicy() external view override returns (string memory) {
        return _getPolicy();
    }

    function _getPolicy() internal view returns (string memory) {
        return _getPredicateClientStorage().policyID;
    }

    function _setPredicateManager(
        address _predicateManager
    ) internal {
        PredicateClientStorage storage $ = _getPredicateClientStorage();
        $.serviceManager = IPredicateManager(_predicateManager);
    }

    function getPredicateManager() external view override returns (address) {
        return _getPredicateManager();
    }

    function _getPredicateManager() internal view returns (address) {
        return address(_getPredicateClientStorage().serviceManager);
    }

    modifier onlyPredicateServiceManager() {
        if (msg.sender != address(_getPredicateClientStorage().serviceManager)) {
            revert PredicateClient__Unauthorized();
        }
        _;
    }

    /**
     *
     * @notice Validates the transaction by checking the signatures of the operators.
     */
    function _authorizeTransaction(
        PredicateMessage memory _predicateMessage,
        bytes memory _encodedSigAndArgs,
        address _msgSender,
        uint256 _value
    ) internal returns (bool) {
        PredicateClientStorage storage $ = _getPredicateClientStorage();
        Task memory task = Task({
            msgSender: _msgSender,
            target: address(this),
            value: _value,
            encodedSigAndArgs: _encodedSigAndArgs,
            policyID: $.policyID,
            quorumThresholdCount: uint32(_predicateMessage.signerAddresses.length),
            taskId: _predicateMessage.taskId,
            expireByBlockNumber: _predicateMessage.expireByBlockNumber
        });
        return
            $.serviceManager.validateSignatures(task, _predicateMessage.signerAddresses, _predicateMessage.signatures);
    }
}

File 4 of 6 : IPredicateClient.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.12;

import {IPredicateManager} from "../interfaces/IPredicateManager.sol";

/// @notice Struct that bundles together a task's parameters for validation
struct PredicateMessage {
    // the unique identifier for the task
    string taskId;
    // the expiration block number for the task
    uint256 expireByBlockNumber;
    // the operators that have signed the task
    address[] signerAddresses;
    // the signatures of the operators that have signed the task
    bytes[] signatures;
}

/// @notice error type for unauthorized access
error PredicateClient__Unauthorized();

/// @notice Interface for a PredicateClient-type contract that enables clients to define execution rules or parameters for tasks they submit
interface IPredicateClient {
    /**
     * @notice Sets a policy for the calling address, associating it with a policy document stored on IPFS.
     * @param _policyID A string representing the policyID from on chain.
     * @dev This function enables clients to define execution rules or parameters for tasks they submit.
     *      The policy governs how tasks submitted by the caller are executed, ensuring compliance with predefined rules.
     */
    function setPolicy(
        string memory _policyID
    ) external;

    /**
     * @notice Retrieves the policy for the calling address.
     * @return The policyID associated with the calling address.
     */
    function getPolicy() external view returns (string memory);

    /**
     * @notice Function for setting the Predicate ServiceManager
     * @param _predicateManager address of the service manager
     */
    function setPredicateManager(
        address _predicateManager
    ) external;

    /**
     * @notice Function for getting the Predicate ServiceManager
     * @return address of the service manager
     */
    function getPredicateManager() external view returns (address);
}

File 5 of 6 : IPredicateManager.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.12;

/// @notice Struct that bundles together a task's parameters for validation
struct Task {
    // the unique identifier for the task
    string taskId;
    // the address of the sender of the task
    address msgSender;
    // the address of the target contract for the task
    address target;
    // the value to send with the task
    uint256 value;
    // the encoded signature and arguments for the task
    bytes encodedSigAndArgs;
    // the policy ID associated with the task
    string policyID;
    // the number of signatures required to authorize the task
    uint32 quorumThresholdCount;
    // the block number by which the task must be executed
    uint256 expireByBlockNumber;
}

/// @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature. Used primarily for stack management.
struct SignatureWithSaltAndExpiry {
    // the signature itself, formatted as a single bytes object
    bytes signature;
    // the salt used to generate the signature
    bytes32 salt;
    // the expiration timestamp (UTC) of the signature
    uint256 expiry;
}

/**
 * @title Minimal interface for a ServiceManager-type contract that forms the single point for an AVS to push updates to EigenLayer
 * @author Predicate Labs, Inc
 */
interface IPredicateManager {
    /**
     * @notice Sets the metadata URI for the AVS
     * @param _metadataURI is the metadata URI for the AVS
     */
    function setMetadataURI(
        string memory _metadataURI
    ) external;

    /**
     * @notice Forwards a call to EigenLayer's DelegationManager contract to confirm operator registration with the AVS
     * @param operatorSigningKey The address of the operator's signing key.
     * @param operatorSignature The signature, salt, and expiry of the operator's signature.
     */
    function registerOperatorToAVS(
        address operatorSigningKey,
        SignatureWithSaltAndExpiry memory operatorSignature
    ) external;

    /**
     * @notice Forwards a call to EigenLayer's DelegationManager contract to confirm operator deregistration from the AVS
     * @param operator The address of the operator to deregister.
     */
    function deregisterOperatorFromAVS(
        address operator
    ) external;

    /**
     * @notice Returns the list of strategies that the operator has potentially restaked on the AVS
     * @param operator The address of the operator to get restaked strategies for
     * @dev This function is intended to be called off-chain
     * @dev No guarantee is made on whether the operator has shares for a strategy in a quorum or uniqueness
     *      of each element in the returned array. The off-chain service should do that validation separately
     */
    function getOperatorRestakedStrategies(
        address operator
    ) external view returns (address[] memory);

    /**
     * @notice Returns the list of strategies that the AVS supports for restaking
     * @dev This function is intended to be called off-chain
     * @dev No guarantee is made on uniqueness of each element in the returned array.
     *      The off-chain service should do that validation separately
     */
    function getRestakeableStrategies() external view returns (address[] memory);

    /**
     * @notice Sets a policy ID for the sender, defining execution rules or parameters for tasks
     * @param policyID string pointing to the policy details
     * @dev Only callable by client contracts or EOAs to associate a policy with their address
     * @dev Emits a SetPolicy event upon successful association
     */
    function setPolicy(
        string memory policyID
    ) external;

    /**
     * @notice Removes a policy ID for the sender, removing execution rules or parameters for tasks
     * @param policyID string pointing to the policy details
     * @dev Only callable by client contracts or EOAs to disassociate a policy with their address
     * @dev Emits a RemovedPolicy event upon successful association
     */
    function removePolicy(
        string memory policyID
    ) external;

    /**
     * @notice Deploys a policy with ID with execution rules or parameters for tasks
     * @param _policyID string pointing to the policy details
     * @param _policy string containing the policy details
     * @param _quorumThreshold The number of signatures required to authorize a task
     * @dev Only callable by service manager deployer
     * @dev Emits a DeployedPolicy event upon successful deployment
     */
    function deployPolicy(string memory _policyID, string memory _policy, uint256 _quorumThreshold) external;

    /**
     * @notice Gets array of deployed policies
     */
    function getDeployedPolicies() external view returns (string[] memory);

    /**
     * @notice Deploys a social graph which clients can use in policy
     * @param _socialGraphID is a unique identifier
     * @param _socialGraphConfig is the config for the social graph
     * @dev Only callable by service manager deployer
     * @dev Emits a SocialGraphDeployed event upon successful deployment
     */
    function deploySocialGraph(string memory _socialGraphID, string memory _socialGraphConfig) external;

    /**
     * @notice Returns the list of social graph IDs that the AVS supports
     */
    function getSocialGraphIDs() external view returns (string[] memory);

    /**
     * @notice Verifies if a task is authorized by the required number of operators
     * @param _task Parameters of the task including sender, target, function signature, arguments, quorum count, and expiry block
     * @param signerAddresses Array of addresses of the operators who signed the task
     * @param signatures Array of signatures from the operators authorizing the task
     * @return isVerified Boolean indicating if the task has been verified by the required number of operators
     * @dev This function checks the signatures against the hash of the task parameters to ensure task authenticity and authorization
     */
    function validateSignatures(
        Task memory _task,
        address[] memory signerAddresses,
        bytes[] memory signatures
    ) external returns (bool isVerified);

    /**
     * @notice Adds a new strategy to the Service Manager
     * @dev Only callable by the contract owner. Adds a strategy that operators can stake on.
     * @param _strategy The address of the strategy contract to add
     * @param quorumNumber The quorum number associated with the strategy
     * @param index The index of the strategy within the quorum
     * @dev Emits a StrategyAdded event upon successful addition of the strategy
     * @dev Reverts if the strategy does not exist or is already added
     */
    function addStrategy(address _strategy, uint8 quorumNumber, uint256 index) external;

    /**
     * @notice Removes an existing strategy from the Service Manager
     * @dev Only callable by the contract owner. Removes a strategy that operators are currently able to stake on.
     * @param _strategy The address of the strategy contract to remove
     * @dev Emits a StrategyRemoved event upon successful removal of the strategy
     * @dev Reverts if the strategy is not currently added or if the address is invalid
     */
    function removeStrategy(
        address _strategy
    ) external;

    /**
     * @notice Enables the rotation of Predicate Signing Key for an operator
     * @param _oldSigningKey address of the old signing key to remove
     * @param _newSigningKey address of the new signing key to add
     */
    function rotatePredicateSigningKey(address _oldSigningKey, address _newSigningKey) external;
}

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

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "solmate/=lib/solmate/src/",
    "openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/",
    "eigenlayer-contracts/=lib/eigenlayer-contracts/",
    "utils/=lib/utils/",
    "@uniswap/v3-core/=lib/v3-core/",
    "@uniswap/v3-periphery/=lib/v3-periphery/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/",
    "@openzeppelin-upgrades/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable/",
    "@openzeppelin-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "eigenlayer-middleware/=lib/eigenlayer-middleware/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/",
    "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/",
    "v3-core/=lib/v3-core/contracts/",
    "v3-periphery/=lib/v3-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_serviceManager","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPolicy","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPredicateManager","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":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"string","name":"taskId","type":"string"},{"internalType":"uint256","name":"expireByBlockNumber","type":"uint256"},{"internalType":"address[]","name":"signerAddresses","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"internalType":"struct PredicateMessage","name":"_message","type":"tuple"}],"name":"sendCoin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_policyID","type":"string"}],"name":"setPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_predicateManager","type":"address"}],"name":"setPredicateManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f5ffd5b5060405161121538038061121583398101604081905261002e91610181565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610098565b506001600160a01b0383165f9081526001602052604090206509184e72a000905561009082826100e7565b505050610390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b9930080546001600160a01b0319166001600160a01b0384161781557f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b9930161014c83826102d6565b50505050565b80516001600160a01b0381168114610168575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f60608486031215610193575f5ffd5b61019c84610152565b92506101aa60208501610152565b60408501519092506001600160401b038111156101c5575f5ffd5b8401601f810186136101d5575f5ffd5b80516001600160401b038111156101ee576101ee61016d565b604051601f8201601f19908116603f011681016001600160401b038111828210171561021c5761021c61016d565b604052818152828201602001881015610233575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b600181811c9082168061026657607f821691505b60208210810361028457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156102d157805f5260205f20601f840160051c810160208510156102af5750805b601f840160051c820191505b818110156102ce575f81556001016102bb565b50505b505050565b81516001600160401b038111156102ef576102ef61016d565b610303816102fd8454610252565b8461028a565b6020601f821160018114610335575f831561031e5750848201515b5f19600385901b1c1916600184901b1784556102ce565b5f84815260208120601f198516915b828110156103645787850151825560209485019460019092019101610344565b508482101561038157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610e788061039d5f395ff3fe60806040526004361061008f575f3560e01c8063ce1e462611610057578063ce1e46261461014a578063e0a7704a1461016b578063ee2453c61461018a578063f2fde38b1461019d578063f8b2cb4f146101bc575f5ffd5b806327e235e3146100935780636b4c991b146100d1578063715018a6146100f25780638da5cb5b14610106578063a4b3bc0114610136575b5f5ffd5b34801561009e575f5ffd5b506100be6100ad366004610763565b60016020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156100dc575f5ffd5b506100f06100eb366004610868565b6101f0565b005b3480156100fd575f5ffd5b506100f0610204565b348015610111575f5ffd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020016100c8565b348015610141575f5ffd5b5061011e610217565b348015610155575f5ffd5b5061015e61023b565b6040516100c891906108d0565b348015610176575f5ffd5b506100f0610185366004610763565b610245565b6100f06101983660046108e2565b610277565b3480156101a8575f5ffd5b506100f06101b7366004610763565b610341565b3480156101c7575f5ffd5b506100be6101d6366004610763565b6001600160a01b03165f9081526001602052604090205490565b6101f861037b565b610201816103a7565b50565b61020c61037b565b6102155f6103e5565b565b5f6102365f516020610e235f395f51905f52546001600160a01b031690565b905090565b6060610236610434565b61024d61037b565b5f516020610e235f395f51905f5280546001600160a01b0319166001600160a01b03831617905550565b6040516001600160a01b0384166024820152604481018390525f9060640160408051601f198184030181529190526020810180516001600160e01b03166353e45cb560e11b17905290506102d56102cd836109ff565b8233346104d3565b6103315760405162461bcd60e51b815260206004820152602260248201527f4d657461436f696e3a20756e617574686f72697a6564207472616e736163746960448201526137b760f11b60648201526084015b60405180910390fd5b61033b8484610657565b50505050565b61034961037b565b6001600160a01b03811661037257604051631e4fbdf760e01b81525f6004820152602401610328565b610201816103e5565b5f546001600160a01b031633146102155760405163118cdaa760e01b8152336004820152602401610328565b5f516020610e235f395f51905f527f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b993016103e08382610b83565b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f516020610e235f395f51905f52600101805461045290610b00565b80601f016020809104026020016040519081016040528092919081815260200182805461047e90610b00565b80156104c95780601f106104a0576101008083540402835291602001916104c9565b820191905f5260205f20905b8154815290600101906020018083116104ac57829003601f168201915b5050505050905090565b5f805f516020610e235f395f51905f5290505f604051806101000160405280885f01518152602001866001600160a01b03168152602001306001600160a01b0316815260200185815260200187815260200183600101805461053490610b00565b80601f016020809104026020016040519081016040528092919081815260200182805461056090610b00565b80156105ab5780601f10610582576101008083540402835291602001916105ab565b820191905f5260205f20905b81548152906001019060200180831161058e57829003601f168201915b50505091835250506040808a0180515163ffffffff166020808501919091528b0151928201929092528454915160608b015191516318cea58d60e01b81529394506001600160a01b03909216926318cea58d9261060c928692600401610cdb565b6020604051808303815f875af1158015610628573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064c9190610dc3565b979650505050505050565b335f908152600160205260409020548111156106b55760405162461bcd60e51b815260206004820152601e60248201527f4d657461436f696e3a20696e73756666696369656e742062616c616e636500006044820152606401610328565b335f90815260016020526040812080548392906106d3908490610df6565b90915550506001600160a01b0382165f90815260016020526040812080548392906106ff908490610e0f565b90915550506040518181526001600160a01b0383169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b038116811461075e575f5ffd5b919050565b5f60208284031215610773575f5ffd5b61077c82610748565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156107ba576107ba610783565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156107e9576107e9610783565b604052919050565b5f5f67ffffffffffffffff84111561080b5761080b610783565b50601f8301601f1916602001610820816107c0565b915050828152838383011115610834575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112610859575f5ffd5b61077c838335602085016107f1565b5f60208284031215610878575f5ffd5b813567ffffffffffffffff81111561088e575f5ffd5b61089a8482850161084a565b949350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61077c60208301846108a2565b5f5f5f606084860312156108f4575f5ffd5b6108fd84610748565b925060208401359150604084013567ffffffffffffffff81111561091f575f5ffd5b840160808187031215610930575f5ffd5b809150509250925092565b5f67ffffffffffffffff82111561095457610954610783565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813561098061097b8261093b565b6107c0565b8082825260208201915060208360051b8601019250858311156109a1575f5ffd5b602085015b838110156109f557803567ffffffffffffffff8111156109c4575f5ffd5b8601603f810188136109d4575f5ffd5b6109e6886020830135604084016107f1565b845250602092830192016109a6565b5095945050505050565b5f60808236031215610a0f575f5ffd5b610a17610797565b823567ffffffffffffffff811115610a2d575f5ffd5b610a393682860161084a565b82525060208381013590820152604083013567ffffffffffffffff811115610a5f575f5ffd5b830136601f820112610a6f575f5ffd5b8035610a7d61097b8261093b565b8082825260208201915060208360051b850101925036831115610a9e575f5ffd5b6020840193505b82841015610ac757610ab684610748565b825260209384019390910190610aa5565b6040850152505050606083013567ffffffffffffffff811115610ae8575f5ffd5b610af43682860161095e565b60608301525092915050565b600181811c90821680610b1457607f821691505b602082108103610b3257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156103e057805f5260205f20601f840160051c81016020851015610b5d5750805b601f840160051c820191505b81811015610b7c575f8155600101610b69565b5050505050565b815167ffffffffffffffff811115610b9d57610b9d610783565b610bb181610bab8454610b00565b84610b38565b6020601f821160018114610be3575f8315610bcc5750848201515b5f19600385901b1c1916600184901b178455610b7c565b5f84815260208120601f198516915b82811015610c125787850151825560209485019460019092019101610bf2565b5084821015610c2f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8151808452602084019350602083015f5b82811015610c775781516001600160a01b0316865260209586019590910190600101610c50565b5093949350505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015610ccf57601f19858403018852610cb98383516108a2565b6020988901989093509190910190600101610c9d565b50909695505050505050565b606081525f84516101006060840152610cf86101608401826108a2565b90506020860151610d1460808501826001600160a01b03169052565b5060408601516001600160a01b031660a0840152606086015160c08401526080860151838203605f190160e0850152610d4d82826108a2565b91505060a0860151605f1984830301610100850152610d6c82826108a2565b91505060c0860151610d8761012085018263ffffffff169052565b5060e08601516101408401528281036020840152610da58186610c3e565b90508281036040840152610db98185610c81565b9695505050505050565b5f60208284031215610dd3575f5ffd5b8151801515811461077c575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610e0957610e09610de2565b92915050565b80820180821115610e0957610e09610de256fe804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b99300a26469706673582212207a10dbb3b9578cef10aca1018d9c4be5821b171c26feb0c6323b1dd8baa92acc64736f6c634300081c003300000000000000000000000050de3cdbe0be6709c9f34848d5bc9023cc60b399000000000000000000000000c75f360e4f801f61975a425c405f1472c550ef550000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001a782d6578616d706c652d64343337393364623230303635613661000000000000

Deployed Bytecode

0x60806040526004361061008f575f3560e01c8063ce1e462611610057578063ce1e46261461014a578063e0a7704a1461016b578063ee2453c61461018a578063f2fde38b1461019d578063f8b2cb4f146101bc575f5ffd5b806327e235e3146100935780636b4c991b146100d1578063715018a6146100f25780638da5cb5b14610106578063a4b3bc0114610136575b5f5ffd5b34801561009e575f5ffd5b506100be6100ad366004610763565b60016020525f908152604090205481565b6040519081526020015b60405180910390f35b3480156100dc575f5ffd5b506100f06100eb366004610868565b6101f0565b005b3480156100fd575f5ffd5b506100f0610204565b348015610111575f5ffd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020016100c8565b348015610141575f5ffd5b5061011e610217565b348015610155575f5ffd5b5061015e61023b565b6040516100c891906108d0565b348015610176575f5ffd5b506100f0610185366004610763565b610245565b6100f06101983660046108e2565b610277565b3480156101a8575f5ffd5b506100f06101b7366004610763565b610341565b3480156101c7575f5ffd5b506100be6101d6366004610763565b6001600160a01b03165f9081526001602052604090205490565b6101f861037b565b610201816103a7565b50565b61020c61037b565b6102155f6103e5565b565b5f6102365f516020610e235f395f51905f52546001600160a01b031690565b905090565b6060610236610434565b61024d61037b565b5f516020610e235f395f51905f5280546001600160a01b0319166001600160a01b03831617905550565b6040516001600160a01b0384166024820152604481018390525f9060640160408051601f198184030181529190526020810180516001600160e01b03166353e45cb560e11b17905290506102d56102cd836109ff565b8233346104d3565b6103315760405162461bcd60e51b815260206004820152602260248201527f4d657461436f696e3a20756e617574686f72697a6564207472616e736163746960448201526137b760f11b60648201526084015b60405180910390fd5b61033b8484610657565b50505050565b61034961037b565b6001600160a01b03811661037257604051631e4fbdf760e01b81525f6004820152602401610328565b610201816103e5565b5f546001600160a01b031633146102155760405163118cdaa760e01b8152336004820152602401610328565b5f516020610e235f395f51905f527f804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b993016103e08382610b83565b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f516020610e235f395f51905f52600101805461045290610b00565b80601f016020809104026020016040519081016040528092919081815260200182805461047e90610b00565b80156104c95780601f106104a0576101008083540402835291602001916104c9565b820191905f5260205f20905b8154815290600101906020018083116104ac57829003601f168201915b5050505050905090565b5f805f516020610e235f395f51905f5290505f604051806101000160405280885f01518152602001866001600160a01b03168152602001306001600160a01b0316815260200185815260200187815260200183600101805461053490610b00565b80601f016020809104026020016040519081016040528092919081815260200182805461056090610b00565b80156105ab5780601f10610582576101008083540402835291602001916105ab565b820191905f5260205f20905b81548152906001019060200180831161058e57829003601f168201915b50505091835250506040808a0180515163ffffffff166020808501919091528b0151928201929092528454915160608b015191516318cea58d60e01b81529394506001600160a01b03909216926318cea58d9261060c928692600401610cdb565b6020604051808303815f875af1158015610628573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064c9190610dc3565b979650505050505050565b335f908152600160205260409020548111156106b55760405162461bcd60e51b815260206004820152601e60248201527f4d657461436f696e3a20696e73756666696369656e742062616c616e636500006044820152606401610328565b335f90815260016020526040812080548392906106d3908490610df6565b90915550506001600160a01b0382165f90815260016020526040812080548392906106ff908490610e0f565b90915550506040518181526001600160a01b0383169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b038116811461075e575f5ffd5b919050565b5f60208284031215610773575f5ffd5b61077c82610748565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156107ba576107ba610783565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156107e9576107e9610783565b604052919050565b5f5f67ffffffffffffffff84111561080b5761080b610783565b50601f8301601f1916602001610820816107c0565b915050828152838383011115610834575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112610859575f5ffd5b61077c838335602085016107f1565b5f60208284031215610878575f5ffd5b813567ffffffffffffffff81111561088e575f5ffd5b61089a8482850161084a565b949350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61077c60208301846108a2565b5f5f5f606084860312156108f4575f5ffd5b6108fd84610748565b925060208401359150604084013567ffffffffffffffff81111561091f575f5ffd5b840160808187031215610930575f5ffd5b809150509250925092565b5f67ffffffffffffffff82111561095457610954610783565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813561098061097b8261093b565b6107c0565b8082825260208201915060208360051b8601019250858311156109a1575f5ffd5b602085015b838110156109f557803567ffffffffffffffff8111156109c4575f5ffd5b8601603f810188136109d4575f5ffd5b6109e6886020830135604084016107f1565b845250602092830192016109a6565b5095945050505050565b5f60808236031215610a0f575f5ffd5b610a17610797565b823567ffffffffffffffff811115610a2d575f5ffd5b610a393682860161084a565b82525060208381013590820152604083013567ffffffffffffffff811115610a5f575f5ffd5b830136601f820112610a6f575f5ffd5b8035610a7d61097b8261093b565b8082825260208201915060208360051b850101925036831115610a9e575f5ffd5b6020840193505b82841015610ac757610ab684610748565b825260209384019390910190610aa5565b6040850152505050606083013567ffffffffffffffff811115610ae8575f5ffd5b610af43682860161095e565b60608301525092915050565b600181811c90821680610b1457607f821691505b602082108103610b3257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156103e057805f5260205f20601f840160051c81016020851015610b5d5750805b601f840160051c820191505b81811015610b7c575f8155600101610b69565b5050505050565b815167ffffffffffffffff811115610b9d57610b9d610783565b610bb181610bab8454610b00565b84610b38565b6020601f821160018114610be3575f8315610bcc5750848201515b5f19600385901b1c1916600184901b178455610b7c565b5f84815260208120601f198516915b82811015610c125787850151825560209485019460019092019101610bf2565b5084821015610c2f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8151808452602084019350602083015f5b82811015610c775781516001600160a01b0316865260209586019590910190600101610c50565b5093949350505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015610ccf57601f19858403018852610cb98383516108a2565b6020988901989093509190910190600101610c9d565b50909695505050505050565b606081525f84516101006060840152610cf86101608401826108a2565b90506020860151610d1460808501826001600160a01b03169052565b5060408601516001600160a01b031660a0840152606086015160c08401526080860151838203605f190160e0850152610d4d82826108a2565b91505060a0860151605f1984830301610100850152610d6c82826108a2565b91505060c0860151610d8761012085018263ffffffff169052565b5060e08601516101408401528281036020840152610da58186610c3e565b90508281036040840152610db98185610c81565b9695505050505050565b5f60208284031215610dd3575f5ffd5b8151801515811461077c575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610e0957610e09610de2565b92915050565b80820180821115610e0957610e09610de256fe804776a84f3d03ad8442127b1451e2fbbb6a715c681d6a83c9e9fca787b99300a26469706673582212207a10dbb3b9578cef10aca1018d9c4be5821b171c26feb0c6323b1dd8baa92acc64736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000050de3cdbe0be6709c9f34848d5bc9023cc60b399000000000000000000000000c75f360e4f801f61975a425c405f1472c550ef550000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001a782d6578616d706c652d64343337393364623230303635613661000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0x50De3cDbE0be6709c9F34848d5Bc9023Cc60B399
Arg [1] : _serviceManager (address): 0xc75F360e4F801F61975a425c405f1472c550ef55
Arg [2] : _policyID (string): x-example-d43793db20065a6a

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000050de3cdbe0be6709c9f34848d5bc9023cc60b399
Arg [1] : 000000000000000000000000c75f360e4f801f61975a425c405f1472c550ef55
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [4] : 782d6578616d706c652d64343337393364623230303635613661000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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