LogoLogo
  • Entangle
    • Overview
    • Security Audits
  • Universal Interoperability Protocol
    • Overview
    • Architecture
      • Scalability and Network Stability
        • L2 Utility Blockchains
        • Transmitter Groups
      • Security and Consensus Mechanism
      • Finality
      • Execution Latency
      • Compatibility and Interoperability
    • Developer Guides
      • Getting Started
      • Solidity
        • Simple Abstract Messenger Example
        • Deploying Your Custom EVM Protocol
        • Bridging Tokens with UIP
        • Become an EVM Transmitter
      • Solana
        • Simple Abstract Messenger Example
        • Deploying Your Custom Solana Protocol
        • Become a Solana Transmitter
      • Calculate Cross-Chain Transaction Cost
      • Customizable Message Transmission Options
      • How to Debug Sent Messages
      • SDK Setup
      • Revenue Sharing for Transmitters
      • How to Become a Super Transmitter
    • Endpoints
  • Universal Data Feeds
    • Overview
    • Architecture
      • Data Delivery Methods
        • Pull Model
        • Push Model
      • Oracle Contract & User Interaction
    • Developer Guides
      • Custom Data Feeds
      • Fetch Data via Pull Model (PAYG)
        • EVM Smart Contracts
        • Solana Smart Contracts
      • Fetch Data via Pull Model (Subscriptions)
        • EVM Smart Contracts
        • Solana Smart Contracts
      • Fetch Data via Push Model
        • EVM Smart Contracts
        • Solana Smart Contracts
    • User Guides
      • Accessing Feeds
      • Subscribe to a Data Feed
      • Check Subscription
      • Manage Subscription
      • Renew Subscription
    • Data Endpoints
  • Universal Token Standard
    • Overview
    • Architecture
      • Fee Components
    • Developer Guides
      • Manual Deploy
        • Token Deployment Types
        • Create a Custom Token
        • Factory Blueprint Deployment
        • Examples
          • Initial Setup
          • UTS Connector
            • Mint & Burn Connector Scheme
            • Lock & Unlock Connector Scheme
            • Connector Over Native Currency
          • UTS Token
            • Simple Token
            • Token with Messages
      • Bridge SDK
      • Token Verification
      • Fees Calculation & Gas Estimation Logic
      • Estimations
    • User Guides
      • Launch Universal Token
      • Create a Liquidity Pool
      • Expand Existing Token
      • Transfer Liquidity to Connector
      • Bridging
    • Contract Addresses
  • Entangle Interoperable Blockchain
    • Overview
    • Architecture
    • Developer Guides
      • Set up a Validator Node
      • Delegating to Validators
      • Undelegating from Validators
      • Supported Accounts
  • More
    • Media Kit
    • FAQ
    • Report an Issue
    • Become a Partner
Powered by GitBook
On this page
  • Step 1: Initialize new hardhat project
  • Step 2: Write a contract that verifies an update in the transaction
  • Step 3: Deploy the contract
  • Step 4: Understanding update format and Finalized Data API
  • Step 5: Send a transaction with the update data

Was this helpful?

Export as PDF
  1. Universal Data Feeds
  2. Developer Guides
  3. Fetch Data via Pull Model (PAYG)

EVM Smart Contracts

In the Pull model, consumers include verification data about the most recent update directly in their transaction. This data is fetched from the oracle and verified within the same transaction before being used.

This scheme comes with the following properties:

  1. Consumers always use the latest update in their transaction, so the price used in the transaction is as close to real time as protocol update frequency.

  2. The cost for maintaining update relevance on-chain relies on end-consumers. This allows the oracle protocol to have much larger set of assets.

This guide will help developers who want to use Pull model (PAYG) within their contracts. It uses Hardhat for contract compilation, although similar methods apply with other frameworks.

Step 1: Initialize new hardhat project

In the first step, we are establishing a basic solidity development setup.

yarn init -y
# yarn initialization flow
yarn add --dev hardhat
yarn hardhat init
# Hardhat initialization flow (select TypeScript project)

Step 2: Write a contract that verifies an update in the transaction

Now create a new PullVerifier contract, which utilizes the pullMarketplace.verifyWithFee function to verify the update information provided through calldata. The update contains oracle votes along with their signatures.

Once the PullVerifier contract verifies the update against these inputs, it returns the verified value to the caller contract. If the verification fails (e.g., due to mismatched data, invalid signatures, or other inconsistencies) the contract reverts the entire transaction, ensuring that only valid data is accepted.

./contractrs/PullVerifier.sol
// SPDX-License-Identifier: BSL1.1
pragma solidity ^0.8.20;

interface IPullMarketplace  {
        struct PriceUpdate {
        uint256 price;
        uint256 timestamp;
    }
    function verifyWithFee(
        bytes calldata updateData,
        bytes32 feedKey
    ) external payable returns (PriceUpdate memory);
    function getUpdateFee(uint256 nUpdates) external view returns (uint256);
    
}
contract PullVerifier {
    IPullMarketplace public pullMarketplace;
    uint public latestPrice;
    uint public latestTimestamp;
    constructor(address _pullMarketplace){
        pullMarketplace = IPullMarketplace(_pullMarketplace);
    }
    // @notice function that verifies feed from provided update PAYG through PullMarketplace and stores update data
    function VerifyPAYG(bytes calldata updateData, bytes32 feedKey) external{
	  // Calculate required fee
        uint256 fee = pullMarketplace.getUpdateFee(1);
	// Verify the update
        IPullMarketplace.PriceUpdate memory priceUpdate = pullMarketplace.verifyWithFee{value: fee}(updateData, feedKey);
	// store update data
        latestPrice = priceUpdate.price;
        latestTimestamp = priceUpdate.timestamp;
    }
   

    // @notice deposit native tokens for fee coverage
   receive() payable external {}

}

Now that we have a contract, let's write a hardhat ignition script to deploy it.

./ignition/modules/PullVerifier.ts
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";

// PullMarketplace address on Eth Sepolia network
const PullMarketplaceAddress = "0xC6670092056e7bf56c3149FDE52A187b3e9f2e63";

const PullVerifierModule = buildModule("PullVerifierModule", (m) => {
	const consumer = m.contract("PullVerifier", [PullMarketplaceAddress ]);

	return { consumer };
});

export default PullVerifierModule;

Step 3: Deploy the contract

Now let's modify the hardhat configuration file to add the eth_sepolia network.

./hardhat.config.ts
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";

const config: HardhatUserConfig = {
  solidity: "0.8.28",
  networks: {
    eth_sepolia: {
        chainId: 11155111,
        // or http://127.0.0.1:8545, if you forked it locally
        url: "https://ethereum-sepolia-rpc.publicnode.com",
        accounts: [ "0x" ], // TODO: Set deployer private key
    },
  },
};

export default config;

Now we can deploy the PullVerifier contract by running the command below.

yarn hardhat ignition deploy ./ignition/modules/PullVerifier.ts --network eth_sepolia
Expected Result
✔ Confirm deploy to network eth_sepolia (11155111)? … yes
Hardhat Ignition 🚀

Resuming existing deployment from ./ignition/deployments/chain-11155111

Deploying [ PullVerifierModule ]

Batch #1
  Executed PullVerifierModule#PullVerifier

[ PullVerifierModule] successfully deployed 🚀

Deployed Addresses

PullVerifierModule#PullVerifier - 0xBd0AFEE88B7FcEE6139467700D6f40F13FEDa739

Step 4: Understanding update format and Finalized Data API

At this point, the PullConsumer contract is ready to verify updates that we send it. But before doing that, let's quickly go through the update format and the data that it expects.

As an example, let’s imagine you need BTC/USD price in your contract. First, we need to fetch the latest update from the Finalized Data backend service. This service constantly synchronizes its state with oracle's state and provides oracle data via convenient APIs (REST, WebSocket).

curl https://udfsnap.ent-dx.com/last_votes?feedKeys=BTC/USD
Expected Result
{
  "update_call_data": "0x55444646014254432f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000103c693478ddd1a5ff8b0000000000000000000000000000000000000000000000000000000067f3bd9da5c05745f7651d2c2c9f8771ff435193f2b0c719ca149e0b20ef4ecf0b0050c07d76ac34ec08947a026ad849ccce7f324c1d206140c0cf23411ae13f8e5b60121b00000000000000000000000000000000000000000000103c8289badcc4b240340000000000000000000000000000000000000000000000000000000067f3bd9de20d0d68fe93309786b18387c48bbfdd6d2ff03da78bc31294d25b3363a988491f75e29da2c99e3a39bc9afd8bf3072f1c39fe1bfb00033a73af48ba7ad7bf291b00000000000000000000000000000000000000000000103c84ecee2483ad3be70000000000000000000000000000000000000000000000000000000067f3bd9d9ed7b8ba15718887607d52853a12de16bd79d6bf8df3c29a051561d42fe6b160208c1cc24ac7c186fad1f70828be7bbbd66fe7c090193223f788c652ebc127071b",
  "feeds": [
    {
      "feed_key": "BTC/USD",
      "votes": [
        {
          "Value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAABA8aTR43dGl/4s=",
          "Timestamp": 1744027037,
          "Publisher": "0x6733D110A59Dc160b5C8093066A7f5103885196F",
          "Signature": {
            "R": "0xa5c05745f7651d2c2c9f8771ff435193f2b0c719ca149e0b20ef4ecf0b0050c0",
            "S": "0x7d76ac34ec08947a026ad849ccce7f324c1d206140c0cf23411ae13f8e5b6012",
            "V": 27
          }
        },
        {
          "Value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAABA8gom63MSyQDQ=",
          "Timestamp": 1744027037,
          "Publisher": "0xbe524616e96bb4b62ccE8034AB6beA8F2505B55a",
          "Signature": {
            "R": "0xe20d0d68fe93309786b18387c48bbfdd6d2ff03da78bc31294d25b3363a98849",
            "S": "0x1f75e29da2c99e3a39bc9afd8bf3072f1c39fe1bfb00033a73af48ba7ad7bf29",
            "V": 27
          }
        },
        {
          "Value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAABA8hOzuJIOtO+c=",
          "Timestamp": 1744027037,
          "Publisher": "0x93b502d3eb45b9EAE948F8Fca01E64D9c0BA538a",
          "Signature": {
            "R": "0x9ed7b8ba15718887607d52853a12de16bd79d6bf8df3c29a051561d42fe6b160",
            "S": "0x208c1cc24ac7c186fad1f70828be7bbbd66fe7c090193223f788c652ebc12707",
            "V": 27
          }
        }
      ]
    }
  ]
}

This response provides all necessary details to verify the BTC/USD update, specifically:

  • feeds: An array containing parsed update data for requested feeds.

  • votes: Publisher's latest votes on the specific feed. This aggregated array of votes is necessary to obtain agreed-upon value on-chain.

    • Value: The data that Publisher observed.

    • Timestamp: Timestamp at which the Publisher observed that data.

    • Publisher: Publisher's public key.

    • Signature: ECDSA signature for the observed value. This signature represents commitment from publisher that this data is what he observed.

This data enables executing the transaction on the PullVerifier contract. To begin, fetch the latest update from the Finalized Data API for the BTC/USD price.

Step 5: Send a transaction with the update data

Now that we understand the Finalized Data API, we can create scripts to demonstrate update verification.

First of all, we need to fund the PullVerifier contract, so it will be able to pay the verification fee. Copy the following code to the scripts/fundVerifier.ts file.

./scripts/fundVerifier.ts
import { ethers } from "hardhat";

// PullVerifier contract address on ETH Sepolia
const PullVerifierAddress = "0xBd0AFEE88B7FcEE6139467700D6f40F13FEDa739";

async function main() {

  // Use default hardhat signer to fund the PullConsumer contract
  const [funder] = await ethers.getSigners();

  // 0.0003 is the exact cost for 10 updates on eth_seoplia
  const depositAmount = ethers.parseEther("0.0003");

  // Send funding transaction
  const tx = await funder.sendTransaction({
    to: PullVerifierAddress ,
    value: depositAmount
  });
  await tx.wait();

  console.log(`sent ${depositAmount} to PullVerifier, tx: ${tx.hash}`);
}

main()
  .then(() => process.exit(0))
  .catch(error => {
    console.error(error);
    process.exit(1);
  });

Change the PullConsumerAddress to the address you got from deployment and execute the script to fund the deployed PullConsumer contract.

yarn hardhat run ./scripts/fundVerifier.ts --network eth_sepolia

Now we will need to create a script that retrieves an update from the API, parses the response, encodes it to EVM calldata, and sends a transaction to verify the update. The contract can then validate the update and incorporate the verified price into its on-chain logic.

First, add the UDF SDK library. We will use it to fetch the update using the REST API and encode it for on-chain usage.

yarn add --dev @entangle-labs/udf-sdk

Copy the script below to the scripts/fetchAndVerify.ts file.

Don't forget to change the PullVerifierAddress to your contract address.

scripts/fetchAndVerify.ts
import { ethers } from "hardhat";
import {
  PullVerifier,
} from "../typechain-types";
import { UdfSdk } from '@entangle-labs/udf-sdk';

// PullVerifier contract address on ETH Sepolia
const PullVerifierAddress = "0xBd0AFEE88B7FcEE6139467700D6f40F13FEDa739";

async function main() {

  // Fetch the update data from finalized-data-snap
  const sdk = new UdfSdk();
  const updateData = await sdk.getCallData(["BTC/USD"]);
  const feedKey = ethers.encodeBytes32String("BTC/USD");

  // Bind PullVerifier contract on the network
  const verifier = await ethers.getContractAt(
    "PullVerifier",
    PullVerifierAddress
  );

  // Send verify transaction
  let tx = await verifier.VerifyPAYG(
    updateData,feedKey 
  );
  await tx.wait();
  console.log("sent tx:", tx.hash);
  let price = await verifier.latestPrice();
  let timestamp = await verifier.latestTimestamp();
  console.log("price:", price );
  console.log("timestamp:", timestamp );
}

main()
  .then(() => process.exit(0))
  .catch(error => {
    console.error(error);
    process.exit(1);
  });

Now let’s execute the script using the command below.

yarn hardhat run ./scripts/fetchAndVerify.ts --network eth_sepolia
Expected Result
sent tx: 0xb66fb4112b7fdf72211c2238b9b0a609a8321e2694ddad9b69ec7dcc953fdb18
price: 76683771643884818373141n
timestamp: 1744027087n

You can use cast to examine the transaction call trace and logs. The emitted event shows the latest update that we verified.

Note that gas usage may vary depending on the result and the version of the library in use.

cast run 0xb66fb4112b7fdf72211c2238b9b0a609a8321e2694ddad9b69ec7dcc953fdb18 -r https://eth-sepolia.public.blastapi.io
Expected Result
Executing previous transactions from the block.
Traces:
  [137017] 0xBd0AFEE88B7FcEE6139467700D6f40F13FEDa739::2e37a79c(00000000000000000000000000000000000000000000000000000000000000404254432f5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a955444646014254432f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000103d081c72d9f475f0bd0000000000000000000000000000000000000000000000000000000067f3bdcf2e2ffc130ee5e218e62e5babe2b2c6d0fa30f07c44b3eb131bf32e8dbda99b1e419e4016c33066e7f736958fb849a20edf1f84ecc71acd6ebe1a822142d7276a1c00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf27ef18a4bb82a9d25c7384e5dc40a992a8f6c85d4099d9f77c2833641e91bef96f8c7f3e4296ad701dbd2d93ed345fde78bcbd6c430b5294b81be0eccce83efa1b00000000000000000000000000000000000000000000103d09c19608a94bf2d10000000000000000000000000000000000000000000000000000000067f3bdcf9240ac502823b0d89ec923abcd895508c38ff00f763332d89a5b5acb292600632af57fc4382aa10b59e95d963dd2f39072ba9133186af6c73b939a1a5b6afd371b0000000000000000000000000000000000000000000000)
    ├─ [8177] 0xC6670092056e7bf56c3149FDE52A187b3e9f2e63::getUpdateFee(1) [staticcall]
    │   ├─ [3284] 0xF9E8AEE871D1e9cED62702050F16E0660a88645a::getUpdateFee(1) [delegatecall]
    │   │   └─ ← [Return] 0x00000000000000000000000000000000000000000000000000001b48eb57e000
    │   └─ ← [Return] 0x00000000000000000000000000000000000000000000000000001b48eb57e000
    ├─ [70181] 0xC6670092056e7bf56c3149FDE52A187b3e9f2e63::b90ffe1f{value: 30000000000000}(00000000000000000000000000000000000000000000000000000000000000404254432f5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a955444646014254432f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000103d081c72d9f475f0bd0000000000000000000000000000000000000000000000000000000067f3bdcf2e2ffc130ee5e218e62e5babe2b2c6d0fa30f07c44b3eb131bf32e8dbda99b1e419e4016c33066e7f736958fb849a20edf1f84ecc71acd6ebe1a822142d7276a1c00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf27ef18a4bb82a9d25c7384e5dc40a992a8f6c85d4099d9f77c2833641e91bef96f8c7f3e4296ad701dbd2d93ed345fde78bcbd6c430b5294b81be0eccce83efa1b00000000000000000000000000000000000000000000103d09c19608a94bf2d10000000000000000000000000000000000000000000000000000000067f3bdcf9240ac502823b0d89ec923abcd895508c38ff00f763332d89a5b5acb292600632af57fc4382aa10b59e95d963dd2f39072ba9133186af6c73b939a1a5b6afd371b0000000000000000000000000000000000000000000000)
    │   ├─ [69692] 0xF9E8AEE871D1e9cED62702050F16E0660a88645a::b90ffe1f{value: 30000000000000}(00000000000000000000000000000000000000000000000000000000000000404254432f5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a955444646014254432f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000103d081c72d9f475f0bd0000000000000000000000000000000000000000000000000000000067f3bdcf2e2ffc130ee5e218e62e5babe2b2c6d0fa30f07c44b3eb131bf32e8dbda99b1e419e4016c33066e7f736958fb849a20edf1f84ecc71acd6ebe1a822142d7276a1c00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf27ef18a4bb82a9d25c7384e5dc40a992a8f6c85d4099d9f77c2833641e91bef96f8c7f3e4296ad701dbd2d93ed345fde78bcbd6c430b5294b81be0eccce83efa1b00000000000000000000000000000000000000000000103d09c19608a94bf2d10000000000000000000000000000000000000000000000000000000067f3bdcf9240ac502823b0d89ec923abcd895508c38ff00f763332d89a5b5acb292600632af57fc4382aa10b59e95d963dd2f39072ba9133186af6c73b939a1a5b6afd371b0000000000000000000000000000000000000000000000) [delegatecall]
    │   │   ├─ [60369] 0xc0931aEE1064BD5245fEe76A2d740eab8436621e::40366475(00000000000000000000000000000000000000000000000000000000000000404254432f5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a955444646014254432f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000103d081c72d9f475f0bd0000000000000000000000000000000000000000000000000000000067f3bdcf2e2ffc130ee5e218e62e5babe2b2c6d0fa30f07c44b3eb131bf32e8dbda99b1e419e4016c33066e7f736958fb849a20edf1f84ecc71acd6ebe1a822142d7276a1c00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf27ef18a4bb82a9d25c7384e5dc40a992a8f6c85d4099d9f77c2833641e91bef96f8c7f3e4296ad701dbd2d93ed345fde78bcbd6c430b5294b81be0eccce83efa1b00000000000000000000000000000000000000000000103d09c19608a94bf2d10000000000000000000000000000000000000000000000000000000067f3bdcf9240ac502823b0d89ec923abcd895508c38ff00f763332d89a5b5acb292600632af57fc4382aa10b59e95d963dd2f39072ba9133186af6c73b939a1a5b6afd371b0000000000000000000000000000000000000000000000) [staticcall]
    │   │   │   ├─ [55380] 0xB2F863B68d85b198DDe2fE7da1D8baFdCFf199c0::40366475(00000000000000000000000000000000000000000000000000000000000000404254432f5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a955444646014254432f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000103d081c72d9f475f0bd0000000000000000000000000000000000000000000000000000000067f3bdcf2e2ffc130ee5e218e62e5babe2b2c6d0fa30f07c44b3eb131bf32e8dbda99b1e419e4016c33066e7f736958fb849a20edf1f84ecc71acd6ebe1a822142d7276a1c00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf27ef18a4bb82a9d25c7384e5dc40a992a8f6c85d4099d9f77c2833641e91bef96f8c7f3e4296ad701dbd2d93ed345fde78bcbd6c430b5294b81be0eccce83efa1b00000000000000000000000000000000000000000000103d09c19608a94bf2d10000000000000000000000000000000000000000000000000000000067f3bdcf9240ac502823b0d89ec923abcd895508c38ff00f763332d89a5b5acb292600632af57fc4382aa10b59e95d963dd2f39072ba9133186af6c73b939a1a5b6afd371b0000000000000000000000000000000000000000000000) [delegatecall]
    │   │   │   │   ├─ [3000] PRECOMPILES::ecrecover(0x6f256b7d268ebd1218609a792f492fed69e60f9b2bbb7a6aa535dd7eb100cb0a, 28, 20891172600762156370158823662620543704900665111721513626205233704845164780318, 29679939319588129535545874401977999632529215185806134268849298554013395396458) [staticcall]
    │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000006733d110a59dc160b5c8093066a7f5103885196f
    │   │   │   │   ├─ [8142] 0x996520f9717f6141e53D8083168027d7834c172f::55b5190b(7564662d76312e310000000000000000000000000000000000000000000000000000000000000000000000006733d110a59dc160b5c8093066a7f5103885196f) [staticcall]
    │   │   │   │   │   ├─ [3246] 0xA7a8eAAA131dc4D2f70636F5F8796e640B119926::55b5190b(7564662d76312e310000000000000000000000000000000000000000000000000000000000000000000000006733d110a59dc160b5c8093066a7f5103885196f) [delegatecall]
    │   │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000001
    │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000001
    │   │   │   │   ├─ [3000] PRECOMPILES::ecrecover(0x8b9e9727843f84ccc91c0597d691d6605a1747bc2d35a5d80ed49bae125b3559, 27, 18062647626320149720686750389925445179000734462126404388533040417546752343801, 50454962982126875055591883219065593480805620376717083982408678482645524954874) [staticcall]
    │   │   │   │   │   └─ ← [Return] 0x00000000000000000000000093b502d3eb45b9eae948f8fca01e64d9c0ba538a
    │   │   │   │   ├─ [3642] 0x996520f9717f6141e53D8083168027d7834c172f::55b5190b(7564662d76312e3100000000000000000000000000000000000000000000000000000000000000000000000093b502d3eb45b9eae948f8fca01e64d9c0ba538a) [staticcall]
    │   │   │   │   │   ├─ [3246] 0xA7a8eAAA131dc4D2f70636F5F8796e640B119926::55b5190b(7564662d76312e3100000000000000000000000000000000000000000000000000000000000000000000000093b502d3eb45b9eae948f8fca01e64d9c0ba538a) [delegatecall]
    │   │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000001
    │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000001
    │   │   │   │   ├─ [3000] PRECOMPILES::ecrecover(0x58a2d42e31439b65105206f2c0eaf9da88c41c7ca83b26422134baee5517faa0, 27, 66151943366697264661083307274467456252907404044355893425437843030218939695203, 19430898983218506555122872121129293766952693229336645534639974540211705806135) [staticcall]
    │   │   │   │   │   └─ ← [Return] 0x000000000000000000000000be524616e96bb4b62cce8034ab6bea8f2505b55a
    │   │   │   │   ├─ [3642] 0x996520f9717f6141e53D8083168027d7834c172f::55b5190b(7564662d76312e31000000000000000000000000000000000000000000000000000000000000000000000000be524616e96bb4b62cce8034ab6bea8f2505b55a) [staticcall]
    │   │   │   │   │   ├─ [3246] 0xA7a8eAAA131dc4D2f70636F5F8796e640B119926::55b5190b(7564662d76312e31000000000000000000000000000000000000000000000000000000000000000000000000be524616e96bb4b62cce8034ab6bea8f2505b55a) [delegatecall]
    │   │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000001
    │   │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000001
    │   │   │   │   └─ ← [Return] 0x00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf
    │   │   │   └─ ← [Return] 0x00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf
    │   │   ├─  emit topic 0: 0xc721ed5888a17a766f8018cb6748b49a685bdec1837b10b49c8c56de9e4d5618
    │   │   │           data: 0x000000000000000000000000bd0afee88b7fcee6139467700d6f40f13feda7394254432f55534400000000000000000000000000000000000000000000000000
    │   │   └─ ← [Return] 0x00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf
    │   └─ ← [Return] 0x00000000000000000000000000000000000000000000103d091c76140eff9a150000000000000000000000000000000000000000000000000000000067f3bdcf
    └─ ← [Stop] 


Transaction successfully executed.
Gas used: 163365
PreviousFetch Data via Pull Model (PAYG)NextSolana Smart Contracts

Last updated 1 month ago

Was this helpful?

To deploy your contract on testnet, you'll need ETH eth_sepolia testnet tokens. You can obtain funds from public faucets (, , , , ).

Option 1
Option 2
Option 3
Option 4
Option 5