Skip to main content

Blockchain Data

This example shows how to load blockchain data, including NFT metadata and transactions for a contract address, via the sort.xyz SQL API.

You will need a free Sort API key, visiting sort.xyz to obtain one.

npm install @langchain/openai
import { SortXYZBlockchainLoader } from "langchain/document_loaders/web/sort_xyz_blockchain";
import { OpenAI } from "@langchain/openai";

/**
* See https://docs.sort.xyz/docs/api-keys to get your free Sort API key.
* See https://docs.sort.xyz for more information on the available queries.
* See https://docs.sort.xyz/reference for more information about Sort's REST API.
*/

/**
* Run the example.
*/
export const run = async () => {
// Initialize the OpenAI model. Use OPENAI_API_KEY from .env in /examples
const model = new OpenAI({ temperature: 0.9 });

const apiKey = "YOUR_SORTXYZ_API_KEY";
const contractAddress =
"0x887F3909C14DAbd9e9510128cA6cBb448E932d7f".toLowerCase();

/*
Load NFT metadata from the Ethereum blockchain. Hint: to load by a specific ID, see SQL query example below.
*/

const nftMetadataLoader = new SortXYZBlockchainLoader({
apiKey,
query: {
type: "NFTMetadata",
blockchain: "ethereum",
contractAddress,
},
});

const nftMetadataDocs = await nftMetadataLoader.load();

const nftPrompt =
"Describe the character with the attributes from the following json document in a 4 sentence story. ";
const nftResponse = await model.invoke(
nftPrompt + JSON.stringify(nftMetadataDocs[0], null, 2)
);
console.log(`user > ${nftPrompt}`);
console.log(`chatgpt > ${nftResponse}`);

/*
Load the latest transactions for a contract address from the Ethereum blockchain.
*/
const latestTransactionsLoader = new SortXYZBlockchainLoader({
apiKey,
query: {
type: "latestTransactions",
blockchain: "ethereum",
contractAddress,
},
});

const latestTransactionsDocs = await latestTransactionsLoader.load();

const latestPrompt =
"Describe the following json documents in only 4 sentences per document. Include as much detail as possible. ";
const latestResponse = await model.invoke(
latestPrompt + JSON.stringify(latestTransactionsDocs[0], null, 2)
);
console.log(`\n\nuser > ${nftPrompt}`);
console.log(`chatgpt > ${latestResponse}`);

/*
Load metadata for a specific NFT by using raw SQL and the NFT index. See https://docs.sort.xyz for forumulating SQL.
*/

const sqlQueryLoader = new SortXYZBlockchainLoader({
apiKey,
query: `SELECT * FROM ethereum.nft_metadata WHERE contract_address = '${contractAddress}' AND token_id = 1 LIMIT 1`,
});

const sqlDocs = await sqlQueryLoader.load();

const sqlPrompt =
"Describe the character with the attributes from the following json document in an ad for a new coffee shop. ";
const sqlResponse = await model.invoke(
sqlPrompt + JSON.stringify(sqlDocs[0], null, 2)
);
console.log(`\n\nuser > ${sqlPrompt}`);
console.log(`chatgpt > ${sqlResponse}`);
};

API Reference:


Help us out by providing feedback on this documentation page: