Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Feat/opensea Integrate Opensea Actions to Agentkit - #325

Closed
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea
Closed

Feat/opensea Integrate Opensea Actions to Agentkit#325
Elkhan-Isayev wants to merge 5 commits into
coinbase:mainfrom
mahammadZeynalov:feat/opensea

Conversation

@Elkhan-Isayev

@Elkhan-IsayevElkhan-Isayev commented Feb 9, 2025

Copy link
Copy Markdown

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@cb-heimdall

cb-heimdall commented Feb 9, 2025

Copy link
Copy Markdown

🟡 Heimdall Review Status

RequirementStatusMore Info
Reviews 🟡 -1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
2 if repo is sensitive0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified1
Sum2

@Elkhan-IsayevElkhan-Isayev changed the title Feat/openseaFeat/opensea Integrate Opensea Actions to AgentkitFeb 9, 2025
@Elkhan-Isayev

Copy link
Copy Markdown
Author

OpenSea Action Provider for AgentKit

🚀 Overview
We are enhancing Coinbase's chat system with seamless OpenSea integration, enabling users to effortlessly browse their NFTs, select assets, and list them—all within the chat interface. This integration makes NFT trading more intuitive, accessible, and streamlined.

File Structure

agentkit/src/action-providers/opensea/
├── openSeaActionProvider.ts # Main provider implementation
├── openSeaActionProvider.test.ts # Test suite
├── schemas.ts # Schema for listing an NFT on OpenSea
└── index.ts # Public exports

Core Features

  1. List an NFT Action
    @CreateAction({ name: "list_nft" })
    This tool allows users to list an NFT on OpenSea. It takes the token ID, contract address, and listing price as input.

  2. Fetch NFTs of a Specific Wallet Address
    @CreateAction({ name: "get_nfts_by_account" })
    This tool fetches all NFTs associated with a given wallet address.

Technical Details

  • viemwalletprovider: Handles wallet interaction
  • openseasdk: Provides marketplace interaction
  • sepolia: Facilitates interaction over the testnet

This integration ensures that AI agents can interact with OpenSea via a secure and type-safe interface, simplifying the process for users and enabling efficient NFT trading within the chat system.

@Elkhan-Isayev

Copy link
Copy Markdown
Author

Issue ticked id: #300

@0xRAG0xRAG added action provider New action provider needs review PR / issue needs review apple labels Feb 10, 2025

@0xRAG0xRAG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution @Elkhan-Isayev, this is an exciting addition! Please review and address my feedback. Also, it would be great if you could add screenshots of the action working as expected.

Comment threadpackage.json
"typescript": "^5.4.5"
},
"dependencies": {
"opensea-js": "^7.1.15"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import { z } from "zod";
import { ActionProvider } from "../actionProvider";
import { CreateAction } from "../actionDecorator";
import { OpenSeaSDK, Chain } from "opensea-js"; // Assuming an OpenSea SDK is available

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove this comment

*/
export class OpenSeaActionProvider extends ActionProvider {
private readonly client: OpenSeaSDK;
private readonly walletProvider: ViemWalletProvider;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest extending ViemWalletProvider which will configure a PublicClient / WalletClient. Then you'll also be able to remove the walletPrivateKey config parameter

*/
export interface OpenSeaActionProviderConfig {
apiKey?: string;
walletPrivateKey: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment below about removing this

Comment on lines +39 to +43
/*
* if (!config.apiKey) {
* throw new Error("OPENSEA_API_KEY is not configured.");
* }
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

})
async listNFT(args: z.infer<typeof OpenSeaListNFTSchema>): Promise<string> {
try {
const expirationTime = Math.round(Date.now() / 1000 + 60 * 60 * 24);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the expiration be user-configurable?


return `Successfully listed NFT:\n${JSON.stringify(response)}`;
} catch (error) {
console.log("response: ", error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove

"OPENAI_API_KEY",
"CDP_API_KEY_NAME",
"CDP_API_KEY_PRIVATE_KEY",
"WALLET_PRIVATE_KEY",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove, see comment in openSeaActionProvider.ts

apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"),
cdpWalletData: walletDataStr || undefined,
networkId: process.env.NETWORK_ID || "base-sepolia",
networkId: process.env.NETWORK_ID || "ethereum-sepolia",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert – fallback value should remain base-sepolia

Comment on lines +108 to +110
openSeaActionProvider({
walletPrivateKey: process.env.WALLET_PRIVATE_KEY!,
}),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should an apiKey be passed in here?

@0xRAG0xRAG added changes requested PR / Issue has changes requested typescript and removed needs review PR / issue needs review labels Feb 11, 2025
@phdargen

phdargen commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Has been implemented in #261, can be closed @CarsonRoscoe together with issue #300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action providerNew action providerapplechanges requestedPR / Issue has changes requestedtypescript

Development

Successfully merging this pull request may close these issues.

6 participants

@Elkhan-Isayev@cb-heimdall@phdargen@0xRAG@CarsonRoscoe@mahammadZeynalov