Changelog

Joaquim Verges

We just enabled EOA execution for server wallets, allowing you to self fund your own server wallets, and directly executing onchain transactions from them.

How to use EOA execution

Set type: "EOA" in your executionOptions and pass your server wallet EOA address (signer).

Remember to fund the EOA with some native currency on that chain!

curl -X POST "https://engine.thirdweb.com/v1/write/contract" \
-H "Content-Type: application/json" \
-H "x-secret-key: <your-project-secret-key>" \
-d '{
"executionOptions": {
"type": "EOA",
"from": "<your-EOA-server-wallet-address>",
"chainId": "84532"
},
"params": [
{
"contractAddress": "0x...",
"method": "function mintTo(address to, uint256 amount)",
"params": ["0x...", "100"]
}
]
}'

If your EOA runs out of funds, the transactions will be paused until you send some funds to it, then all transactions will resume automatically.

Happy building! 🛠️

Joaquim Verges

We just enabled EIP7702 for server wallets, resulting in 4x faster sponsored transactions from sending to confirming when compared to ERC4337 execution.

How to use 7702 execution

Simply pass your server wallet EOA address (signer), execution will automatically default to EIP7702 execution and sponsor gas for the transaction.

curl -X POST "https://engine.thirdweb.com/v1/write/contract" \
-H "Content-Type: application/json" \
-H "x-secret-key: <your-project-secret-key>" \
-d '{
"executionOptions": {
"from": "<your-EOA-server-wallet-address>",
"chainId": "84532"
},
"params": [
{
"contractAddress": "0x...",
"method": "function mintTo(address to, uint256 amount)",
"params": ["0x...", "100"]
}
]
}'

You can also explicitly enable it by passing type: "EIP7702" in the execution options. Other execution types are "ERC4337" and "EOA".

If you pass your smart contract wallet address, by default engine will use ERC4337 execution like before, no changes needed.

Take advantage of EIP7702 for your server wallets and let us know about your experience!

Greg

We've made significant improvements to the Payments (Universal Bridge) API's performance, improving average latency from 900ms to under 300ms. You can now get quotes, routes, token prices, and more in a third of the time. Our Payments API powers advanced user-centric UIs using our Payments Widgets, try them out here.

Manan Tank

We’ve redesigned the ERC20 contract page to improve usability, shareability, and conversion. This update is live for all ERC20 contracts - including the ones you deploy from thirdweb dashboard

The Buy Token section is now placed at the top, making it easier for users to purchase tokens immediately. This also makes the page ideal for sharing with your community or end users.

The Token Price Chart has been moved further down to prioritize key actions and reduce visual clutter.

Several visual enhancements offer a cleaner, more user-friendly experience.

Examples

Checkout the updated layout for some popular tokens

Jake Loo

Breaking Change: The Nebula API now requires a paid subscription plan. Free usage is limited to essential testing purposes.

What's Changed

  • Free Tier: Limited to 1 RPS and 3 RPM (for testing only)
  • Paid Plans Required: Production usage now requires one of the following plans:
    • Starter: 1 RPS, 10 RPM
    • Growth: 5 RPS, 100 RPM
    • Scale: 10 RPS, 500 RPM
    • Pro: 30 RPS, 1500 RPM
    • Custom: Reach out!

Next Steps

  • Review your current Nebula API usage and update your integration to handle the new rate limits
  • Select an appropriate plan on your team account on the dashboard

For questions about plan selection or enterprise needs, contact the thirdweb team.

Joaquim Verges

You can now use the Transaction API with just your project secret key.

When you create a new project, we now initialize a secure Vault automatically for you which lets you create server wallets and transact immediately with just your project secret key.

curl -X POST "https://engine.thirdweb.com/v1/write/contract" \
-H "Content-Type: application/json" \
-H "x-secret-key: <your-project-secret-key>" \
-d '{
"executionOptions": {
"from": "<your-server-wallet-address>",
"chainId": "84532"
},
"params": [
{
"contractAddress": "0x...",
"method": "function mintTo(address to, uint256 amount)",
"params": ["0x...", "100"]
}
]
}'

What changed

  • Before: Performing transactions with your server wallets required BOTH a project secret key (x-secret-key) AND a vault access token (x-vault-access-token).
  • After: You can now do server wallet transactions with ONLY your project secret key

Your project secret key is now all you need to access thirdweb infrastructure and your server wallets from your backends.

If you've already created a vault for your project, nothing changes, you can continue using your vault access tokens normally.

How it works

When you create a project, we generate a secret key that only you have access to. We do not store that secret key only a hash of it. At project creation time, we now generate a Vault access token, encrypt with your project secret key, and store it.

This lets you now interact with your vault as long as you pass your secret key to the thirdweb transaction API.

At any point, you can choose to take control of your own Vault keys by revoking the Vault keys from the vault tab. This will invalidate any previous keys and generate new ones that you can store those yourself.

Happy building!

Joaquim Verges

You can now search users by email, phone, id or address in your project or ecosystem by navigating to the Users tab.

Select the search criteria, type a value and hit search. Great for quickly finding user associated addresses or emails.

Happy building!

Toomas Oosalu

The v1/tokens endpoint in Insight API now supports sorting by various attributes.

New sort_by and sort_order query parameters have been added. The following attributes are supported:

  • token_address - sort tokens alphabetically
  • token_price - sort based on the USD price of the token
  • usd_value - sort based on the USD value of the token per wallet, meaning balance multiplied by the token price
  • balance - sort based on the balance of the token for a wallet

sort_order can be either asc or desc

Try it out on our playground!


Additionally, another parameter was added, called include_without_price . This is true by default to have all tokens included, but setting it to false will remove tokens that do not have price data in the response.

...

These additions make the API better suited to be used in wallet applications to show user balances and present the data in the most useful way to the user.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Joaquim Verges

Version 5.105 spans accross multiple patch releases. It introduces more flexible payment options, upgrades wallet connectivity, new eip-7702 session key capabilities and delivers a range of UI and developer‑experience refinements.

  • Payment widgets
    • New currency prop in payment widgets to control what currency to display (USD, EUR, JPY, etc)
    • New paymentMethods prop ("crypto" / "card") to control available methods
    • Optional showThirdwebBranding flag to hide the badge
    • Show all wallet tokens in payment flow, including low balance ones
    • Optimised token‑fetch logic and better large‑number handling
    • “Unsupported Token” fallback screen and sponsored‑gas handling
    • feePayer is now respected for choosing which party will pay the transfer fees (seller or user)
  • Wallet connectivity
    Migrated connection UI widgets and core functions to WalletConnect Universal Provider for faster, multi‑chain sessions on both web and react native platforms.
  • Session keys & admin safeguards
    Added createSessionKey extension for EIP‑7702 In‑App Wallets. This comes with fine grained session key permissions, from function selector to specific argument value to time bound and recurrent permissions. You can now for example add a session key which allows to spend 10 USDC per month.
  • Wallet & chain coverage
    • Frame Wallet added
    • Wallet definitions refreshed
    • Trex Testnet, Somnia Testnet and other core chains registered
  • Type & API updates
    • purchaseData now strictly typed
    • Upgraded to Engine v3 APIs
  • On‑ramp webhook parsing
    Universal Bridge can now parse on‑ramp webhooks for strongly typed webhook payloads.
  • PayEmbed deprecated
    Existing flows should migrate to newer widgets: BuyWidget, CheckoutWidget and TransactionWidget.
Toomas Oosalu

Insight API now supports two new features for NFT and token balance endpoints.

Contract Filters

v1/tokens and v1/nfts endpoints now supports filtering the balances of a wallet by contract addresses.

For tokens, you can add a token_address query filter.

For NFTs, you can use contract_address in the query params.

Both endpoints support multiple contract filters - e.g. ?contract_address=0x...&contract_address=0x...

Cross-Wallet Balances

v1/tokens and v1/nfts endpoints also added support for multiple owner_address query filters so you can get the balances of multiple wallets in the same query!

For example, to get the token balances of both vitalik.eth and barmstrong.eth you can make the following call to Insight

curl 'https://insight.thirdweb.com/v1/tokens?chain=1&metadata=true&include_native=true&limit=5&owner_address=vitalik.eth&owner_address=barmstrong.eth'

📖 Learn more about Insight - it’s open source and ready to power your

Firekeeper

EIP-7702 execution mode for In-App and Ecosystem Wallets is now available on Berachain Mainnet & Berachain Bepolia!

Berachain: RPC and Chain Settings
Use the best Berachain RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Berachain Bepolia: RPC and Chain Settings
Use the best Berachain Bepolia RPC and add to your wallet. Discover the chain ID, native token, explorers, and faucet options.

These are the chains we now support, if you'd like us to support more, reach out to support!

Mainnets Supported

  • Ethereum (Chain ID: 1)
  • Gnosis (Chain ID: 100)
  • BNB Smart Chain (BSC) (Chain ID: 56)
  • Optimism (Chain ID: 10)
  • Base (Chain ID: 8453)
  • Ink (Chain ID: 57073)
  • Unichain (Chain ID: 130)
  • Zora (Chain ID: 7777777)
  • Soneium (Chain ID: 1868)
  • Mode (Chain ID: 34443)
  • Scroll (Chain ID: 534352)
  • Arbitrum (Chain ID: 42161)
  • Berachain (Chain ID: 80094)

🧪 Testnets Supported

  • Sepolia (Ethereum) (Chain ID: 11155111)
  • Gnosis Chiado (Chain ID: 10200)
  • BSC Testnet (Chain ID: 97)
  • Optimism Sepolia (Chain ID: 11155420)
  • Base Sepolia (Chain ID: 84532)
  • Ink Sepolia (Chain ID: 763373)
  • Unichain Sepolia (Chain ID: 1301)
  • Zora Sepolia (Chain ID: 999999999)
  • Soneium Minato (Chain ID: 1946)
  • Mode Sepolia (Chain ID: 919)
  • Scroll Sepolia (Chain ID: 534351)
  • Arbitrum Sepolia (Chain ID: 421614)
  • Berachain Bepolia (Chain ID: 80069)
Prithvish Baidya

Engine Cloud exits beta with a complete architectural overhaul powered by our new Rust-based Engine Core. This update introduces simplified APIs, comprehensive transaction monitoring, and significant performance improvements.

🚀 What's New

Rust-Based Engine Core

Engine Cloud is now built on Engine Core, our new open-source Rust-based blockchain transaction infrastructure. The Engine Core repository is now public.

Key improvements include:

  • Sub-second API response times (< 40ms server latency for transactions, < 10ms for status)
  • Horizontal scaling through Redis-backed job queues with configurable worker pools
  • Memory safety and zero-cost abstractions from Rust
  • Improved nonce management and transaction batching
  • Enhanced error handling with detailed context

Changed Signing API

Signature endpoints now use a new signingOptions parameter that replaces the previous executionOptions structure across all signature routes.

Before:

{
"executionOptions": {
"from": "0x...",
"chainId": 137
}
}

After:

{
"signingOptions": {
"type": "eoa",
"from": "0x...",
"chainId": 137
}
}

ERC-4337 Smart Accounts support intelligent defaults with minimal configuration:

{
"signingOptions": {
"type": "ERC4337",
"signerAddress": "0x...",
"chainId": 137,
"entrypointVersion": "v0.7"
// Optional: smartAccountAddress, accountSalt, entrypointAddress, factoryAddress
}
}

When using thirdweb's default account factory, specifying entrypointVersion automatically configures the appropriate entrypoint and factory addresses:

  • v0.6: 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 (entrypoint), 0x85e23b94e7F5E9cC1fF78BCe78cfb15B81f0DF00 (factory)
  • v0.7: 0x0576a174D229E3cFA37253523E645A78A0C91B57 (entrypoint), 0x4bE0ddfebcA9A5A4a617dee4DeCe99E7c862dceb (factory)

The system automatically infers missing values when not explicitly provided, supporting both v0.6 and v0.7 standards.

Cleaner Response Format

Response handling is now more intuitive for single fallible operations like signMessage:

Before:

{
"result": {
"results": [
{
"success": true,
"data": "0x..."
},
{
"success": false,
"error": "Invalid signature"
}
]
}
}

After:

{
"result": [
{
"result": "0x..."
},
{
"error": "Invalid signature"
}
]
}

Activity Logs System

The new Activity Logs system provides visibility into transaction lifecycle and Engine operations:

  • Real-time status tracking from submission to confirmation
  • Detailed error context for failed transactions
  • Performance metrics including gas usage and timing
  • Debug information for troubleshooting

Access via dashboard or API:

GET /transactions/activity-logs?transactionId={queueId}

🔄 Migration Guide

TypeScript SDK Users

No breaking changes. Existing ServerWallet implementations continue working—simply upgrade your SDK version:

npm install thirdweb@5.105.2
const serverWallet = Engine.serverWallet({
address: "0x...", // your wallet address
chain: sepolia, // or your target chain
client: thirdwebClient,
vaultAccessToken: "your_vault_token",
});
// All existing methods work identically
const result = await serverWallet.sendTransaction(tx);

Direct API Users

Update signature endpoints to use the new signingOptions parameter. Most use cases only require changing the parameter name while keeping the same values.

Getting Started

Engine Cloud is now generally available:

  1. Create a thirdweb project
  2. Complete Transactions API onboarding to create server wallets and vault access tokens
  3. Start making API calls!

Engine Documentation → | API Reference →

Firekeeper

What's Changed

  • Various improvements and fixes related to session resuming; OAuth, Email and Phone login options should automatically resume much more often, with memory optimizations as well. In practice, this means that after creating your wallet, the IsConnected node will return true much more often, allowing you to skip the user action that typically is required.

Github Release

Firekeeper

What's Changed

  • Enhanced advanced session key management for compatible wallets, including creation of session keys with granular permissions and policies.
  • Added ability to check signer permissions, retrieve session expiration, and inspect session and policy details for signers.
  • Expanded data models to represent session states and permission limits for improved session management visibility.
  • Enhanced in-code examples and comments to illustrate session key workflows and permission management.

Links

.NET Release | NuGet Release | Unity Release

Documentation | Support

Firekeeper

EIP-7702 execution mode for In-App and Ecosystem Wallets is now available on Arbitrum Mainnet!

Arbitrum One: RPC and Chain Settings
Use the best Arbitrum One RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.

These are the chains we now support, if you'd like us to support more, reach out to support!

Mainnets Supported

  • Ethereum (Chain ID: 1)
  • Gnosis (Chain ID: 100)
  • BNB Smart Chain (BSC) (Chain ID: 56)
  • Optimism (Chain ID: 10)
  • Base (Chain ID: 8453)
  • Ink (Chain ID: 57073)
  • Unichain (Chain ID: 130)
  • Zora (Chain ID: 7777777)
  • Soneium (Chain ID: 1868)
  • Mode (Chain ID: 34443)
  • Scroll (Chain ID: 534352)
  • Arbitrum (Chain ID: 42161)

🧪 Testnets Supported

  • Sepolia (Ethereum) (Chain ID: 11155111)
  • Gnosis Chiado (Chain ID: 10200)
  • BSC Testnet (Chain ID: 97)
  • Optimism Sepolia (Chain ID: 11155420)
  • Base Sepolia (Chain ID: 84532)
  • Ink Sepolia (Chain ID: 763373)
  • Unichain Sepolia (Chain ID: 1301)
  • Zora Sepolia (Chain ID: 999999999)
  • Soneium Minato (Chain ID: 1946)
  • Mode Sepolia (Chain ID: 919)
  • Scroll Sepolia (Chain ID: 534351)
  • Arbitrum Sepolia (Chain ID: 421614)
Firekeeper

Building on the EIP-7702 Account Abstraction and transaction sponsorship introduced in .NET v2.21.0 and Unity v5.21.0, this release extends Session Key functionality to EIP-7702 Smart EOAs. Session Keys enable granular permission delegation to external wallets for executing transactions on your behalf.

Key Features

  • Permission Delegation: Grant time-limited access to external wallets
  • Granular Controls: Define precise execution permissions per session
  • Smart EOA Integration: Now available for EIP-7702-powered In-App Wallets, inspired by and improved from Smart Wallet session keys
  • Backend Flexibility: Delegate transaction execution to external systems while maintaining control

Usage Example

Create session keys with either full permissions or custom policies:

// Grant full permissions for 24 hours
var sessionKeyReceipt = await smartEoa.CreateSessionKey(
chainId: chain,
signerAddress: await Utils.GetAddressFromENS(client, "vitalik.eth"),
durationInSeconds: 86400,
grantFullPermissions: true
);
// Grant custom permissions
var sessionKeyReceipt = await smartEoa.CreateSessionKey(
chainId: chain,
signerAddress: await Utils.GetAddressFromENS(client, "vitalik.eth"),
durationInSeconds: 86400,
grantFullPermissions: false,
callPolicies: new List<CallSpec>(), // Contract interaction rules
transferPolicies: new List<TransferSpec>() // Value transfer rules
);

Implementation Workflow

const int chain = 11155111; // 7702-compatible chain
// Initialize EIP-7702 wallet
var smartEoa = await InAppWallet.Create(
client,
authProvider: AuthProvider.Guest,
executionMode: ExecutionMode.EIP7702Sponsored
);
// Authenticate and upgrade EOA
if (!await smartEoa.IsConnected())
{
await smartEoa.LoginWithGuest(defaultSessionIdOverride: Guid.NewGuid().ToString());
}
// Execute upgrade transaction (optional)
var receipt = await smartEoa.Transfer(
chainId: chain,
toAddress: await Utils.GetAddressFromENS(client, "vitalik.eth"),
weiAmount: 0
);
// Verify account delegation (optional)
var isDelegated = await Utils.IsDelegatedAccount(client, chain, await smartEoa.GetAddress());
// Create session key
var sessionKeyReceipt = await smartEoa.CreateSessionKey(
chainId: chain,
signerAddress: await Utils.GetAddressFromENS(client, "vitalik.eth"),
durationInSeconds: 86400,
grantFullPermissions: true
);

Practical Applications

Once created, these session keys can be used to:

  • Delegate transactions to backend services while maintaining security boundaries
  • Enable temporary access for third-party services
  • Create specialized roles with limited permissions
  • Automate workflows without exposing primary wallet credentials

The session key mechanism opens up numerous possibilities for secure, permissioned delegation patterns while maintaining full control over your assets and contracts.

Links

.NET Release | NuGet Release | Unity Release

Documentation | Support

Toomas Oosalu

We've made some exciting improvements to the indexing pipeline of Insight and have managed to reduce the block lag by up to 80%!

What is block lag? - Each block included in the blockchain has a timestamp of when it was constructed. Block lag, in the case of Insight, shows the difference between the block timestamp and when it is queryable via the Insight API.

For example, on Base we were able to the block lag from around 18 seconds on average to around 5 seconds on average.

On Donatuz, we were able to reduce the block lag from an average of 15 seconds to under 2 seconds consistently!

These are just a few examples, but we have applied these optimizations to all the chains Insight supports and we will be continuing work on improving Insight all around.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Toomas Oosalu

Insight token transfers and NFT transfers endpoints have gotten a few updates.

Block Timestamp Filter

You can now filter transfers by the block timestamp, similarly to the previously available block number filter. The following query parameters are now available:

  • block_timestamp_from - to query transfers made starting from this timestamp
  • block_timestamp_to - to query transfers made until this timestamp

Timestamp format is either a unix timestamp or milliseconds from the epoch.

Contract Address Filter

Another addition is the contract_address query filter, which you can use to only look at transfers for specific tokens or NFT collections.
The endpoints also accept multiple e.g ?contract_address=0x321...&contract_address=0x123...

Sort Order

By default, all transfers are sorted by in a descending order by block number and in an ascending order by the log index (position in the block).

The sort_order query param controls the direction of the block number sort, so you can list the transfers either from oldest or newest.

Token Endpoint Modifications

We've also removed a few query parameters from v1/tokens/transfers that had no effect previously. The parameters were: resolve_metadata_links , sales and the sale option from transfer_type.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Manan Tank

We’ve redesigned the contract pages on thirdweb.com/<chain>/<contract-address> to be cleaner, simpler, and more user-friendly — making them perfect for sharing with your community or users.

These pages no longer include contract management features like Setting permissions, Updating settings, Managing claim conditions, Minting tokens etc

Instead, they now focus on: Promoting your primary sales, Showcasing contract analytics, Displaying recent transfers etc

Here are few examples:

ERC20 Example

View example page

ERC721 Example

View example page

A Demo NFT Drop Contract Page

ERC1155 Example

View example page

A Demo Edition Drop Contract Page

Contract Management Moved to Projects

All advanced contract management tools are still available — they’ve just moved.

You can now access the full contract admin UI at following URL:
/team/<team>/<project>/contract/<chain>/<contract>

To access it

  1. Go to your Team > Project > Contracts tab
  2. Find your contract in the table
  3. Click the contract row to open its full contract management interface
Project contracts page
Contract Mangement Page

If the contract isn’t part of your project yet, you’ll need to import it first. Just click “Import Contract” in the top-right of the Contracts page and enter the contract’s address and chain.

Greg

We've released three new payments components to cover any use case your onchain app might need. Please note these components are still in beta and their interfaces are subject to change.

BuyWidget

Let users buy your token using any token and from any chain with the BuyWidget

0:00
/0:29

Example:

import { BuyWidget } from "thirdweb/react";
function App() {
return (
<BuyWidget
client={client}
chain={chain}
amount="0.01"
tokenAddress="0x..." // Optional: ERC20 Token contract address
recipient="0x..." // Optional: recipient address
theme="light" // Optional: "light" or "dark"
/>
);
}

CheckoutWidget

A drop-in checkout experience for digital and physical assets.

0:00
/0:32

Example:

import { CheckoutWidget } from "thirdweb/react";
function App() {
return (
<CheckoutWidget
client={client}
chain={defineChain(42161)}
amount={0.0002}
seller="0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709"
/>
);
}

TransactionWidget

A UI for any onchain transaction, paid for with funds from any chain.

0:00
/0:24

Example:

import { TransactionWidget } from "thirdweb/react";
import { prepareContractCall } from "thirdweb";
function App() {
const transaction = prepareContractCall({
contract: myContract,
method: "transfer",
params: [recipientAddress, amount],
});
return (
<TransactionWidget
client={client}
transaction={transaction}
onSuccess={(result) =>
console.log("Transaction successful:", result)
}
onError={(error) => console.error("Transaction failed:", error)}
theme="light" // Optional: "light" or "dark"
/>
);
}