Changelog

Nischit Pradhan

At Thirdweb, we’ve been hard at work implementing significant improvements to our infrastructure, and we’re thrilled to share the results of these efforts. This update represents a major leap forward in scalability, performance, and resilience, ensuring we’re better equipped to serve our users now and in the future. Here's what we’ve achieved:

⚡ Unlocking New Levels of Performance

One of the key drivers of this overhaul was the need to reduce latency and improve response times. Our engineering team has:

  • Reduced P99 Latency: We’ve slashed P99 latency from upwards of 20 seconds to just 2 seconds. This improvement means even the slowest requests now complete faster than ever.
  • Optimized Average Response Time: The average response time is now just 250ms, providing a snappier, smoother experience for our users.
  • Expanded Regional Coverage in Europe and Asia Pacific: We have introduced new regions in Europe and Asia Pacific, allowing us to provide more localized services to meet the growing demands of our global customer base. Additionally, these new regions enhance our disaster recovery capabilities, ensuring greater resiliency and reliability.

These enhancements ensure that our platform is not only faster but also more consistent under varying workloads.

📈 Enhanced Autoscaling for Seamless Scaling

To handle ever-increasing traffic demands, we’ve rolled out improved autoscaling capabilities. These dynamic systems allow us to:

  • Respond to peak load surges without sacrificing performance.
  • Maintain cost efficiency by scaling resources up or down as needed.

This ensures that no matter how much demand our platform faces, we’re ready to deliver resilient service.

🛡️ Stress-Tested for Resilience

Reliability is critical, especially as we scale. To validate our infrastructure’s ability to handle increasing demand, we conducted resilience testing at over 6,000 Requests Per Second (RPS). The system performed admirably, solidifying confidence in its ability to handle extreme loads.

Our load testing focused on the RPC router, which efficiently routed requests to over 2,000 nodes globally over a 6-hours period. The screenshots below provides a sample measurement of the aggregated P90 latency across all RPC calls in all regions.

eu-1 latency
ap-1 latency
us-west-1 latency

🌍 Regional RPC Rollout

We’re expanding our global footprint with the rollout of Regional RPC services in Asia Pacific (SEA), Europe (EU), and Americas (US). This regionalization improves latency by up to 60% for users across the globe and ensures a more localized and reliable service experience.

🔐 Updated Authentication with Team Integration

Security and collaboration are critical, and our updated authentication system now integrates seamlessly with teams. This allows:

  • Enhanced access control for better security.
  • Simplified management of team-based workflows.

This update ensures that working as a team on our platform is both secure and effortless.

🔮 Looking Ahead

These improvements mark a significant milestone in our ongoing commitment to delivering a fast, reliable, and scalable platform for our users. But we’re not stopping here. Our team is already planning the next wave of enhancements to stay ahead of the curve and continue providing the best experience possible.

Thank you for being a part of our journey. We’re excited about these changes and can’t wait for you to experience them. Let us know your thoughts and stay tuned for more updates!

Joaquim Verges

thirdweb v5.85.0 has been released with new features a breaking change for the beta nebula API as well as notable bug fixes.

Breaking Changes

Renamed Properties in Nebula Functions

The following property names have been updated in Nebula.chat() and Nebula.execute() to align with the HTTP API:

  • prompt is now message
  • context is now contextFilter

Before:

Nebula.chat({
client,
prompt:
"What's the total supply of this contract: 0xe2cb0eb5147b42095c2FfA6F7ec953bb0bE347D8",
context: {
chains: [sepolia],
},
});

After:

Nebula.chat({
client,
message:
"What's the total supply of this contract: 0xe2cb0eb5147b42095c2FfA6F7ec953bb0bE347D8",
contextFilter: {
chains: [sepolia],
},
});

New Features

Multi-Message Support in Nebula Functions

Both Nebula.chat() and Nebula.execute() now support multiple input messages through the new messages property, enabling more complex conversation flows.

Chat Example:

Nebula.chat({
client,
messages: [
{
role: "user",
content:
"Tell me the name of this contract: 0xe2cb0eb5147b42095c2FfA6F7ec953bb0bE347D8",
},
{
role: "assistant",
content: "The name of the contract is My NFT Collection",
},
{
role: "user",
content: "What's the symbol of this contract?",
},
],
contextFilter: {
chains: [sepolia],
},
});

Execute Example:

Nebula.execute({
client,
account,
messages: [
{ role: "user", content: "What's the address of vitalik.eth" },
{
role: "assistant",
content:
"The address of vitalik.eth is 0xd8dA6BF26964aF8E437eEa5e3616511D7G3a3298",
},
{ role: "user", content: "Send them 0.0001 ETH" },
],
contextFilter: {
chains: [sepolia],
},
});

Each message in the array requires a role ("user" or "assistant") and content string.

Patch Changes

Bug Fixes

  • Fixed NFT components incorrectly displaying metadata when multiple contracts with the same token ID are rendered due to caching issues
  • Fixed MarketplaceV3 deployment for Xsolla testnet

Chain Updates

  • Added mode as a predefined chain
  • Added overrides for Lumia Testnet to use pre-EIP1559 gas values
Manan Tank

New Transactions Breakdown Chart

This chart shows a breakdown of transactions sent by your Engine's backend wallets by their status. This gives you an insight into the transaction volume and success/error rate trend at a glance

Transaction History Table Updates

Pagination and Status filters added in Transaction history table. Pagination UI also has an input field that allows you quickly jump to a page - allowing you to quickly comb through a large list of transactions

Firekeeper

We've added new chains to the platform this week!

Sei Testnet: RPC and Chain Settings
Use the best Sei Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and faucet options.
Sei Network: RPC and Chain Settings
Use the best Sei Network RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Viction Testnet: RPC and Chain Settings
Use the best Viction Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Eclipse Testnet: RPC and Chain Settings
Use the best Eclipse Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
EVM on Flow Testnet: RPC and Chain Settings
Use the best EVM on Flow Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and faucet options.
Rivalz: RPC and Chain Settings
Use the best Rivalz RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Rivalz2: RPC and Chain Settings
Use the best Rivalz2 RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Ouroboro: RPC and Chain Settings
Use the best Ouroboro RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.

Every chain comes out of the box with SDK support RPC, Engine and Account Abstraction capabilities. All you need is the chain id to get going.

const wallet = smartWallet({
chain: defineChain(388), // just need the chainId!
sponsorGas: true,
});

For testnets, you'll also find a faucet in each chain page.

Happy building! 🛠️

Firekeeper

.NET v2.16.0 Release

What's Changed

AuthProvider.SiweExternal - SIWE, OAuth style

Depending on the framework, or on the external wallet platform support, you may not have direct access to every single wallet out there.
This new AuthProvider allows you to login to otherwise native-unavailable wallets such as Abstract Wallet & Coinbase Smart Wallet through a flow similar to OAuth, using SIWE.

It'll redirect you to static.thirdweb.com and use our React SDK and other wallet SDKs as needed, unlocking the ability to login (or link) with any wallet thirdweb supports on web, from runtime platforms that would otherwise be unsupported by said wallet, and create an In-App or Ecosystem Wallet out of it.

Windows Console Example:

var inAppWalletSiweExternal = await InAppWallet.Create(client: client, authProvider: AuthProvider.SiweExternal);
var address = await inAppWalletSiweExternal.LoginWithSiweExternal(
isMobile: false,
browserOpenAction: (url) =>
{
var psi = new ProcessStartInfo { FileName = url, UseShellExecute = true };
_ = Process.Start(psi);
},
forceWalletIds: new List<string> { "io.metamask", "com.coinbase.wallet", "xyz.abs" }
);

You can now override the default session id used with Guest authentication

This is useful when you want your guest mode to be tied to a unique device identifier, and depending on your framework there may be various APIs to fetch such identifiers that you may want to use.

Example:

var guestWallet = await EcosystemWallet.Create(
ecosystemId: "ecosystem.the-bonfire",
client: client,
authProvider: AuthProvider.Guest
);
var address = await guestWallet.LoginWithGuest(SomeSystemInfoAPI.deviceUniqueIdentifier);

Unity 5.16.0 Release

What's Changed

  • Additions from Thirdweb's .NET SDK Release 2.16.0
  • Integrated AuthProvider.SiweExternal in ThirdwebManager.
    • Work around your favorite external wallet not having Unity support.
    • OAuth style linking variant of AuthProvider.Siwe, but using wallets and SIWE in a static React environment.
var walletOptions = new WalletOptions(
WalletProvider.InAppWallet,
421614,
new InAppWalletOptions(authprovider: AuthProvider.SiweExternal)
);
var wallet = await ConnectWallet(walletOptions);
ThirdwebDebug.Log("Connected to InAppWallet with SiweExternal auth provider." + await wallet.GetAddress());
  • AuthProvider.Guest now uses a unique device identifier, making it a little more persistent than the previous implementation.
    • Guest mode is meant as an ephemereal login method, you should allow users to link additional auths later in the flow.
    • This update makes Guest mode a little more persistent in cases where users delete something by mistake.
  • Fixed edge case where Application.identifier being an empty string with some build configs would cause an empty bundle id to be used as the fallback instead of com.company.product.

Links

.NET Release | NuGet Release | Unity Release

Documentation | Support

Jake Loo
Samina Kabir

New Features

  • Nebula TypeScript SDK now available in Beta, integrate /chat and /execute calls easily or be able to plug into any framework
  • New example template on how to create specialized AI agents that can interact with blockchain data while maintaining a distinct personality and purpose

Improvements

  • Read and write contracts with better function argument extraction
    • Improved understanding and parsing for array function arguments related to reading or executing contract functions

Bug Fixes

  • ENS resolver not parsing correctly in select cases
  • Query wallet balance improvements handling wallet addresses with multiple tokens or NFTs
  • Add improved read support for chains with block extraData including Polygon
Joaquim Verges

The thirdweb TypeScipt SDK v5.84.0 release adds support for Nebula, our new AI model designed interact with real time blockchain data and execute transactions with natural language.

Installation

Simply install the thirdweb package on your frontend or backend to get started.

npm install thirdweb

Natural Language Blockchain Queries

Nebula enables developers to query real-time blockchain data using simple natural language prompts. From checking contract symbols to analyzing on-chain metrics, Nebula provides human-readable responses to your blockchain queries.

import { Nebula } from "thirdweb/ai";
const response = await Nebula.chat({
client,
prompt:
"What's the symbol of this contract: 0xe2cb0eb5147b42095c2FfA6F7ec953bb0bE347D8",
context: {
chains: [sepolia],
},
});
console.log("chat response:", response.message);

AI-Powered Transaction Execution

Nebula goes beyond just querying data - it can now execute blockchain transactions based on natural language instructions. Simply connect your wallet and describe the transaction you want to perform.

import { Nebula } from "thirdweb/ai";
const wallet = createWallet("io.metamask");
const account = await wallet.connect({ client });
const result = await Nebula.execute({
client,
prompt: "send 0.0001 ETH to vitalik.eth",
account,
context: {
chains: [sepolia],
},
});
console.log("executed transaction:", result.transactionHash);

Key Features

  • Natural language processing for blockchain queries
  • Real-time data access across 2000+ chains
  • Transaction execution through simple prompts
  • Works with 300+ wallet providers, in-app wallets, smart wallets and engine
  • Context-aware responses and actions with multi step sessions

This addition to the SDK marks a significant step forward in making blockchain technology more accessible and user-friendly. Nebula's natural language capabilities greatly reduce the complexity of doing complex actions on the blockchain.

For detailed documentation and examples, please visit our documentation portal or join our Discord community for support and discussions.

Happy Building! 🛠️

Joaquim Verges

Backend Engine Account Support

The thirdweb TypeScript sdk v5.84.0 introduces the new engineAccount() function, enabling seamless backend integration with your thirdweb Engine instance. This addition allows developers to leverage the full power of the thirdweb SDK and contract extensions functions in backend environments while benefiting from Engine's performance, reliability, and monitoring capabilities.

Key Features

  • Create Engine-powered accounts for backend transaction handling with nonce and fund management
  • Full access to thirdweb SDK functions and extensions from the backend
  • Built-in transaction monitoring and reliability features

Usage Example

// Initialize engine account with your instance credentials
const engine = engineAccount({
engineUrl: process.env.ENGINE_URL,
authToken: process.env.ENGINE_AUTH_TOKEN,
walletAddress: process.env.ENGINE_WALLET_ADDRESS,
});
// Prepare transactions like usual
const tx = await claimTo({
contract: getContract({ client, chain, address: "0x..." }),
to: "0x...",
tokenId: 0n,
quantity: 1n,
});
// Send transaction through engine
const result = await sendTransaction({
account: engine,
transaction: tx,
});
// Transaction hash is returned once engine submits it onchain
console.log(result.transactionHash);

This update helps backend development workflows by opening up the large catalog of extensions functions available in the SDK. The engineAccount() function serves as a bridge between your backend services and the blockchain, handling transaction preparation, submission, and confirmation in a reliable manner.

For more information about this release, please visit our documentation or join our Discord community for support and discussions.

TypeScript Auto Connect

The SDK now exposes the autoConnect function for use outside of React environments. This allows developers to implement wallet auto-connection functionality in any JavaScript/TypeScript environment.

Usage Example

import { autoConnect } from "thirdweb/wallets";
const autoConnected = await autoConnect({
client,
onConnect: (wallet) => {
console.log("wallet", wallet);
},
});
console.log("isAutoConnected", isAutoConnected); // true or false

For more information about this release, please visit our documentation or join our Discord community for support and discussions.

Happy building! 🛠️

Prithvish Baidya

We're excited to introduce powerful new batching capabilities in Engine v2.1.25, enabling you to execute multiple operations atomically and efficiently read from multiple contracts in a single call.

New Features

1. Atomic Transaction Batching

New Endpoint: /backend-wallet/{chainId}/send-transaction-batch-atomic

Send multiple transactions that will be executed together in a single atomic operation. Perfect for operations that need to happen in a specific order, like token approvals followed by transfers. Check out the API Reference for more details.

Key Benefits:

  • Guaranteed order of execution
  • All transactions succeed or fail together
  • Single queue ID for tracking the entire batch
  • Compatible with all smart account setups:
    • Smart backend wallets (no additional headers needed)
    • Regular backend wallets using x-smart-account-address header

Usage Example:

curl --request POST \
--url http://localhost:3005/backend-wallet/84532/send-transaction-batch-atomic \
--header 'Authorization: Bearer {{authToken}}' \
--header 'x-backend-wallet-address: {{walletAddress}}' \
--data '{
"transactions": [
{
"toAddress": "0x...",
"value": "0",
"data": "0x..." // First transaction (e.g., approval)
},
{
"toAddress": "0x...",
"value": "0",
"data": "0x..." // Second transaction (e.g., transfer)
}
]
}'

Example cURL for Atomic Batching

Difference from Previous Write Endpoint:

  • Previous: Each transaction got its own queue ID, executed independently
  • New: Single queue ID for entire batch, guaranteed atomic execution

2. Contract Read Batching

New Endpoint: /contract/{chainId}/read-batch

Execute multiple read operations across different contracts in a single call, with guaranteed consistency of data from the same block. Check out the API Reference for more details.

Key Benefits:

  • All reads executed in the same block
  • Reduced RPC calls using multicall3
  • Perfect for getting related data across contracts
  • Consistent state snapshot across all reads

Usage Example:

curl --request POST \
--url http://localhost:3005/contract/421614/read-batch \
--header 'Authorization: Bearer {{authToken}}' \
--data '{
"calls": [
{
"contractAddress": "0x...",
"functionName": "balanceOf"
},
{
"contractAddress": "0x...",
"functionName": "allowance"
}
]
}'

Example cURL for Batch Reads

Transaction Status Updates

The transaction status object now includes a batchOperations field that provides details about all operations in an atomic batch. This field will be null for non-batch transactions:

{
batchOperations: [
{
to: string | null,
data: string | null,
value: string,
},
] | null;
}

batchOperations field in Transaction Status Object


thirdweb Engine is an open-source server for your app to read, write, and deploy contracts at production scale. Self-host for free or get a cloud-hosted Engine for $99/month.

Manan Tank

Contract Analytics on thirdweb dashboard is now powered by thirdweb Insight

You can select a date range and see various analytics for the contract such as

  • Unique wallets that have sent transactions
  • Total Transactions & Events
  • Breakdown of unique Functions calls & emitted Events

View this contract analytics on dashboard

What is insight?

Insight is a powerful tool that lets you retrieve blockchain data from any EVM chain, enrich it with metadata, and transform it using custom logic.

Whether you're building a gaming inventory system, tracking DeFi metrics, or analyzing NFT collections, Insight makes it easy to get the data you need with simple API calls. Learn more about thirdweb insight to use in your projects!

Arsenii

We’re excited to announce a major update to Insight API! The latest changes enhance the API’s functionality by introducing multichain support, enabling seamless data fetching across multiple blockchain networks.

What's New?

Multichain Queries Across All Endpoints

  • Parallel Data Fetching: Fetch data from multiple chains simultaneously, improving efficiency.
  • Consolidated Responses: Responses now include chain_ids in the payload to identify the source chain for each piece of data.
  • Enhanced Response Schema: Added metadata fields:
    • chain_ids: List of queried chain IDs.
    • total_items: Total count across all chains.
    • limit_per_chain: Indicates the per-chain limit derived from the request's original limit.

Chain IDs Validation

Only requests with supported chain IDs—validated against Thirdweb Insight’s chain list—are now processed. This ensures consistent and accurate responses.

Updated Endpoints

The following endpoints now support multichain queries:

  • /tokens/erc20: Consolidates token balances across chains
  • /events: Returns events from specified chains, preserving chain identification.
  • /transactions: Provides transactions with proper error handling for invalid chain IDs.
  • /query: Delivers raw query results with metadata for chain information.

Backward Compatibility

Existing single-chain requests remain fully supported, ensuring no disruptions for current users.

Example Requests

Single-Chain Request

curl -X GET "https://insight.thirdweb.com/v1/{clientId}/events/0x6e55472109e6abe4054a8e8b8d9edffcb31032c5/Transfer(address,address,uint256)?limit=100&chain=660279"

Multichain Request

curl -X GET "https://insight.thirdweb.com/v1/{clientId}/events/0x6e55472109e6abe4054a8e8b8d9edffcb31032c5/Transfer(address,address,uint256)?limit=100&chain=1&chain=660279"

Response Example

{
"meta": {
"chain_ids": [1, 660279],
"total_items": 113,
"limit_per_chain": 100,
"...": "..."
},
"data": [
{
"chainId": 1,
"...": "..."
},
{
"chainId": 660279,
"...": "..."
}
]
}

Looking Ahead

This update lays the groundwork for future improvements on multichain queries via Insight API. As we continue to expand, our goal is to make working with multichain data as seamless and efficient as possible.

Start leveraging these improvements today to explore multichain insights more effectively!

Toomas Oosalu

We're excited to announce that thirdweb Insight has expanded its blockchain data querying capabilities with support for 43 chains, including these 15 new chains:

What This Means For Developers
With these additions, you can now use all of Insight's powerful features across these new chains:

  • Query on-chain events with the Events Blueprint
  • Track transactions with the Transactions Blueprint
  • Monitor token balances (ERC-20, ERC-721, ERC-1155) with the Tokens Blueprint

For example, to query latest events on Optimism

const getLatestOptimismEvents = async () => {
try {
const response = await fetch(
"https://10.insight.thirdweb.com/v1/events?sort_by=block_number&sort_order=desc",
{
headers: {
"x-client-id": <your-client-id>,
},
},
);
const latestEvents = await response.json();
return latestEvents;
} catch (error) {
console.error('Error:', error);
}
};

Replace <client-id> with your thirdweb client ID

View All Supported Chains
For a complete list of supported chains and their respective chain IDs, check the thirdweb chainlist.

Jake Loo

We’re excited to share the latest updates to Nebula, bringing powerful new features, enhancements, and bug fixes to improve your development experience. This release focuses on expanding Nebula’s capabilities, making it even easier to deploy contracts, retrieve information, and interact seamlessly with the platform.

Features

  • Contract deployment support: Deploy thirdweb ERC-20 (Token), ERC-721 (NFT Collection), ERC-1155 (Edition), and Split contracts using Nebula via the chat interface or the API.
      • Prompt Nebula to prepare and execute contract deployments in natural language — example, “Deploy an ERC-20 contract named “Hello World” with description “Hello world token deployed with an AI” and symbol “HELLO”
      • More published contracts will be supported in upcoming releases. If you would like for your published contract to be enabled on Nebula, please contact us.
  • Multi-message API: Enable multi-message on the /chat and /execute endpoints to allow multi-shot prompts that can be helpful to maintain and clarify context, and refine responses. The /chat and /execute endpoints accept:
    • message: string or
    • messages: [{ role: "user" | "assistant", content: string }]
  • Comprehensive support for developers: Expanded resources and guidance to help developers effectively build web3 apps and games using thirdweb's extensive tooling and documentation.
      • "How do i transfer erc20 tokens in .NET?”
      • "How do i setup a session key in unity?”
  • Build using Nebula and Eliza, a simple and lightweight framework for creating autonomous AI agents.

Nebula is currently in Alpha for a select number of developers. For access to the product, please sign up on the Nebula waitlist.

For any feedback or support inquiries, please visit our support site.

Firekeeper

What's Changed

  • Additions from Thirdweb's .NET SDK Release 2.14.0
  • Additions from Thirdweb's .NET SDK Release 2.15.0
  • Added AuthProvider.Backend's related walletSecret to In-App and Ecosystem Wallets' options. You can now create server side wallets!
  • Split ThirdwebManager into ThirdwebManagerBase, ThirdwebManager (frontend), ThirdwebManagerServer (backend)
    • Adds ThirdwebManagerServer prefab, uses SecretKey instead of ClientId and BundleId.
    • Adds a lot of flexibility and extendability for various use cases.
var serverWalletOptions= new WalletOptions(
provider: WalletProvider.InAppWallet,
chainId: 421614,
inAppWalletOptions: new InAppWalletOptions(authprovider: AuthProvider.Backend, walletSecret: "my-epic-secret")
);
var myAiWallet = await ThirdwebManagerServer.Instance.ConnectWallet(serverWalletOptions);

It's time to make blockchain-powered AI allies and opponents that leverage backend wallets and perhaps even Nebula.

Links

.NET Releases | NuGet Release | Unity Release

Support | Docs

Prithvish Baidya

Engine v2.1.24 introduces sponsored transaction support for regular backend wallets, enabled on zkSync chains leveraging native account abstraction.

What's New?

Sponsored Transaction Mode

Added x-transaction-mode: sponsored header that enables sponsored transactions for regular backend wallets. This brings key benefits:

  • No need to hold or manage gas tokens
  • All gas costs are handled by thirdweb's paymaster
  • Receive consolidated gas usage bills from thirdweb
  • Compatible with local, AWS KMS, and GCP KMS wallets

Technical Details

To send sponsored transactions:

// Add this header with your regular backend wallet
x-transaction-mode: sponsored
x-backend-wallet-address: 0x...

HTTP Headers

The header:

  • Works with regular backend wallets on supported chains
  • Is ignored when used with Smart Backend Wallets (their transactions are already sponsored)
  • Returns an error if used on currently unsupported chains

Getting Started

  1. Update to Engine v2.1.24
  2. Add the x-transaction-mode: sponsored header
  3. Send transactions normally through your regular backend wallet
ℹ️
Why Regular Wallets with Sponsored Mode?

Smart Backend Wallets handle sponsored transactions by deploying a separate smart account for your wallet. On zkSync, wallets can act as their own smart accounts - meaning your regular wallet address can send sponsored transactions directly without needing a separate smart account address.

Contact support@thirdweb.com for any questions about implementing native AA support in your application.


thirdweb Engine is an open-source server for your app to read, write, and deploy contracts at production scale. Self-host for free or get a cloud-hosted Engine for $99/month.

Firekeeper

.NET Updates

  • Added DropER721_Burn, DropERC1155_BurnBatch, TokenERC721_Burn, TokenERC1155_Burn, TokenERC1155_BurnBatch contract extensions.
  • Overriding default RPCs is now allowed through a new ThirdwebClient creation parameter rpcOverrides.
var client = ThirdwebClient.Create(
clientId: "myepicclientid",
bundleId: "my.bundle.id", // for native apps
rpcOverrides: new()
{
{ 1, "https://eth.llamarpc.com" },
{ 42161, "https://arbitrum.llamarpc.com" }
}
);
  • Removed some leftover unnecessary logging.

Integration in Unity & WalletConnect Updates

  • Additions from Thirdweb's .NET SDK Release 2.13.0
  • Exposed the ability to override RPC per chain ID in the ThirdwebManager.
  • Exposed the ability to force specific wallet ids into your WalletConnect modal in the ThirdwebManager.
  • Added hover tooltips for all ThirdwebManager options.
7af88a82f42c2f761f63993c46b220bd

Autoconnect Feature

Flag under ThirdwebManager > Preferences.

If enabled, Thirdweb will automatically connect to the last connected wallet on initialization (this behavior does not apply to the WalletConnectWallet provider option).

If a wallet was connected as a non smart wallet, then later upgraded, the smart wallet is saved as the last wallet, and the next session will autoconnect to the smart wallet.

Any failure during this entire flow should not throw.

d90a291c4de48fb3c35e7bec3dfab08f

Links

.NET Release | NuGet Release | Unity Releases

Support | Documentation

Winston Yeo

We are thrilled to announce support for backend wallets! This enhancement empowers developers to programmatically access wallets through their backend systems without needing to manage private keys directly. It simplifies wallet management while maintaining security and flexibility for various use cases.

Why Backend Wallets Matter

Traditionally, managing wallets in decentralized applications often required dealing with private keys or relying on client-side solutions. However, there are scenarios where programmatic access to wallets on the backend is essential, such as:

  • Server-side automation: Automating blockchain interactions for services like token minting, payments, or data signing.
  • Enhanced security: Keeping private keys off the client side while enabling wallet operations.
  • Custom integrations: Integrating wallets seamlessly with backend APIs for complex workflows.

With backend wallet support, developers can now securely and conveniently access wallets from their backend infrastructure.

How It Works

The new feature allows you to create a wallet instance on the backend using the backend, here's how it's done with the typescript SDK:

import { inAppWallet } from "thirdweb/wallets";
const wallet = inAppWallet();
const account = await wallet.connect({
strategy: "backend",
client: createThirdwebClient({
secretKey: "...", // Your backend client secret key
}),
walletSecret: "...", // Your unique wallet secret. Each secret corresponds to a single wallet
});
console.log("account.address", account.address);

Get Started Today

Ready to explore backend wallet support? Try it out on all version of the thirdweb SDK from 5.83.0 onwards.

Greg

Features 🚀

EIP-7702 Authorization Lists (Beta)

We've added beta support for EIP-7702 authorization lists. You can now construct and send 7702 authorizations with the following functions:

import {
signAuthorization,
prepareTransaction,
sendTransaction,
} from "thirdweb";
const authorization = await signAuthorization({
request: {
address: "0x...",
chainId: 911867,
nonce: 100n,
},
account: myAccount,
});
// Preparing a transaction with authorization
const transaction = prepareTransaction({
chain: chain,
client: client,
value: 100n,
to: recipient,
authorizationList: [authorization],
});
// Sending the authorization transaction
const result = await sendTransaction({
account,
transaction,
});

Manual Smart Account Deployment

Added deploySmartAccount function to explicitly deploy smart account contracts.

import { deploySmartAccount } from "thirdweb";
const account = await deploySmartAccount({
smartAccount,
chain,
client,
accountContract,
});

Improvements 🔧

Smart Account Signatures

Deployed smart accounts now use the legacy signature behavior (ERC-1271) rather than ERC-6492 pre-deploy signatures.

Greg

Features 🚀

Retrieve In-App Wallet Smart Wallet Admin Account

We've added the getAdminAccount method to inAppWallet interfaces when using Account Abstraction (AA), including gasless ecosystem wallets. This addition allows developers to retrieve the admin account for AA-compatible in-app wallets.

// Initialize the in-app wallet with sponsored gas enabled
const wallet = inAppWallet({
smartAccount: {
chain: sepolia,
sponsorGas: true,
},
});
// Connect to the wallet using a specific client and strategy
const account = await wallet.connect({
client, // Your defined client instance
strategy: "google", // Specify your authentication strategy
});
// Retrieve the admin account
const adminAccount = await wallet.getAdminAccount();
// Log the admin account address
console.log("Admin Account Address:", adminAccount.address);

Improvements 🔧

Enhanced Modal Control

We've added a new onClose callback option to Connect Details modal, providing developers with greater control over modal behavior and user interactions. The callback receives the last active screen name when the user closes the modal, enabling better UX flows and analytics.

<ConnectButton
detailsModal={{
onClose: (screen: string) => {
console.log(`Modal closed while on screen: ${screen}`);
// Handle post-close logic here
},
}}
/>;

Auto-Connect onTimeout Callback

We've also added an onTimeout callback in useAutoConnect hook to handle connection timeout scenarios gracefully. Timeouts can happen if the user has previously connected a wallet, but we're unable to reconnect to that wallet.

<AutoConnect
onTimeout={() => {
console.log("Auto connection timed out");
}}
/>;

Bug Fixes 🐛

Smart Account Transactions

We fixed an issue where smart accounts could not execute transactions on chains besides the one they were initially created on. AA transactions on chains besides the initial one now deploy the smart account on the new chain before executing the transaction

// Configure the smart wallet
const wallet = smartWallet({
chain: sepolia,
sponsorGas: true,
});
// Connect the smart wallet
const smartAccount = await wallet.connect({
client,
personalAccount,
});
// Prepare a transaction on another chain
const transaction = prepareTransaction({
value: 10000n,
to: "0x..."
chain: baseSepolia,
client
});
// This will deploy the smart account on Base Sepolia
const result = await sendTransaction({
account: smartAccount,
transaction
});

Removals and Deprecations 🗑️

Wallet Support Changes

We've removed co.lobstr from the available wallets list as it is not EVM-compatible

Firekeeper

IThirdwebWallet.UnlinkAccount

Adds the ability to Unlink a LinkedAccount from your In-App or Ecosystem Wallet.

List<LinkedAccount> linkedAccounts = await inAppWallet.GetLinkedAccounts();
List<LinkedAccount> linkedAccountsAfterUnlinking = await inAppWallet.UnlinkAccount(linkedAccounts[0]);

EIP-7702 Integration (Experimental)

Integrates authorizationList for any transactions.
This EIP essentially allows you to set code to an EOA, unlocking a world of possibilities to enhance their functionality.

The best way to understand it outside of reading the EIP is looking at the example below; to preface it: we sign an authorization using the wallet we want to set code to. Another wallet sends a transaction with said authorization passed in, essentially activating it. The authority wallet now has code set to it pointing to an (insecure) Delegation contract in this case, which allows any wallet to execute any call through it on behalf of the authority. In this example, we call the wallet executing both the authorization and the claim transaction afterwards, the exectuor.

An authority may execute its own authorization, the only difference is internal whereby the authorization nonce is incremented by 1.

// Chain and contract addresses
var chainWith7702 = 911867;
var erc20ContractAddress = "0xAA462a5BE0fc5214507FDB4fB2474a7d5c69065b"; // Fake ERC20
var delegationContractAddress = "0x654F42b74885EE6803F403f077bc0409f1066c58"; // BatchCallDelegation
// Initialize contracts normally
var erc20Contract = await ThirdwebContract.Create(client: client, address: erc20ContractAddress, chain: chainWith7702);
var delegationContract = await ThirdwebContract.Create(client: client, address: delegationContractAddress, chain: chainWith7702);
// Initialize a (to-be) 7702 EOA
var eoaWallet = await PrivateKeyWallet.Generate(client);
var eoaWalletAddress = await eoaWallet.GetAddress();
Console.WriteLine($"EOA address: {eoaWalletAddress}");
// Initialize another wallet, the "executor" that will hit the eoa's (to-be) execute function
var executorWallet = await PrivateKeyWallet.Generate(client);
var executorWalletAddress = await executorWallet.GetAddress();
Console.WriteLine($"Executor address: {executorWalletAddress}");
// Fund the executor wallet
var fundingWallet = await PrivateKeyWallet.Create(client, privateKey);
var fundingHash = (await fundingWallet.Transfer(chainWith7702, executorWalletAddress, BigInteger.Parse("0.001".ToWei()))).TransactionHash;
Console.WriteLine($"Funded Executor Wallet: {fundingHash}");
// Sign the authorization to make it point to the delegation contract
var authorization = await eoaWallet.SignAuthorization(chainId: chainWith7702, contractAddress: delegationContractAddress, willSelfExecute: false);
Console.WriteLine($"Authorization: {JsonConvert.SerializeObject(authorization, Formatting.Indented)}");
// Execute the delegation
var tx = await ThirdwebTransaction.Create(executorWallet, new ThirdwebTransactionInput(chainId: chainWith7702, to: executorWalletAddress, authorization: authorization));
var hash = (await ThirdwebTransaction.SendAndWaitForTransactionReceipt(tx)).TransactionHash;
Console.WriteLine($"Authorization execution transaction hash: {hash}");
// Prove that code has been deployed to the eoa
var rpc = ThirdwebRPC.GetRpcInstance(client, chainWith7702);
var code = await rpc.SendRequestAsync<string>("eth_getCode", eoaWalletAddress, "latest");
Console.WriteLine($"EOA code: {code}");
// Log erc20 balance of executor before the claim
var executorBalanceBefore = await erc20Contract.ERC20_BalanceOf(executorWalletAddress);
Console.WriteLine($"Executor balance before: {executorBalanceBefore}");
// Prepare the claim call
var claimCallData = erc20Contract.CreateCallData(
"claim",
new object[]
{
executorWalletAddress, // receiver
100, // quantity
Constants.NATIVE_TOKEN_ADDRESS, // currency
0, // pricePerToken
new object[] { Array.Empty<byte>(), BigInteger.Zero, BigInteger.Zero, Constants.ADDRESS_ZERO }, // allowlistProof
Array.Empty<byte>() // data
}
);
// Embed the claim call in the execute call
var executeCallData = delegationContract.CreateCallData(
method: "execute",
parameters: new object[]
{
new List<Thirdweb.Console.Call>
{
new()
{
Data = claimCallData.HexToBytes(),
To = erc20ContractAddress,
Value = BigInteger.Zero
}
}
}
);
// Execute from the executor wallet targeting the eoa which is pointing to the delegation contract
var tx2 = await ThirdwebTransaction.Create(executorWallet, new ThirdwebTransactionInput(chainId: chainWith7702, to: eoaWalletAddress, data: executeCallData));
var hash2 = (await ThirdwebTransaction.SendAndWaitForTransactionReceipt(tx2)).TransactionHash;
Console.WriteLine($"Token claim transaction hash: {hash2}");
// Log erc20 balance of executor after the claim
var executorBalanceAfter = await erc20Contract.ERC20_BalanceOf(executorWalletAddress);
Console.WriteLine($"Executor balance after: {executorBalanceAfter}");

Note that for the time being this only works on 7702-enabled chains such as Odyssey and the feature has only been integrated with PrivateKeyWallet.

EcosystemWallet.GetUserAuthDetails

Adds the ability to retrieve auth provider specific user information from In-App and Ecosystem Wallets.

Other additions

  • SwitchNetwork is now part of the main IThirdwebWallet interface. Smart Wallets now attempt to switch the underlying admin network automatically as well.
  • ERC721_TotalSupply extension now includes burned NFTs when using thirdweb contracts, allowing for ERC721_GetAll and ERC721_GetOwned functions to return said NFTs as well.
  • Various new utilities for conversions and transaction decoding, including decoding authorizationList.

Full Changelog: https://github.com/thirdweb-dev/dotnet/compare/v2.11.1...v2.12.0

Links

.NET Release | NuGet Release | Unity Release

Docs | Support