Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: nft plugin #2167

Merged
merged 95 commits into from
Jan 12, 2025
Merged

Conversation

tcm390
Copy link
Collaborator

@tcm390 tcm390 commented Jan 11, 2025

refactor #2163

This PR refactors the code to align with our codebase structure while ensuring that the core functionality remains unchanged.

Note: It appears that some functions within the NFTService are not yet implemented. However, the current refactored structure should provide the foundation for the author to implement the remaining functions in subsequent iterations.

image

@odilitime odilitime changed the title nft plugin feat: nft plugin Jan 12, 2025
@tcm390 tcm390 marked this pull request as ready for review January 12, 2025 06:36
@tcm390 tcm390 mentioned this pull request Jan 12, 2025
@wtfsayo wtfsayo self-requested a review January 12, 2025 15:12
@wtfsayo
Copy link
Member

wtfsayo commented Jan 12, 2025

@coderabbitai review

Copy link
Contributor

coderabbitai bot commented Jan 12, 2025

📝 Walkthrough

Walkthrough

This pull request introduces a comprehensive NFT Collections Plugin for the Eliza platform. The plugin adds sophisticated functionality for interacting with NFT collections, including market data retrieval, social analytics, trading capabilities, and advanced error handling. It spans multiple services, actions, and utility modules to provide a robust solution for NFT-related interactions.

Changes

File/Directory Change Summary
.gitignore Added eliza.sig to ignored files
agent/package.json Added @elizaos/plugin-nft-collections dependency
agent/src/index.ts Updated imports and added NFT collections plugin initialization
package.json Updated testing dependencies, added langdetect
packages/plugin-nft-collections/ New comprehensive plugin with multiple services, actions, and utilities

Finishing Touches

  • 📝 Generate Docstrings (Beta)

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 28

🧹 Nitpick comments (31)
packages/plugin-nft-collections/src/index.ts (1)

13-30: Externalize configuration settings

Configuration is hardcoded. Allow users to customize settings via environment variables or a config file.

packages/plugin-nft-collections/src/actions/sweep-floor.ts (1)

6-17: Enhance robustness of NFT details extraction.

The extractNFTDetails function may incorrectly parse quantity and address if multiple numbers or addresses are present. Improve parsing logic to accurately extract the intended values.

Consider using named capturing groups or more specific patterns in the regex.

packages/plugin-nft-collections/src/utils/error-handler.ts (2)

50-86: Refactor NFTErrorFactory to use simple functions

The NFTErrorFactory class contains only static methods. It's better to replace it with simple functions to simplify the code.

🧰 Tools
🪛 Biome (1.9.4)

[error] 50-86: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)


[error] 70-70: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 78-78: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


70-70: Avoid using this in static methods

Using this in static methods can be confusing since it refers to the class. Replace this with the class name NFTErrorFactory for clarity.

Also applies to: 78-78

🧰 Tools
🪛 Biome (1.9.4)

[error] 70-70: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

packages/plugin-nft-collections/src/actions/list-nft.ts (2)

30-37: Improve validation logic for user messages

The current validation may miss valid cases or match unintended ones. Consider using more robust parsing or regex patterns to enhance accuracy.


81-81: Validate listing price to ensure it's positive

Listing an NFT at 0 ETH might not be intended. Add validation to ensure the price is greater than zero or handle the default price appropriately.

packages/plugin-nft-collections/src/types.ts (1)

281-285: Ensure Consistent Timestamp Types Across Interfaces

In the NewsItem interface, timestamp is of type Date, while other interfaces use number for timestamps (e.g., UNIX timestamps). Consider standardizing the timestamp type across all interfaces for consistency.

packages/plugin-nft-collections/src/__tests__/reservoir.test.ts (1)

7-29: Add test cleanup

Add afterEach to clean up mocks and prevent test pollution.

 describe("ReservoirService", () => {
     const mockRuntime = {
         services: {
             get: vi.fn(),
         },
         messageManager: {
             createMemory: vi.fn(),
         },
         agentId: "00000000-0000-0000-0000-000000000000",
     } as unknown as IAgentRuntime;

     let service: ReservoirService;
     let cacheManager: MemoryCacheManager;
     let rateLimiter: RateLimiter;

     beforeEach(() => {
         cacheManager = new MemoryCacheManager();
         rateLimiter = new RateLimiter();
         service = new ReservoirService({
             cacheManager,
             rateLimiter,
         });
     });
+    
+    afterEach(() => {
+        vi.clearAllMocks();
+        cacheManager.clear();
+    });
packages/plugin-nft-collections/src/templates/nft-listing.ts (1)

22-28: Improve template string formatting

The success template could be more concise and safer.

-    }) => `Successfully created listing on ikigailabs.xyz:
-• Collection: ${typeof collection === "string" ? collection : collection.name} (${typeof collection === "string" ? collection : collection.address})
-• Token ID: ${tokenId}
-• Purchase Price: ${purchasePrice.toFixed(1)} ETH
-• Listing Price: ${listingPrice.toFixed(1)} ETH (${isPriceAutomatic ? "2x purchase price" : "user specified"})
-• Status: ${status}
-• Listing URL: ${marketplaceUrl}${transactionHash ? `\n• Transaction: ${transactionHash}` : ""}`,
+    }) => {
+        const collectionName = typeof collection === "string" ? collection : collection.name;
+        const collectionAddr = typeof collection === "string" ? collection : collection.address;
+        
+        return [
+            `Successfully created listing on ikigailabs.xyz:`,
+            `• Collection: ${collectionName} (${collectionAddr})`,
+            `• Token ID: ${tokenId}`,
+            `• Purchase Price: ${purchasePrice.toFixed(1)} ETH`,
+            `• Listing Price: ${listingPrice.toFixed(1)} ETH (${isPriceAutomatic ? "2x purchase price" : "user specified"})`,
+            `• Status: ${status}`,
+            `• Listing URL: ${marketplaceUrl}`,
+            transactionHash && `• Transaction: ${transactionHash}`,
+        ].filter(Boolean).join('\n');
+    },
packages/plugin-nft-collections/src/templates/floor-sweep.ts (1)

52-65: Simplify marketplace breakdown template

The marketplace breakdown template could be more robust and maintainable.

-    marketplaceBreakdown: (
-        marketplaces: Array<{
-            name: string;
-            floorPrice: number;
-            availableTokens: number;
-        }>
-    ) => `Floor prices across marketplaces:
-${marketplaces
-    .sort((a, b) => a.floorPrice - b.floorPrice)
-    .map(
-        (m) =>
-            `• ${m.name}: ${m.floorPrice} ETH (${m.availableTokens} available)`
-    )
-    .join("\n")}`,
+    marketplaceBreakdown: (marketplaces: Array<{
+        name: string;
+        floorPrice: number;
+        availableTokens: number;
+    }>) => {
+        if (!marketplaces?.length) return 'No marketplace data available';
+        
+        const sortedMarketplaces = [...marketplaces]
+            .sort((a, b) => a.floorPrice - b.floorPrice)
+            .map(m => `• ${m.name}: ${m.floorPrice.toFixed(4)} ETH (${m.availableTokens} available)`);
+            
+        return ['Floor prices across marketplaces:', ...sortedMarketplaces].join('\n');
+    },
packages/plugin-nft-collections/src/services/social-analytics.ts (2)

19-24: Implement placeholder methods

All methods currently return mock data. Implementation is needed for:

  • getSocialMetrics
  • getCommunityMetrics
  • analyzeSentiment
  • trackSocialPerformance

Would you like me to help create GitHub issues to track the implementation of these methods?

Also applies to: 26-35, 37-60, 62-83


11-17: Consider utilizing the cache for social metrics

The cacheManager is initialized but not used in any methods. Consider caching responses to reduce API calls.

 async getSocialMetrics(address: string): Promise<SocialMetrics> {
+    const cacheKey = `social_metrics:${address}`;
+    if (this.cacheManager) {
+        const cached = await this.cacheManager.get<SocialMetrics>(cacheKey);
+        if (cached) return cached;
+    }
     // Implementation will be added later
-    return {
+    const metrics = {
         lastUpdate: new Date().toISOString(),
     };
+    if (this.cacheManager) {
+        await this.cacheManager.set(cacheKey, metrics, 300); // Cache for 5 minutes
+    }
+    return metrics;
 }
packages/plugin-nft-collections/src/utils/response-enhancer.ts (1)

7-70: Refactor repetitive conditional blocks

Consider using a map of conditions to messages to reduce repetition.

+const KNOWLEDGE_PROMPTS = {
+    mentionsCollection: " Would you like to know more about specific NFT collections?",
+    mentionsFloorPrice: " I can provide information on floor prices for popular collections.",
+    // ... other mappings
+};
+
+return Object.entries(KNOWLEDGE_PROMPTS).reduce((acc, [key, prompt]) => {
+    if (nftKnowledge[key as keyof NFTKnowledge]) {
+        acc += prompt;
+    }
+    return acc;
+}, response);
packages/plugin-nft-collections/src/services/coingecko.ts (1)

26-48: Add retry mechanism for API failures

Consider implementing retry logic for failed API calls.

Consider using the RateLimiter class's executeWithRetry method for API calls.

packages/plugin-nft-collections/src/services/rate-limiter.ts (1)

90-97: Simplify isRateLimited method

The try-catch block can be simplified using the getRemainingPoints method.

 async isRateLimited(key: string): Promise<boolean> {
-    try {
-        await this.limiter.get(key);
-        return false;
-    } catch {
-        return true;
-    }
+    const points = await this.getRemainingPoints(key);
+    return points === 0;
 }
packages/plugin-nft-collections/src/templates/index.ts (2)

16-16: Consider making the marketplace configurable.

The marketplace is hardcoded to "ikigailabs". This might limit future extensibility.

-    "marketplace": "ikigailabs"
+    "marketplace": string

6-98: Consider extracting common template parts into reusable constants.

The templates share similar structures for message context and JSON response format. Consider extracting these into constants to improve maintainability.

Example:

const CONTEXT_TEMPLATE = `Given the recent messages and NFT information below:

{{recentMessages}}

{{nftInfo}}
`;

const JSON_WRAPPER = (schema: string) => `
Respond with a JSON markdown block containing only the extracted values:

\`\`\`json
${schema}
\`\`\`
`;
packages/plugin-nft-collections/src/constants/collections.ts (1)

40-53: Consider loading collection data from a configuration file.

Currently, collection data is hardcoded. Consider moving it to a separate configuration file for easier management.

packages/plugin-nft-collections/src/evaluators/nft-knowledge.ts (1)

30-81: Optimize repeated string checks using a lookup map.

The current implementation has many repeated string checks. Consider using a map for better maintainability and performance.

const KEYWORD_CATEGORIES = {
  collection: ['collection', 'nft'],
  floorPrice: ['floor price', 'floor'],
  // ... more categories
};

const extractedInfo = Object.entries(KEYWORD_CATEGORIES).reduce((acc, [key, keywords]) => ({
  ...acc,
  [`mentions${key.charAt(0).toUpperCase()}${key.slice(1)}`]: 
    keywords.some(keyword => content.includes(keyword))
}), {});
packages/plugin-nft-collections/src/tests/providers.test.ts (2)

41-53: Consider adding more diverse test data

The mock collection data could be expanded to include edge cases like zero values or extremely large numbers.


72-84: Avoid duplicating mock data

The test data is duplicated between "get top collections" and "get market stats" tests. Consider extracting it to a shared fixture.

+const mockCollection = {
+    name: "Test Collection",
+    address: "0x1234",
+    floorPrice: 1.5,
+    volume24h: 100,
+    marketCap: 1000,
+    holders: 500,
+    symbol: "TEST",
+    description: "Test NFT Collection",
+    imageUrl: "https://example.com/image.png",
+};

-mockNftService.getTopCollections.mockResolvedValueOnce([
-    {
-        name: "Test Collection",
-        address: "0x1234",
-        ...
-    },
-]);
+mockNftService.getTopCollections.mockResolvedValueOnce([mockCollection]);
packages/plugin-nft-collections/src/templates/market-stats.ts (1)

11-13: Add number formatting for better readability

Consider formatting large numbers with appropriate separators and decimal places.

-• Floor Price: ${collection.floorPrice} ETH
-• 24h Volume: ${collection.volume24h} ETH
-• Market Cap: ${collection.marketCap} ETH
+• Floor Price: ${collection.floorPrice.toFixed(3)} ETH
+• 24h Volume: ${collection.volume24h.toLocaleString()} ETH
+• Market Cap: ${collection.marketCap.toLocaleString()} ETH
packages/plugin-nft-collections/src/tests/actions.test.ts (2)

8-24: Consider using explicit types for mock objects.

The mock objects could benefit from stricter typing to catch potential issues during refactoring.

-        const mockRuntime = {
+        const mockRuntime: Partial<IAgentRuntime> = {
             services: {
                 get: vi.fn(),
             },
             messageManager: {
                 createMemory: vi.fn(),
             },
             agentId: "00000000-0000-0000-0000-000000000000",
-        } as unknown as IAgentRuntime;
+        };

31-59: Enhance validation test coverage.

Consider adding test cases for edge cases:

  • Messages with missing content
  • Messages with malformed NFT IDs
  • Messages with invalid ETH values
packages/plugin-nft-collections/src/tests/templates.test.ts (2)

14-40: Add more specific assertions for listing templates.

Consider adding assertions for:

  • Price formatting precision
  • Transaction hash format
  • URL format validation

70-148: Consider extracting test fixtures.

The market stats test data is quite large. Consider moving it to a separate fixtures file for better maintainability.

// fixtures/marketStats.ts
export const sampleMarketStats = {
  collection: {
    name: "Test Collection",
    // ... rest of the test data
  }
};
packages/plugin-nft-collections/src/constants/curated-collections.ts (3)

13-24: Strengthen schema validation rules.

Consider adding more specific validation rules for addresses and token IDs.

 export const CuratedCollectionSchema = z.object({
-    address: z.string(),
+    address: z.string().regex(/^0x[a-fA-F0-9]{40}$/),
     name: z.string(),
     category: CollectionCategory,
     creator: z.string().optional(),
     tokenIdRange: z
         .object({
-            start: z.string().optional(),
-            end: z.string().optional(),
+            start: z.string().regex(/^\d+$/).optional(),
+            end: z.string().regex(/^\d+$/).optional(),
         })
         .optional(),
 });

1770-1895: Consider memoizing frequently used helper functions.

Functions like getCollectionsByCategory and getCollectionsByCreator could benefit from memoization to improve performance when called repeatedly.

import memoize from 'lodash/memoize';

export const getCollectionsByCategory = memoize((category: CollectionCategory): CuratedCollection[] => {
    return CURATED_COLLECTIONS.filter(
        (collection) => collection.category === category
    );
});

31-1758: Consider moving collection data to separate files.

The large collection of NFT data would be more maintainable if split into separate files by category.

// collections/genArt.ts
export const genArtCollections: CuratedCollection[] = [...];

// collections/iconicGems.ts
export const iconicGemsCollections: CuratedCollection[] = [...];

// Import and combine in index.ts
export const CURATED_COLLECTIONS = [
    ...genArtCollections,
    ...iconicGemsCollections,
    // ...other categories
];
package.json (1)

48-49: Consider removing redundant test frameworks.

Both Jest and Vitest are present in the project. Consider standardizing on one testing framework to avoid confusion and maintenance overhead.

packages/plugin-nft-collections/README.md (1)

198-205: Add language specifiers to code blocks.

Add language specifiers to the code blocks to enable syntax highlighting.

-```
+```text
 Operation              Cold     Cached   Batch (100)
 Collection Data       300ms     50ms     2.5s
 Floor Price          150ms     25ms     1.2s
 Token Metadata       250ms     40ms     2.0s
 Market Stats         400ms     75ms     3.0s
 Social Metrics       350ms     60ms     2.8s

- +text
Resource Idle Light Heavy
CPU 0.5% 15% 40%
Memory 150MB 300MB 600MB
Requests/s 10 100 1000

Also applies to: 215-220

🧰 Tools
🪛 Markdownlint (0.37.0)

198-198: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7df280d and c09d8dd.

📒 Files selected for processing (42)
  • .gitignore (1 hunks)
  • agent/package.json (1 hunks)
  • agent/src/index.ts (8 hunks)
  • package.json (4 hunks)
  • packages/core/src/types.ts (1 hunks)
  • packages/plugin-evm/package.json (1 hunks)
  • packages/plugin-nft-collections/.eslintrc.json (1 hunks)
  • packages/plugin-nft-collections/.prettierrc (1 hunks)
  • packages/plugin-nft-collections/README.md (1 hunks)
  • packages/plugin-nft-collections/package.json (1 hunks)
  • packages/plugin-nft-collections/src/__tests__/reservoir.test.ts (1 hunks)
  • packages/plugin-nft-collections/src/actions/get-collections.ts (1 hunks)
  • packages/plugin-nft-collections/src/actions/list-nft.ts (1 hunks)
  • packages/plugin-nft-collections/src/actions/sweep-floor.ts (1 hunks)
  • packages/plugin-nft-collections/src/constants/collections.ts (1 hunks)
  • packages/plugin-nft-collections/src/constants/curated-collections.ts (1 hunks)
  • packages/plugin-nft-collections/src/evaluators/nft-knowledge.ts (1 hunks)
  • packages/plugin-nft-collections/src/index.ts (1 hunks)
  • packages/plugin-nft-collections/src/providers/nft-collections.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/cache-manager.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/coingecko.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/market-intelligence.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/rate-limiter.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/reservoir.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/security-manager.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/social-analytics.ts (1 hunks)
  • packages/plugin-nft-collections/src/templates/floor-sweep.ts (1 hunks)
  • packages/plugin-nft-collections/src/templates/index.ts (1 hunks)
  • packages/plugin-nft-collections/src/templates/market-stats.ts (1 hunks)
  • packages/plugin-nft-collections/src/templates/nft-listing.ts (1 hunks)
  • packages/plugin-nft-collections/src/templates/social-analytics.ts (1 hunks)
  • packages/plugin-nft-collections/src/tests/actions.test.ts (1 hunks)
  • packages/plugin-nft-collections/src/tests/providers.test.ts (1 hunks)
  • packages/plugin-nft-collections/src/tests/services.test.ts (1 hunks)
  • packages/plugin-nft-collections/src/tests/templates.test.ts (1 hunks)
  • packages/plugin-nft-collections/src/types.ts (1 hunks)
  • packages/plugin-nft-collections/src/utils/error-handler.ts (1 hunks)
  • packages/plugin-nft-collections/src/utils/performance.ts (1 hunks)
  • packages/plugin-nft-collections/src/utils/response-enhancer.ts (1 hunks)
  • packages/plugin-nft-collections/src/utils/validation.ts (1 hunks)
  • packages/plugin-nft-collections/tsconfig.json (1 hunks)
  • packages/plugin-nft-collections/vitest.config.ts (1 hunks)
✅ Files skipped from review due to trivial changes (7)
  • packages/plugin-evm/package.json
  • packages/plugin-nft-collections/.prettierrc
  • packages/plugin-nft-collections/tsconfig.json
  • packages/core/src/types.ts
  • .gitignore
  • packages/plugin-nft-collections/.eslintrc.json
  • packages/plugin-nft-collections/package.json
🧰 Additional context used
🪛 Biome (1.9.4)
agent/src/index.ts

[error] 198-198: Avoid the use of spread (...) syntax on accumulators.

Spread syntax should be avoided on accumulators (like those in .reduce) because it causes a time complexity of O(n^2).
Consider methods such as .splice or .push instead.

(lint/performance/noAccumulatingSpread)

packages/plugin-nft-collections/src/utils/error-handler.ts

[error] 50-86: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)


[error] 70-70: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 78-78: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

🪛 Markdownlint (0.37.0)
packages/plugin-nft-collections/README.md

198-198: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


215-215: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (12)
packages/plugin-nft-collections/src/actions/sweep-floor.ts (1)

71-85: Ensure result.steps exists before accessing it.

Accessing result.steps without validation may cause errors if executeBuy doesn't return the expected structure. Add checks to confirm result and its properties are defined.

packages/plugin-nft-collections/vitest.config.ts (1)

1-14: Configuration Looks Good

The Vitest configuration is well-defined and follows best practices.

packages/plugin-nft-collections/src/services/rate-limiter.ts (1)

77-79: Implement cleanup method

The cleanup method is currently empty. Consider implementing resource cleanup.

packages/plugin-nft-collections/src/tests/services.test.ts (2)

39-49: Add error handling test cases.

The API request test only covers the success case. Consider adding tests for:

  • API failures
  • Rate limiting scenarios
  • Cache hits/misses

71-76: Add input validation test cases.

The service methods should be tested with invalid inputs:

  • Invalid Ethereum addresses
  • Invalid time periods
  • Missing required parameters

Also applies to: 98-102, 104-109

packages/plugin-nft-collections/src/tests/actions.test.ts (1)

61-149: Well-structured handler tests with good error coverage!

The tests effectively cover the main success path and error scenarios, with proper mock responses and assertions.

packages/plugin-nft-collections/src/tests/templates.test.ts (2)

42-68: Comprehensive floor sweep template tests!

Good coverage of both successful and error scenarios with appropriate assertions.


237-269: Well-organized template string validation!

Good coverage of required placeholders across all template types.

package.json (2)

30-30: Testing framework dependencies look good!

The addition of Jest and its TypeScript dependencies with fixed versions ensures consistent testing across the project.

Also applies to: 39-39, 43-43


67-67: Verify langdetect package compatibility.

The addition of langdetect package might be useful for NFT metadata analysis, but let's ensure it's compatible with the current Node.js version (23.3.0).

✅ Verification successful

langdetect package compatibility verified

The package has no engine restrictions, making it compatible with Node.js 23.3.0.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if langdetect package is compatible with Node.js 23.3.0
rg -A 5 "\"engines\":|\"node\":" package.json

Length of output: 231


Script:

#!/bin/bash
# Query npm registry for langdetect package metadata
gh api \
  --method GET \
  -H "Accept: application/vnd.npm.install-v1+json" \
  '/repos/npm/registry-package/langdetect' | jq '.engines'

Length of output: 243


Script:

#!/bin/bash
# Query npm registry directly for langdetect package metadata
curl -s https://registry.npmjs.org/langdetect | jq '.versions."0.2.1".engines'

Length of output: 85

agent/package.json (1)

95-95: LGTM! NFT Collections plugin dependency added correctly.

The plugin is added as a workspace dependency, consistent with other plugins in the project.

packages/plugin-nft-collections/README.md (1)

1-1584: Excellent documentation!

The README is comprehensive and well-structured, covering all aspects of the plugin including features, configuration, security, and architecture. The inclusion of mermaid diagrams for visualizing architecture is particularly helpful.

🧰 Tools
🪛 Markdownlint (0.37.0)

198-198: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


215-215: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

agent/src/index.ts Show resolved Hide resolved
agent/src/index.ts Show resolved Hide resolved
packages/plugin-nft-collections/README.md Outdated Show resolved Hide resolved
wtfsayo and others added 4 commits January 12, 2025 21:06
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@wtfsayo
Copy link
Member

wtfsayo commented Jan 12, 2025

@coderabbitai review

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (4)
packages/plugin-nft-collections/src/actions/get-collections.ts (3)

9-12: Enhance the action description.

Consider adding more details about what kind of information is fetched (e.g., pricing, volume, trends).

-            "Fetches information about curated NFT collections on Ethereum",
+            "Fetches market data, trends, and statistics about curated NFT collections on Ethereum",

22-22: Type the options parameter.

Avoid using 'any' type as it bypasses TypeScript's type checking.

-            options: any,
+            options: Record<string, unknown>,

30-32: Enhance callback response structure.

Consider adding metadata to provide more context about the response.

-                callback({
-                    text: response,
-                });
+                callback({
+                    text: response,
+                    metadata: {
+                        type: 'nft_collections',
+                        timestamp: new Date().toISOString(),
+                    }
+                });
packages/plugin-nft-collections/README.md (1)

198-205: Add language specifiers to code blocks.

Add language specifiers to the code blocks for better syntax highlighting and documentation consistency.

-```
+```text
 Operation              Cold     Cached   Batch (100)
 Collection Data       300ms     50ms     2.5s
 ...
-```
+```text
 Resource    Idle    Light    Heavy
 CPU         0.5%    15%      40%
 ...

Also applies to: 215-220

🧰 Tools
🪛 Markdownlint (0.37.0)

198-198: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c09d8dd and 1d45efc.

📒 Files selected for processing (3)
  • packages/plugin-nft-collections/README.md (1 hunks)
  • packages/plugin-nft-collections/src/actions/get-collections.ts (1 hunks)
  • packages/plugin-nft-collections/src/services/security-manager.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/plugin-nft-collections/src/services/security-manager.ts
🧰 Additional context used
🪛 Markdownlint (0.37.0)
packages/plugin-nft-collections/README.md

198-198: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


215-215: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (10)
packages/plugin-nft-collections/src/actions/get-collections.ts (3)

1-7: LGTM! Clean imports and good use of dependency injection.


13-17: Enhance message validation.

The current validation is too permissive. Consider using a more specific regex pattern.

-            return message.content.text
-                .toLowerCase()
-                .includes("nft collections");
+            const pattern = /\b(show|list|get|fetch)\s+nft\s+collections\b/i;
+            return pattern.test(message.content.text);

56-162: Great set of examples!

The examples cover a wide range of natural language patterns and user intents.

packages/plugin-nft-collections/README.md (7)

1-46: Well-structured introduction and improvements section!

The introduction effectively communicates the plugin's purpose and capabilities, while the improvements section provides a clear breakdown of recent enhancements.


47-85: Comprehensive feature set with clear categorization!

The features are well-organized and provide a clear overview of the plugin's capabilities.


86-150: Clear installation and configuration instructions!

The section provides comprehensive setup guidance with both required and optional configurations.


151-192: Excellent usage examples with proper error handling!

The examples effectively demonstrate key functionality and proper error handling practices.


193-221: Comprehensive performance benchmarks with clear metrics!

The section provides valuable insights into response times and resource usage expectations.

🧰 Tools
🪛 Markdownlint (0.37.0)

198-198: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


215-215: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


222-246: Well-defined best practices covering crucial aspects!

The section provides valuable guidance on API key management, error handling, performance optimization, and data validation.


247-1584: Excellent architectural documentation with comprehensive implementation details!

The remaining sections provide thorough coverage of the system architecture, testing strategies, security considerations, trading capabilities, and caching mechanisms. The Mermaid diagrams effectively visualize the system components.

@tcm390 tcm390 enabled auto-merge January 12, 2025 16:14
@tcm390 tcm390 merged commit b3afa28 into elizaOS:develop Jan 12, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants