feat: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG
, '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: add action to list nfts on opensea (ts) - #261

Merged
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts
Mar 5, 2025
Merged

feat: add action to list nfts on opensea (ts)#261
CarsonRoscoe merged 6 commits into
coinbase:mainfrom
phdargen:opensea-ts

Conversation

@phdargen

Copy link
Copy Markdown
Contributor

Why? What?

Adds new OpenseaActionProvider to handle interactions with opensea.
So far only one action is implemented (list_nft) that creates a listing on opensea.
Additional actions like accept/create offer may be added in the future.

This implementation uses the opensea-js sdk that is added as new dependency and requires an opensea api key (https://docs.opensea.io/reference/api-overview). The new action is added in the chatbot.ts example, only if an OPENSEA_API_KEY is set.

The OpenSea SDK requires an ethers signer which is created when initialising OpenseaActionProvider with the privateKey to the account holding the NFT. In the chatbot.ts example, I extract the privateKey from the CdpWalletProvider. This is a bit of a hack but I couldn't find a way to directly use a EvmWalletProvider to create a ethers signer. Suggestions are welcome.

What changed?

Network support

  • Base
  • Base Sepolia
  • (Should be easy to extend to further evm networks)

Checklist

  • Changelog updated
  • Rebased against master

How has it been tested?

  • Unit tests
  • Agent tested, example prompt below (using gpt-4o-mini)
Prompt: deploy nft and mint to your wallet, decide all details
-------------------
Deployed NFT Collection My Unique NFT Collection:
- to address 0xFF145576D6266AEd8BD70172210d8ACa52CA236a
- on network base-sepolia.
Transaction hash: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
Transaction link: https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0
-------------------
-------------------
Successfully minted NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a to 0x51CD6e4d10F0282f48d13f4290960bF37f5eF151
-------------------
-------------------
The NFT collection "My Unique NFT Collection" has been successfully deployed with the symbol "MUNC". Here are the details:
- **NFT Contract Address**: [0xFF145576D6266AEd8BD70172210d8ACa52CA236a](https://sepolia.basescan.org/tx/0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0) - **Transaction Hash**: 0x70f5bf1be168238a5b70b630462fb1de6e493fa89ecb982616a9ffd774e162e0 - **Network**: Base Sepolia Additionally, an NFT has been successfully minted to your wallet. If you need any further assistance, let me know!
-------------------
Prompt: list this nft with tokenid 0 for 1 eth on opensea
-------------------
Successfully listed NFT 0xFF145576D6266AEd8BD70172210d8ACa52CA236a token 0 for 1 ETH, expiring in 90 days. Listing on OpenSea: https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0.
-------------------
The NFT with token ID `0` has been successfully listed for **1 ETH** on OpenSea. Here are the details:
- **Listing Link**: [View Listing on OpenSea](https://testnets.opensea.io/assets/base_sepolia/0xFF145576D6266AEd8BD70172210d8ACa52CA236a/0)
- **Expiration**: 90 days

@cb-heimdall

cb-heimdall commented Feb 5, 2025

Copy link
Copy Markdown

✅ Heimdall Review Status

RequirementStatusMore Info
Reviews1/1
Denominator calculation
Show calculation
1 if user is bot0
1 if user is external0
From .codeflow.yml1
Additional review requirements
Show calculation
Max0
0
From CODEOWNERS0
Global minimum0
Max 1
1
1 if commit is unverified0
Sum1

@phdargen

Copy link
Copy Markdown
ContributorAuthor

The EstimateGasExecutionError bug was also fixed in #283.
Will rebase after first review.

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

I improved the provider setup such that a default provider is used and a private key is sufficient to setup OpenseaActionProvider

@John-peterson-coinbase

Copy link
Copy Markdown
Contributor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@phdargen

Copy link
Copy Markdown
ContributorAuthor

@phdargen please rebase onto latest master. The changes to action provider initialization LGTM

@John-peterson-coinbase Done!

@0xRAG0xRAG added in review PR / issue is in review typescript needs review PR / issue needs review and removed changes requested PR / Issue has changes requested in review PR / issue is in review labels Feb 13, 2025
@phdargen
phdargenforce-pushed the opensea-ts branch 2 times, most recently from 427113e to ef92687CompareFebruary 17, 2025 00:53
@phdargen

Copy link
Copy Markdown
ContributorAuthor

@murrlincoln please let me know when you had the time to review, then I will rebase again if needed (seems things are moving quickly)

Comment threadtypescript/agentkit/src/action-providers/opensea/README.md

@CarsonRoscoeCarsonRoscoe 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.

Please rebase against main, there have been a lot of changes over the last two weeks. I want to make sure it's up to date for my testing

Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated
Comment threadtypescript/agentkit/src/action-providers/opensea/openseaActionProvider.ts Outdated

@CarsonRoscoeCarsonRoscoe 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.

One feature #325 had over this was its get_nfts_by_account action. I believe it is good for the agent to be able to read the NFTs.

Can you give your action provider the ability to read an accounts NFT holdings? I believe the action is just wrapping getNFTsByAccount function from the SDK's API

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation wallet provider New wallet provider example New example agent needs triage labels Mar 4, 2025
Comment threadtypescript/agentkit/CHANGELOG.md Outdated
@phdargen

Copy link
Copy Markdown
ContributorAuthor

get_nfts_by_account

Added get_nfts_by_account action and tests. Also tested successfully with prompt.

@CarsonRoscoeCarsonRoscoe 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.

LGTM!

Thank you for the quick work. This is great

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

Labels

action providerNew action providerbananadocumentationImprovements or additions to documentationexampleNew example agentneeds reviewPR / issue needs reviewtypescriptwallet providerNew wallet provider

Development

Successfully merging this pull request may close these issues.

5 participants

@phdargen@cb-heimdall@John-peterson-coinbase@CarsonRoscoe@0xRAG