Skip to content

[SDK] Engine search transactions and batch transaction support #7190

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

Conversation

joaquim-verges
Copy link
Member

@joaquim-verges joaquim-verges commented May 29, 2025


PR-Codex overview

This PR focuses on enhancing the Engine functionality by introducing server wallet management, transaction searching, and batch transaction support.

Detailed summary

  • Added Engine.createServerWallet() for creating server wallets.
  • Added Engine.getServerWallets() to list existing server wallets.
  • Introduced Engine.searchTransactions() for searching transactions.
  • Implemented serverWallet.enqueueBatchTransaction() for batch transactions.
  • Improved error handling in server wallet transactions.
  • Updated the waitForTransactionHash function to include detailed error reporting.
  • Modified tests to cover new server wallet and transaction functionalities.

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Summary by CodeRabbit

  • New Features

    • Added transaction search functionality with flexible filters and pagination.
    • Introduced batch transaction support for enqueuing and sending multiple transactions together.
    • Added server wallet creation and listing capabilities.
    • Enhanced transaction confirmation waiting with improved error handling.
  • Bug Fixes

    • Improved error reporting during server wallet transaction handling.
  • Tests

    • Added tests for transaction searching, batch transactions, and server wallet creation.
    • Added test for claiming tokens priced in ERC20 tokens in DropERC20 contracts.

Copy link

vercel bot commented May 29, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
docs-v2 ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 29, 2025 8:20pm
login ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 29, 2025 8:20pm
thirdweb_playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 29, 2025 8:20pm
thirdweb-www ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 29, 2025 8:20pm
wallet-ui ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 29, 2025 8:20pm

Copy link

changeset-bot bot commented May 29, 2025

🦋 Changeset detected

Latest commit: 46aa336

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
thirdweb Minor
@thirdweb-dev/engine Patch
@thirdweb-dev/wagmi-adapter Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link
Contributor

coderabbitai bot commented May 29, 2025

Walkthrough

This update enhances the Engine with server wallet management, transaction search, and batch transaction support. It introduces methods to create and list server wallets, search transactions with flexible filters and pagination, and enqueue or send multiple transactions as a batch. The transaction waiting logic is refactored into a dedicated module, and tests for these features are added.

Changes

Files / Areas Change Summary
.changeset/engine-enhancements.md Documents new Engine features: server wallet management, transaction search, and batch transaction support.
packages/thirdweb/src/engine/search-transactions.ts Adds searchTransactions function and SearchTransactionsArgs type for flexible transaction searches.
packages/thirdweb/src/engine/server-wallet.ts Adds batch transaction methods (enqueueBatchTransaction, sendBatchTransaction), updates enqueue logic, and improves error handling.
packages/thirdweb/src/engine/wait-for-tx-hash.ts Introduces waitForTransactionHash function for polling transaction status and handling errors.
packages/thirdweb/src/engine/get-status.ts Removes waitForTransactionHash function; retains only status fetching logic.
packages/thirdweb/src/engine/index.ts Updates exports: moves waitForTransactionHash, adds searchTransactions and its type, and server wallet APIs.
packages/thirdweb/src/engine/server-wallet.test.ts Adds tests for server wallet creation, transaction search, and batch transaction enqueue/send scenarios.
packages/thirdweb/src/extensions/erc20/drop20.test.ts Adds test for claiming tokens with ERC20 pricing, using new minting and approval utilities.
packages/engine/src/client/types.gen.ts Makes operation optional in transaction filters; adds types for account management API endpoints.
packages/engine/src/client/sdk.gen.ts Adds listAccounts and createAccount SDK functions for managing engine server wallets.
packages/thirdweb/src/engine/create-server-wallet.ts Adds createServerWallet function to create server wallets via the engine API.
packages/thirdweb/src/engine/list-server-wallets.ts Adds getServerWallets function to list all server wallets for a client.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Engine
    participant ServerWallet

    Client->>ServerWallet: enqueueBatchTransaction([tx1, tx2, ...])
    ServerWallet->>Engine: Send batch transaction request
    Engine-->>ServerWallet: Return batch transaction ID(s)
    ServerWallet-->>Client: Return first transaction ID

    Client->>ServerWallet: sendBatchTransaction([tx1, tx2, ...])
    ServerWallet->>Engine: Send batch transaction request
    Engine-->>ServerWallet: Return batch transaction ID(s)
    ServerWallet->>Engine: waitForTransactionHash(transactionId)
    Engine-->>ServerWallet: Transaction confirmed or failed
    ServerWallet-->>Client: Return transaction hash or error

    Client->>Engine: searchTransactions(filters, pageSize, page)
    Engine-->>Client: Return filtered transaction list
Loading

Possibly related PRs

  • thirdweb-dev/js#7145: Modifies server wallet transaction handling focusing on bigint serialization; related through server wallet transaction processing enhancements.

Warning

Review ran into problems

🔥 Problems

Errors were encountered while retrieving linked issues.

Errors (1)
  • TEAM-0000: Entity not found: Issue - Could not find referenced Issue.
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • 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 explain this code block.
    • @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 explain its main purpose.
    • @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.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @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.

@joaquim-verges joaquim-verges marked this pull request as ready for review May 29, 2025 00:28
@joaquim-verges joaquim-verges requested review from a team as code owners May 29, 2025 00:28
@github-actions github-actions bot added packages SDK Involves changes to the thirdweb SDK labels May 29, 2025
Copy link
Member Author


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@joaquim-verges joaquim-verges changed the title [Engine] Add search transactions and batch transaction support [SDK] Engine search transactions and batch transaction support May 29, 2025
@joaquim-verges joaquim-verges force-pushed the _Engine_Add_search_transactions_and_batch_transaction_support branch from 39b77f0 to cb9786f Compare May 29, 2025 00:30
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: 2

🧹 Nitpick comments (5)
packages/thirdweb/src/extensions/erc20/drop20.test.ts (1)

145-145: Fix variable name typo.

There's a typo in the variable name erc20ContractAddres - it should be erc20ContractAddress.

-      const erc20ContractAddres = await deployERC20Contract({
+      const erc20ContractAddress = await deployERC20Contract({

Also update the usage on lines 155 and 183:

-        address: erc20ContractAddres,
+        address: erc20ContractAddress,
-              currencyAddress: erc20ContractAddres,
+              currencyAddress: erc20ContractAddress,
packages/thirdweb/src/engine/wait-for-tx-hash.ts (1)

36-75: Robust polling implementation with comprehensive error handling.

The polling logic is well-implemented with:

  • Proper timeout checking in the while loop condition
  • Comprehensive status handling for FAILED, CONFIRMED, and pending states
  • Detailed error messages for different failure scenarios
  • Appropriate 1-second polling interval to avoid excessive API calls
  • Proper return structure matching WaitForReceiptOptions type

The error handling covers:

  • Transaction failures with error details
  • Reverted transactions with revert data
  • Timeout scenarios with clear messaging

Minor suggestion for consistency:

Consider extracting the polling interval (1000ms) as a configurable parameter or named constant for better maintainability.

+const POLLING_INTERVAL_MS = 1000;
 
 export async function waitForTransactionHash(args: {
   client: ThirdwebClient;
   transactionId: string;
   timeoutInSeconds?: number;
+  pollingIntervalMs?: number;
 }): Promise<WaitForReceiptOptions> {
   // ... existing code ...
   
   default: {
     // wait for the transaction to be confirmed
-    await new Promise((resolve) => setTimeout(resolve, 1000));
+    await new Promise((resolve) => setTimeout(resolve, args.pollingIntervalMs ?? POLLING_INTERVAL_MS));
   }
packages/thirdweb/src/engine/search-transactions.ts (1)

132-134: Consider returning empty array instead of throwing for no results.

Throwing an error when no transactions match the filters might not be the expected behavior. Search operations typically return empty results rather than errors when no matches are found.

-  if (!data) {
-    throw new Error(`No transactions found with filters ${stringify(filters)}`);
-  }
-
-  return data;
+  return data || [];
packages/thirdweb/src/engine/server-wallet.ts (2)

167-176: Simplify redundant validation logic.

The validation logic has redundant checks. The length check is sufficient, and the additional null check for firstTransaction is unnecessary since we've already verified the array isn't empty.

  const enqueueTx = async (transaction: SendTransactionOption[]) => {
    if (transaction.length === 0) {
      throw new Error("No transactions to enqueue");
    }
-    const firstTransaction = transaction[0];
-    if (!firstTransaction) {
-      throw new Error("No transactions to enqueue");
-    }
-    const chainId = firstTransaction.chainId;
+    const chainId = transaction[0].chainId;

232-238: Extract duplicate transaction ID validation logic.

The logic for extracting the first transaction ID and throwing an error if none exists is duplicated. Consider extracting this into a helper function.

Add this helper function before the return statement:

+  const getFirstTransactionId = (transactionIds: string[]) => {
+    const transactionId = transactionIds[0];
+    if (!transactionId) {
+      throw new Error("No transactionId returned from engine");
+    }
+    return transactionId;
+  };
+
  return {

Then update both methods:

      const transactionIds = await enqueueTx([serializedTransaction]);
-      const transactionId = transactionIds[0];
-      if (!transactionId) {
-        throw new Error("No transactionId returned from engine");
-      }
-      return { transactionId };
+      return { transactionId: getFirstTransactionId(transactionIds) };
      const transactionIds = await enqueueTx(serializedTransactions);
-      const transactionId = transactionIds[0];
-      if (!transactionId) {
-        throw new Error("No transactionId returned from engine");
-      }
+      const transactionId = getFirstTransactionId(transactionIds);
      return { transactionId };

Also applies to: 256-262

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 0731831 and cb9786f.

📒 Files selected for processing (8)
  • .changeset/engine-enhancements.md (1 hunks)
  • packages/thirdweb/src/engine/get-status.ts (0 hunks)
  • packages/thirdweb/src/engine/index.ts (1 hunks)
  • packages/thirdweb/src/engine/search-transactions.ts (1 hunks)
  • packages/thirdweb/src/engine/server-wallet.test.ts (2 hunks)
  • packages/thirdweb/src/engine/server-wallet.ts (6 hunks)
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts (3 hunks)
💤 Files with no reviewable changes (1)
  • packages/thirdweb/src/engine/get-status.ts
🧰 Additional context used
🧬 Code Graph Analysis (2)
packages/thirdweb/src/engine/wait-for-tx-hash.ts (4)
packages/thirdweb/src/engine/index.ts (2)
  • waitForTransactionHash (11-11)
  • getTransactionStatus (7-7)
packages/thirdweb/src/exports/thirdweb.ts (2)
  • ThirdwebClient (26-26)
  • Hex (261-261)
packages/thirdweb/src/engine/get-status.ts (1)
  • getTransactionStatus (74-118)
packages/thirdweb/src/exports/utils.ts (1)
  • stringify (165-165)
packages/thirdweb/src/extensions/erc20/drop20.test.ts (2)
packages/thirdweb/src/exports/thirdweb.ts (2)
  • getContract (69-69)
  • sendAndConfirmTransaction (140-140)
packages/thirdweb/src/exports/utils.ts (1)
  • resolvePromisedValue (155-155)
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Unit Tests
  • GitHub Check: Lint Packages
  • GitHub Check: Size
  • GitHub Check: Build Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (13)
packages/thirdweb/src/extensions/erc20/drop20.test.ts (3)

14-14: Import addition looks good.

The toWei import is properly used in the new test for precise amount comparisons.


23-24: New utility imports are correctly added.

Both getApprovalForTransaction and mintTo are appropriately imported and used in the new ERC20 price test case.


140-227: Excellent test coverage for ERC20-priced token claims.

This test comprehensively validates the ERC20 payment flow for token claims:

  1. ✅ Deploys separate ERC20 contract for payment currency
  2. ✅ Mints test tokens to the claiming account
  3. ✅ Sets claim conditions with ERC20 currency address
  4. ✅ Verifies correct ERC20 value calculation (2 tokens × 0.01 = 0.02)
  5. ✅ Handles approval workflow for ERC20 spending
  6. ✅ Confirms both token claim success and payment deduction

The test logic is sound and provides good coverage of the ERC20 payment functionality. The assertions properly verify both sides of the transaction - that tokens were received and that payment was correctly deducted.

packages/thirdweb/src/engine/index.ts (1)

11-15:

✅ Verification successful

LGTM! Export reorganization looks good.

The export changes properly reflect the modularization of functionality:

  • waitForTransactionHash moved to a dedicated module for better separation of concerns
  • New search functionality exports added for the enhanced Engine capabilities

Let me verify that the referenced modules exist and contain the expected exports:


🏁 Script executed:

#!/bin/bash
# Verify the existence and exports of the referenced modules
echo "Checking wait-for-tx-hash.js module:"
fd -e ts "wait-for-tx-hash" --exec cat {} \; | head -30

echo -e "\n\nChecking search-transactions.js module:"
fd -e ts "search-transactions" --exec cat {} \; | head -30

Length of output: 2277


Verified exports — ready to merge

Both new modules exist with the expected exports:

  • waitForTransactionHash is defined and exported in wait-for-tx-hash.js.
  • searchTransactions and SearchTransactionsArgs are defined and exported in search-transactions.js.

All exports are correctly wired in index.ts.

packages/thirdweb/src/engine/server-wallet.test.ts (2)

99-107: Good test coverage for transaction search functionality.

The test properly validates the new Engine.searchTransactions method by:

  • Searching for a specific transaction ID using appropriate filters
  • Asserting the response structure and content
  • Verifying that exactly one transaction is returned matching the enqueued transaction ID

128-153: Comprehensive test for batch transaction functionality.

The test thoroughly validates the new batch transaction feature by:

  • Creating two distinct mint transactions
  • Enqueuing them as a batch using serverWallet.enqueueBatchTransaction
  • Waiting for completion using Engine.waitForTransactionHash
  • Asserting the presence of both transaction ID and hash

The test structure follows good practices and properly exercises the new functionality.

packages/thirdweb/src/engine/wait-for-tx-hash.ts (1)

26-35: Function signature and timeout setup look good.

The function properly:

  • Accepts required parameters with optional timeout configuration
  • Sets a reasonable default timeout of 5 minutes
  • Records start time for timeout calculations
.changeset/engine-enhancements.md (1)

1-75: Comprehensive and well-structured changeset documentation.

The changeset properly documents the new Engine enhancements with:

  • Appropriate minor version bump classification
  • Clear feature descriptions for both search and batch functionality
  • Practical code examples showing real usage patterns
  • Proper syntax and structure for the changeset format

The examples demonstrate:

  • Basic transaction search by ID
  • Advanced filtering with multiple criteria and logical operations
  • Batch transaction enqueuing with proper error handling
  • Integration with the wait functionality
packages/thirdweb/src/engine/search-transactions.ts (1)

18-108: Excellent documentation with comprehensive examples.

The JSDoc documentation is thorough and provides multiple practical examples covering different use cases including basic searches, combined filters, and pagination. This will greatly help developers understand how to use the function effectively.

packages/thirdweb/src/engine/server-wallet.ts (4)

22-22: Import update looks good.

The relocation of waitForTransactionHash to a dedicated module improves code organization.


57-60: New batch transaction method properly added to interface.

The enqueueBatchTransaction method is correctly added to the ServerWallet type with appropriate parameter types.


108-138: Excellent documentation for batch transaction usage.

The new documentation examples clearly demonstrate how to use the batch transaction functionality, including proper setup and polling for completion. This provides great guidance for developers.


274-284: New batch send method implementation looks solid.

The sendBatchTransaction method correctly handles multiple transactions and uses the same waiting logic as the single transaction method. The implementation is consistent with the existing patterns.

Copy link
Contributor

github-actions bot commented May 29, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 62.2 KB (+0.68% 🔺) 1.3 s (+0.68% 🔺) 186 ms (+106.19% 🔺) 1.5 s
thirdweb (cjs) 345.27 KB (+0.14% 🔺) 7 s (+0.14% 🔺) 613 ms (-0.43% 🔽) 7.6 s
thirdweb (minimal + tree-shaking) 5.69 KB (0%) 114 ms (0%) 49 ms (+462.14% 🔺) 163 ms
thirdweb/chains (tree-shaking) 531 B (0%) 11 ms (0%) 11 ms (+601.36% 🔺) 21 ms
thirdweb/react (minimal + tree-shaking) 19.54 KB (0%) 391 ms (0%) 56 ms (+304.49% 🔺) 447 ms

Copy link

codecov bot commented May 29, 2025

Codecov Report

Attention: Patch coverage is 12.50000% with 175 lines in your changes missing coverage. Please review.

Project coverage is 55.62%. Comparing base (4d38a7e) to head (46aa336).
Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
packages/thirdweb/src/engine/server-wallet.ts 1.47% 67 Missing ⚠️
packages/thirdweb/src/engine/wait-for-tx-hash.ts 4.34% 44 Missing ⚠️
...ackages/thirdweb/src/engine/search-transactions.ts 13.79% 25 Missing ⚠️
...ckages/thirdweb/src/engine/create-server-wallet.ts 14.81% 23 Missing ⚠️
...ackages/thirdweb/src/engine/list-server-wallets.ts 20.00% 16 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #7190      +/-   ##
==========================================
- Coverage   55.68%   55.62%   -0.06%     
==========================================
  Files         904      908       +4     
  Lines       58392    58530     +138     
  Branches     4122     4126       +4     
==========================================
+ Hits        32516    32558      +42     
- Misses      25770    25866      +96     
  Partials      106      106              
Flag Coverage Δ
packages 55.62% <12.50%> (-0.06%) ⬇️
Files with missing lines Coverage Δ
packages/thirdweb/src/engine/get-status.ts 11.36% <ø> (+5.68%) ⬆️
packages/thirdweb/src/engine/index.ts 100.00% <100.00%> (ø)
packages/thirdweb/src/insight/get-nfts.ts 88.84% <100.00%> (+2.17%) ⬆️
...ackages/thirdweb/src/engine/list-server-wallets.ts 20.00% <20.00%> (ø)
...ckages/thirdweb/src/engine/create-server-wallet.ts 14.81% <14.81%> (ø)
...ackages/thirdweb/src/engine/search-transactions.ts 13.79% <13.79%> (ø)
packages/thirdweb/src/engine/wait-for-tx-hash.ts 4.34% <4.34%> (ø)
packages/thirdweb/src/engine/server-wallet.ts 4.62% <1.47%> (-1.44%) ⬇️

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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

♻️ Duplicate comments (1)
packages/thirdweb/src/engine/server-wallet.ts (1)

177-183: Chain validation properly implemented.

This addresses the previous review comment about validating chain consistency for batch transactions. The implementation correctly ensures all transactions are on the same chain before processing.

🧹 Nitpick comments (1)
packages/thirdweb/src/engine/server-wallet.ts (1)

167-184: Simplify redundant validation checks.

The function has redundant validation for empty arrays and undefined transactions. The first check is sufficient.

-  const enqueueTx = async (transaction: SendTransactionOption[]) => {
-    if (transaction.length === 0) {
-      throw new Error("No transactions to enqueue");
-    }
-    const firstTransaction = transaction[0];
-    if (!firstTransaction) {
-      throw new Error("No transactions to enqueue");
-    }
+  const enqueueTx = async (transaction: SendTransactionOption[]) => {
+    if (transaction.length === 0) {
+      throw new Error("No transactions to enqueue");
+    }
+    const firstTransaction = transaction[0]!;
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between ea3e997 and 16958c9.

📒 Files selected for processing (8)
  • .changeset/engine-enhancements.md (1 hunks)
  • packages/thirdweb/src/engine/get-status.ts (0 hunks)
  • packages/thirdweb/src/engine/index.ts (1 hunks)
  • packages/thirdweb/src/engine/search-transactions.ts (1 hunks)
  • packages/thirdweb/src/engine/server-wallet.test.ts (2 hunks)
  • packages/thirdweb/src/engine/server-wallet.ts (6 hunks)
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts (3 hunks)
💤 Files with no reviewable changes (1)
  • packages/thirdweb/src/engine/get-status.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • packages/thirdweb/src/engine/server-wallet.test.ts
  • packages/thirdweb/src/engine/search-transactions.ts
  • packages/thirdweb/src/engine/index.ts
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts
  • .changeset/engine-enhancements.md
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: Size
  • GitHub Check: Build Packages
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: Lint Packages
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Unit Tests
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (6)
packages/thirdweb/src/engine/server-wallet.ts (6)

22-22: LGTM: Import path updated correctly.

The import has been properly updated to reflect the new module location for waitForTransactionHash.


57-60: LGTM: Type definition for batch transactions.

The new enqueueBatchTransaction method is properly typed to accept an array of PreparedTransaction objects and return a single transaction ID, which is appropriate for batch operations.


108-138: LGTM: Comprehensive documentation for batch transactions.

The JSDoc examples clearly demonstrate how to use the new batch transaction functionality, including preparation, enqueuing, and polling for results.


185-191: LGTM: Proper batch transaction serialization.

The execution options and parameters are correctly mapped from the transaction array, with appropriate type handling for optional values.


240-270: LGTM: Consistent implementation pattern.

Both enqueueTransaction and enqueueBatchTransaction methods follow the same pattern: serialize transactions, call enqueueTx, and extract the first transaction ID. The error handling is appropriate.


282-292: LGTM: Batch transaction sending implementation.

The sendBatchTransaction method correctly handles multiple transactions and waits for the batch completion using the first transaction ID, which is the expected behavior for batch operations.

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

♻️ Duplicate comments (1)
packages/thirdweb/src/engine/server-wallet.ts (1)

167-183: LGTM! Chain validation addresses previous review concern.

The implementation correctly validates that all transactions in a batch are on the same chain, which addresses the concern raised in the previous review. The error message is descriptive and includes the specific index where the mismatch occurs.

🧹 Nitpick comments (2)
packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts (1)

12-13: Consider making test assertions more resilient.

The hardcoded assertions (expecting exactly 3 NFTs and quantity 411n for ID 4) could be brittle if the test contract state changes. Consider using more flexible assertions or ensuring the test data is stable.

-    expect(nfts.length).toBe(3);
-    expect(nfts.find((nft) => nft.id === 4n)?.quantityOwned).toBe(411n);
+    expect(nfts.length).toBeGreaterThan(0);
+    const nftWithId4 = nfts.find((nft) => nft.id === 4n);
+    expect(nftWithId4).toBeDefined();
+    expect(nftWithId4?.quantityOwned).toBeGreaterThan(0n);

Alternatively, ensure the test contract data remains stable or document the expected state.

Also applies to: 22-23

packages/thirdweb/src/engine/server-wallet.ts (1)

247-270: Consider optimizing transaction serialization for better performance.

The current implementation processes transactions sequentially in a loop. Consider using Promise.all to serialize all transactions in parallel for better performance with large batches.

-      const serializedTransactions: SendTransactionOption[] = [];
-      for (const transaction of args.transactions) {
-        const [to, data, value] = await Promise.all([
-          transaction.to ? resolvePromisedValue(transaction.to) : null,
-          encode(transaction),
-          transaction.value ? resolvePromisedValue(transaction.value) : null,
-        ]);
-        serializedTransactions.push({
-          chainId: transaction.chain.id,
-          data,
-          to: to ?? undefined,
-          value: value ?? undefined,
-        });
-      }
+      const serializedTransactions = await Promise.all(
+        args.transactions.map(async (transaction) => {
+          const [to, data, value] = await Promise.all([
+            transaction.to ? resolvePromisedValue(transaction.to) : null,
+            encode(transaction),
+            transaction.value ? resolvePromisedValue(transaction.value) : null,
+          ]);
+          return {
+            chainId: transaction.chain.id,
+            data,
+            to: to ?? undefined,
+            value: value ?? undefined,
+          };
+        })
+      );
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 16958c9 and 07db3e7.

📒 Files selected for processing (13)
  • .changeset/engine-enhancements.md (1 hunks)
  • .changeset/stupid-adults-flow.md (1 hunks)
  • packages/engine/src/client/types.gen.ts (1 hunks)
  • packages/thirdweb/src/bridge/Chains.test.ts (1 hunks)
  • packages/thirdweb/src/engine/get-status.ts (0 hunks)
  • packages/thirdweb/src/engine/index.ts (1 hunks)
  • packages/thirdweb/src/engine/search-transactions.ts (1 hunks)
  • packages/thirdweb/src/engine/server-wallet.test.ts (2 hunks)
  • packages/thirdweb/src/engine/server-wallet.ts (6 hunks)
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts (3 hunks)
  • packages/thirdweb/src/insight/get-nfts.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • packages/thirdweb/src/engine/get-status.ts
✅ Files skipped from review due to trivial changes (1)
  • .changeset/stupid-adults-flow.md
🚧 Files skipped from review as they are similar to previous changes (6)
  • packages/thirdweb/src/engine/server-wallet.test.ts
  • packages/thirdweb/src/engine/search-transactions.ts
  • .changeset/engine-enhancements.md
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts
  • packages/thirdweb/src/engine/index.ts
🧰 Additional context used
🧬 Code Graph Analysis (2)
packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts (1)
packages/thirdweb/src/insight/get-nfts.ts (1)
  • getOwnedNFTs (32-89)
packages/thirdweb/src/engine/server-wallet.ts (5)
packages/thirdweb/src/exports/thirdweb.ts (2)
  • PreparedTransaction (104-104)
  • encode (126-126)
packages/thirdweb/src/wallets/interfaces/wallet.ts (1)
  • SendTransactionOption (23-26)
packages/thirdweb/src/exports/utils.ts (1)
  • resolvePromisedValue (155-155)
packages/thirdweb/src/engine/index.ts (1)
  • waitForTransactionHash (11-11)
packages/thirdweb/src/engine/wait-for-tx-hash.ts (1)
  • waitForTransactionHash (26-75)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (10)
packages/thirdweb/src/bridge/Chains.test.ts (1)

5-5: Good practice: Conditional test execution for authenticated tests.

This change properly gates tests that require secret keys behind an environment variable check, preventing failures in environments where credentials aren't available.

packages/thirdweb/src/insight/get-nfts.ts (1)

322-325: Well-implemented NFT enhancement with ownership quantity.

The addition of quantityOwned property correctly converts the balance to BigInt when available and maintains the optional property semantics. This enhancement aligns well with the function's existing return type signature.

packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts (1)

6-25: Comprehensive test coverage with good conditional execution.

The test suite properly covers both indexer and non-indexer scenarios for the getOwnedNFTs function. The conditional execution pattern is consistent with other test files.

packages/engine/src/client/types.gen.ts (1)

12-12: LGTM! Appropriate type enhancement for flexible filtering.

Making the operation property optional in TransactionsFilterValue correctly supports the new flexible transaction search functionality where logical operations may not always be required.

packages/thirdweb/src/engine/server-wallet.ts (6)

22-22: LGTM! Import updated to use dedicated module.

The import change from ./index.js to ./wait-for-tx-hash.js follows the refactoring mentioned in the summary where transaction waiting logic was moved to a dedicated module.


57-60: LGTM! Well-designed batch transaction type addition.

The enqueueBatchTransaction method signature is consistent with the existing enqueueTransaction method and appropriately accepts an array of transactions while returning a single transaction ID for the batch.


108-138: LGTM! Comprehensive documentation for batch transactions.

The documentation clearly explains how to use the new batch transaction functionality with practical examples, maintaining consistency with the existing documentation style.


184-210: LGTM! Well-implemented batch-capable transaction enqueuing.

The refactored enqueueTx function properly:

  • Handles both single and batch transactions
  • Maps transaction data to the expected API format
  • Returns an array of transaction IDs for flexibility
  • Maintains proper error handling

240-246: LGTM! Backward-compatible single transaction enqueuing.

The updated enqueueTransaction method maintains backward compatibility by wrapping the single transaction in an array and extracting the first ID from the result, with appropriate error handling.


271-292: LGTM! Consistent implementation of send methods.

Both sendTransaction and sendBatchTransaction methods follow the same pattern of enqueuing transactions and then waiting for confirmation, maintaining consistency in the API design.

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

♻️ Duplicate comments (1)
packages/thirdweb/src/engine/server-wallet.ts (1)

176-183: LGTM: Chain validation correctly addresses previous review feedback.

The chain validation logic properly ensures all transactions in a batch are on the same chain, which addresses the concern raised in the previous review comment. The error message is clear and includes helpful context.

🧹 Nitpick comments (2)
packages/thirdweb/src/engine/server-wallet.ts (2)

247-269: Consider refactoring to reduce code duplication.

The transaction serialization logic in enqueueBatchTransaction duplicates the serialization code from enqueueTransaction. This could be extracted into a shared helper function to improve maintainability.

Consider extracting the serialization logic:

+ const serializeTransaction = async (transaction: PreparedTransaction): Promise<SendTransactionOption> => {
+   const [to, data, value] = await Promise.all([
+     transaction.to ? resolvePromisedValue(transaction.to) : null,
+     encode(transaction),
+     transaction.value ? resolvePromisedValue(transaction.value) : null,
+   ]);
+   return {
+     chainId: transaction.chain.id,
+     data,
+     to: to ?? undefined,
+     value: value ?? undefined,
+   };
+ };

  enqueueBatchTransaction: async (args: {
    transactions: PreparedTransaction[];
  }) => {
-   const serializedTransactions: SendTransactionOption[] = [];
-   for (const transaction of args.transactions) {
-     const [to, data, value] = await Promise.all([
-       transaction.to ? resolvePromisedValue(transaction.to) : null,
-       encode(transaction),
-       transaction.value ? resolvePromisedValue(transaction.value) : null,
-     ]);
-     serializedTransactions.push({
-       chainId: transaction.chain.id,
-       data,
-       to: to ?? undefined,
-       value: value ?? undefined,
-     });
-   }
+   const serializedTransactions = await Promise.all(
+     args.transactions.map(serializeTransaction)
+   );

167-170: Add validation for maximum batch size.

Consider adding a maximum batch size limit to prevent potential performance issues or API limits with very large batches.

  const enqueueTx = async (transaction: SendTransactionOption[]) => {
    if (transaction.length === 0) {
      throw new Error("No transactions to enqueue");
    }
+   if (transaction.length > 100) { // or whatever the appropriate limit is
+     throw new Error(`Batch size too large: ${transaction.length}. Maximum allowed: 100`);
+   }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 07db3e7 and 10a69d3.

📒 Files selected for processing (16)
  • .changeset/engine-enhancements.md (1 hunks)
  • .changeset/stupid-adults-flow.md (1 hunks)
  • packages/engine/src/client/sdk.gen.ts (3 hunks)
  • packages/engine/src/client/types.gen.ts (2 hunks)
  • packages/thirdweb/src/bridge/Chains.test.ts (1 hunks)
  • packages/thirdweb/src/engine/create-server-wallet.ts (1 hunks)
  • packages/thirdweb/src/engine/get-status.ts (0 hunks)
  • packages/thirdweb/src/engine/index.ts (1 hunks)
  • packages/thirdweb/src/engine/list-server-wallets.ts (1 hunks)
  • packages/thirdweb/src/engine/search-transactions.ts (1 hunks)
  • packages/thirdweb/src/engine/server-wallet.test.ts (3 hunks)
  • packages/thirdweb/src/engine/server-wallet.ts (6 hunks)
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts (3 hunks)
  • packages/thirdweb/src/insight/get-nfts.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • packages/thirdweb/src/engine/get-status.ts
🚧 Files skipped from review as they are similar to previous changes (10)
  • .changeset/stupid-adults-flow.md
  • packages/thirdweb/src/insight/get-nfts.ts
  • packages/thirdweb/src/bridge/Chains.test.ts
  • packages/thirdweb/src/engine/server-wallet.test.ts
  • packages/thirdweb/src/engine/search-transactions.ts
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts
  • packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts
  • .changeset/engine-enhancements.md
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts
  • packages/thirdweb/src/engine/index.ts
🧰 Additional context used
🧬 Code Graph Analysis (1)
packages/engine/src/client/sdk.gen.ts (1)
packages/engine/src/client/types.gen.ts (4)
  • ListAccountsData (95-100)
  • ListAccountsResponse (120-121)
  • CreateAccountData (123-136)
  • CreateAccountResponse (156-157)
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: Unit Tests
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: Lint Packages
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Size
  • GitHub Check: Build Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (11)
packages/thirdweb/src/engine/server-wallet.ts (4)

22-22: LGTM: Import update for modular organization.

The import update from "./get-status.js" to "./wait-for-tx-hash.js" aligns with the refactoring mentioned in the AI summary, improving code modularity.


57-60: LGTM: Clean type definition for batch transactions.

The addition of enqueueBatchTransaction to the ServerWallet type provides a clear contract for batch transaction processing while maintaining consistency with the existing enqueueTransaction method.


108-137: LGTM: Comprehensive documentation for batch transactions.

The documentation examples clearly demonstrate how to use the new batch transaction functionality, including proper preparation, enqueueing, and polling patterns.


282-292: LGTM: Consistent implementation of batch send functionality.

The sendBatchTransaction method correctly mirrors the pattern of sendTransaction but for batches, maintaining consistency in the API design.

packages/thirdweb/src/engine/list-server-wallets.ts (1)

1-46: LGTM! Well-structured server wallet listing function.

The implementation follows established patterns in the codebase with proper error handling, clear documentation, and appropriate use of utility functions. The error messages are descriptive and provide good context for debugging.

packages/thirdweb/src/engine/create-server-wallet.ts (1)

1-57: LGTM! Consistent and well-implemented server wallet creation function.

The function follows the same high-quality patterns as the listing function, with proper error handling that includes contextual information (the label) in error messages. The documentation and type definitions are clear and comprehensive.

packages/engine/src/client/types.gen.ts (2)

12-12: Good improvement: Making operation field optional.

Making the operation field optional in TransactionsFilterValue provides better flexibility for simple filter use cases while maintaining backwards compatibility.


95-157: Well-structured account management types.

The new account management types (ListAccountsData, CreateAccountData, and their response types) follow established patterns and include appropriate optional fields like the vault access token header for account operations.

packages/engine/src/client/sdk.gen.ts (3)

10-11: Proper type imports for new account functions.

The type imports for CreateAccountData, CreateAccountResponse, ListAccountsData, and ListAccountsResponse are correctly added to support the new account management functions.

Also applies to: 20-21


55-76: Well-implemented listAccounts function.

The listAccounts function correctly implements the GET endpoint pattern with proper security configuration using the API key. The function signature and return types are consistent with other SDK functions.


78-103: Proper createAccount function implementation.

The createAccount function correctly implements the POST endpoint pattern with appropriate Content-Type header for JSON requests and proper security configuration. The function follows established patterns in the SDK.

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

♻️ Duplicate comments (1)
packages/thirdweb/src/engine/server-wallet.ts (1)

167-210: Excellent refactoring with proper validation.

The enqueueTx function has been well-refactored to handle batch transactions with comprehensive validation:

  • Empty array validation prevents invalid calls
  • Chain consistency validation ensures all transactions are on the same chain (addresses previous review feedback)
  • Proper error handling with descriptive messages
  • Clean mapping to engine format
🧹 Nitpick comments (1)
packages/thirdweb/src/engine/server-wallet.ts (1)

247-270: Batch transaction implementation follows good patterns.

The new enqueueBatchTransaction method is well-implemented with proper serialization and error handling. The method correctly processes multiple transactions and maintains API consistency by returning the first transaction ID.

Consider adding a comment or documentation note that clarifies this method returns only the first transaction ID from the batch, which users might find helpful for understanding the expected behavior.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between b652621 and 46aa336.

📒 Files selected for processing (16)
  • .changeset/engine-enhancements.md (1 hunks)
  • .changeset/stupid-adults-flow.md (1 hunks)
  • packages/engine/src/client/sdk.gen.ts (3 hunks)
  • packages/engine/src/client/types.gen.ts (2 hunks)
  • packages/thirdweb/src/bridge/Chains.test.ts (1 hunks)
  • packages/thirdweb/src/engine/create-server-wallet.ts (1 hunks)
  • packages/thirdweb/src/engine/get-status.ts (0 hunks)
  • packages/thirdweb/src/engine/index.ts (1 hunks)
  • packages/thirdweb/src/engine/list-server-wallets.ts (1 hunks)
  • packages/thirdweb/src/engine/search-transactions.ts (1 hunks)
  • packages/thirdweb/src/engine/server-wallet.test.ts (3 hunks)
  • packages/thirdweb/src/engine/server-wallet.ts (6 hunks)
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts (1 hunks)
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts (3 hunks)
  • packages/thirdweb/src/insight/get-nfts.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • packages/thirdweb/src/engine/get-status.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/thirdweb/src/extensions/erc1155/read/getOwnedNFTs.test.ts
🚧 Files skipped from review as they are similar to previous changes (13)
  • .changeset/stupid-adults-flow.md
  • packages/thirdweb/src/engine/list-server-wallets.ts
  • packages/thirdweb/src/engine/create-server-wallet.ts
  • packages/thirdweb/src/bridge/Chains.test.ts
  • packages/thirdweb/src/engine/server-wallet.test.ts
  • .changeset/engine-enhancements.md
  • packages/thirdweb/src/insight/get-nfts.ts
  • packages/thirdweb/src/extensions/erc20/drop20.test.ts
  • packages/thirdweb/src/engine/wait-for-tx-hash.ts
  • packages/thirdweb/src/engine/search-transactions.ts
  • packages/engine/src/client/types.gen.ts
  • packages/thirdweb/src/engine/index.ts
  • packages/engine/src/client/sdk.gen.ts
🧰 Additional context used
🧬 Code Graph Analysis (1)
packages/thirdweb/src/engine/server-wallet.ts (4)
packages/thirdweb/src/exports/thirdweb.ts (1)
  • encode (126-126)
packages/thirdweb/src/wallets/interfaces/wallet.ts (1)
  • SendTransactionOption (23-26)
packages/thirdweb/src/exports/utils.ts (1)
  • resolvePromisedValue (155-155)
packages/thirdweb/src/engine/wait-for-tx-hash.ts (1)
  • waitForTransactionHash (26-75)
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: Unit Tests
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Size
  • GitHub Check: Build Packages
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (6)
packages/thirdweb/src/engine/server-wallet.ts (6)

22-22: Import refactoring looks good.

The waitForTransactionHash function has been properly moved to its dedicated module, improving code organization.


57-59: Type extension for batch transactions is well-designed.

The new enqueueBatchTransaction method follows the same pattern as the existing enqueueTransaction method, maintaining API consistency.


214-246: Clean refactoring maintains backward compatibility.

The enqueueTransaction method has been effectively refactored to use the new batch-capable enqueueTx function while preserving all existing functionality and error handling.


271-281: Send transaction refactoring maintains functionality.

The sendTransaction method has been properly refactored to use the new enqueueTx function while preserving the same enqueue-and-wait behavior.


282-292: Batch send implementation needs behavioral clarification.

The sendBatchTransaction method follows good patterns but only waits for the first transaction hash. Consider whether users would expect to wait for all transactions in the batch to complete, or if waiting for just the first is the intended behavior.

If the current behavior is intentional, adding documentation about this would help set proper expectations.


108-137: Excellent documentation with practical examples.

The new batch transaction documentation is comprehensive and follows the existing documentation patterns perfectly. The examples clearly demonstrate the workflow for batch transactions, making it easy for developers to understand and implement.

@joaquim-verges joaquim-verges merged commit 861e623 into main May 29, 2025
23 of 25 checks passed
@joaquim-verges joaquim-verges deleted the _Engine_Add_search_transactions_and_batch_transaction_support branch May 29, 2025 20:19
@joaquim-verges joaquim-verges mentioned this pull request May 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
packages SDK Involves changes to the thirdweb SDK
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants