Changelog

Greg

We've added Transak to our suite of supported onramp providers in the Universal Bridge. Along with Coinbase and Stripe, Transak brings the total supported countries to over 160, and supported direct onramp tokens to over 170. Explore all the countries and tokens Transak supports.

When used with Universal Bridge, our onchain routing allows you to onramp to thousands of tokens. Some of the notable countries the Universal Bridge now supports:

  • Philippines
  • South Korea
  • Brazil
  • Japan
  • Indonesia
  • Hong Kong

Onramping with the API

To get an onramp link and quote using the Universal Bridge API, use the following:

const res = await fetch(
"https://bridge.thirdweb.com/v1/onramp/prepare",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"x-secret-key": process.env.THIRDWEB_SECRET_KEY,
},
body: JSON.stringify({
onramp: "transak",
chainId: 4337,
tokenAddress: "0xAFf7314Bc869f4AB265ec7EfA8E442F1D978d7a",
maxSteps: 2,
amount: "200000000000000000",
currency: "USD",
receiver: "0x2a4f24f935eb178e3e7ba9b53a5ee6d8407c0709",
}),
},
);
const data = await res.json();

The returned quote will look something like this:

{
"data": {
"id": "3179cf89-e915-4103-b61e-991bf3a33e93",
"link": "https://global.transak.com/...",
"destinationAmount": "2000010000000000",
"timestamp": 1747165958956,
"expiration": 1747169558945,
"intent": {
"chainId": 4337,
"tokenAddress": "0xAff7314Bc869ff4AB265ec7Efa8E442F1D978d7a",
"amount": "2000010000000000",
"receiver": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
"onramp": "transak",
"currency": "USD",
"maxSteps": 2
},
"steps": [
{
"originToken": {
"chainId": 4337,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"symbol": "BEAM",
"name": "Beam",
"decimals": 18,
"priceUsd": 0.00974066,
"iconUri": "https://coin-images.coingecko.com/coins/images/32417/large/chain-logo.png?1698114384"
},
"destinationToken": {
"chainId": 4337,
"address": "0xAff7314Bc869ff4AB265ec7Efa8E442F1D978d7a",
"symbol": "FP",
"name": "Forgotten Playland",
"decimals": 18,
"priceUsd": 0.0006662,
"iconUri": "https://coin-images.coingecko.com/coins/images/35339/small/FP-Token-Icon_%281%29.png?1744266332"
},
"transactions": [
{
"type": "eip1559",
"to": "0xF8Ab2dBE6c43bf1a856471182290f91D621Ba76d",
"from": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
"value": "142478928995176",
"data": "...",
"chainId": 4337,
"action": "buy",
"id": "0xb15a4e9999fc5504e64085dd812b33090e33e3b3b84f4d1adbaf52e6587af8f1",
"spender": "0x965B104e250648d01d4B3b72BaC751Cde809D29E"
}
],
"originAmount": "142478928995176",
"destinationAmount": "2000010000000000",
"estimatedExecutionTimeMs": 12000
}
],
"currency": "USD",
"currencyAmount": 1.06
}
}

You can then use the top-level id to get the onramp's status:

const res = await fetch(
"https://bridge.thirdweb.com/v1/onramp/status?id=3179cf89-e915-4103-b61e-991bf3a33e93",
{
method: "GET",
headers: {
"Content-Type": "application/json",
"x-secret-key": process.env.THIRDWEB_SECRET_KEY,
},
},
);
const data = await res.json();

The returned status:

{
"data": {
"status": "COMPLETED",
"transactions": [
{
"chainId": 4337,
"transactionHash": "0xd36a649a23044e980446a3183c6cfe9016d539a6ff88f31b611a1614b1d265aa"
}
],
"purchaseData": null
}
}

To learn more about how to use thirdweb's Universal Bridge for onramping, bridging, or swapping, check out the API reference or docs.

Greg

We've improved token balance fetching in the PayEmbed for near-instant balance display. We check thousands of tokens for possible routes and return any the user can use to perform their desired transaction in less than a second.

The improved performance is available as of TypeScript SDK v5.99.0. Try it out for yourself on the thirdweb playground.

0:00
/0:26
Joaquim Verges

Version 5.99.0 of the TypeScript thirdweb SDK brings first-class support for EIP-5792. The new implementation streamlines how you batch calls, sponsor gas and track confirmations, while aligning our API with the final EIP-5792 spec.

Highlights:

  • New React hooks – useSendAndConfirmCalls, useWaitForCallsReceipt
  • Simpler useSendCalls / sendCalls signatures – no more explicit client prop, aligned return types with v2.0.0 of the EIP
  • Decoupled receipt handling for flexible UI handling of receipts
  • Easy wallet-capability detection

Live Demo

As usual, you can try out the integration on the live playground:

0:00
/3:03

Usage

TypeScript (node / backend)

import { sendCalls, waitForCallsReceipt } from "thirdweb";
// Build your calls array (tx1, tx2 … conforming to EIP-5792 structure)
const result = await sendCalls({
calls: [tx1, tx2],
sponsorGas: true, // optional gas sponsorship
});
// Later - or in a different process
const receipt = await waitForCallsReceipt(result.id);
console.log("First tx hash:", receipt.receipts[0].transactionHash);

React (front-end)

1 – Fire-and-forget, then wait for the receipt

const { mutate: sendCalls } = useSendCalls();
const { data: result } = await sendCalls({ calls: [tx1, tx2] });
// later, or in another component
const { data: receipt, isLoading } = useWaitForCallsReceipt(
result.id,
);

2 – One-liner helper

const { mutate: sendAndConfirmCalls, data: receipt } =
useSendAndConfirmCalls();
await sendAndConfirmCalls({ calls: [tx1, tx2] });
console.log("Bundle confirmed:", receipt.bundleHash);

Breaking changes

The previous version of the SDK had beta support for 5792, which got some breaking changes in this version, listed below:

React

Before

After

useSendCalls({ client }) returned string bundleId

useSendCalls() returns { id, client, chain, wallet }

useSendCalls({ waitForBundle: true }) returned receipts

Waiting is now decoupled; use useWaitForCallsReceipt

N/A

New helper useSendAndConfirmCalls combines both steps

TypeScript / non-React

Before

After

type SendCallsResult = string;

type SendCallsResult = { id: string; client: ThirdwebClient; chain: Chain; wallet: Wallet }

getCallsStatus(bundleId)

getCallsStatus(id) (field renamed)

Any existing code that relies on the old return type must now read result.id and call waitForCallsReceipt (or the React hook) to obtain transaction receipts.

We recommend upgrading as soon as possible to leverage gas sponsorship and the simplified developer experience. For a full diff, see PR #7003 on GitHub.

Firekeeper

As soon as the Pectra Ethereum Upgrade was released, so were our next-gen 7702 smart accounts - read more about them here!

Today, we introduce support for more chains that upgraded to Pectra!

Arbitrum Sepolia: RPC and Chain Settings
Use the best Arbitrum Sepolia RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Base Sepolia Testnet: RPC and Chain Settings
Use the best Base Sepolia Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Soneium Minato: RPC and Chain Settings
Use the best Soneium Minato RPC and add to your wallet. Discover the chain ID, native token, explorers, and faucet options.
OP Sepolia Testnet: RPC and Chain Settings
Use the best OP Sepolia Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and faucet options.
Unichain Sepolia Testnet: RPC and Chain Settings
Use the best Unichain Sepolia Testnet RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.
Ink Sepolia: RPC and Chain Settings
Use the best Ink Sepolia RPC and add to your wallet. Discover the chain ID, native token, explorers, and more.

TypeScript / React

// plain TypeScript
import { inAppWallet } from "thirdweb/wallets";
const wallet = inAppWallet({
executionMode: {
mode: "EIP7702",
sponsorGas: true,
},
});
// React (e.g. Next.js)
import { inAppWallet } from "thirdweb/wallets";
import { ConnectButton } from "thirdweb/react";
<ConnectButton
client={client}
wallets={[
inAppWallet({
executionMode: {
mode: "EIP7702",
sponsorGas: true,
},
}),
]}
/>;

.NET / Unity

// .NET (server, Godot C#, MAUI, etc.)
var smartEoa = await InAppWallet.Create(
client: thirdwebClient,
authProvider: AuthProvider.Google,
executionMode: ExecutionMode.EIP7702Sponsored
);
// Unity (C#)
var wallet = await ConnectWallet(
new WalletOptions(
provider: WalletProvider.InAppWallet,
chainId: 11155111,
inAppWalletOptions: new InAppWalletOptions(
authprovider: AuthProvider.Google,
executionMode: ExecutionMode.EIP7702Sponsored
)
)
);
Jake Loo

Overview

This release includes significant improvements to the Nebula agent's architecture, entity memory management, error handling, and documentation search capabilities. Key updates focus on simplifying blockchain entity handling, improving transaction management, supporting more content types in chat, and enhancing error messaging for a better user experience.

Features

  • New Content Support in Chat
    • Add support for image and transaction content types in chat messages
{
"messages": [
{
"role": "user",
"content": [
{ "type": "image", "image_url": "ipfs://Qmefr67P2qZS5BS9KBbZVgVXAYCdeezkN4je4tnd6xib4c" },
{ "type": "text", "text": "Please describe the image" }
]
}],
"stream": "true",
}
    • Enable transaction hash messages for blockchain status checks
{
"messages": [
{
"role": "user",
"content": [
{ "type": "transaction", "transaction_hash": "0x112c7d127dbd1fef1006aa6211462a2635b504fc42f71aad0cae4b1e7ddba32a", "chain_id": 1 }
]
}],
"stream": "true",
}
  • Enhanced Entity Management
    • Simplify loading entities by type with a cleaner implementation
    • Improve entity memory formatting for better readability
    • Reduce database operations for improved performance
    • Add user wallet as parsed entity for better context
  • Documentation and Search Improvements
    • Implement new LLMs documentation search with better context retrieval
    • Add URL to web search results for better source attribution
    • Format blockchain entities as links in responses
  • Improved Error Handling
    • Better error messaging for deployment and payment issues
    • Add instructions to help users correct chain context issues
    • Support graceful error handling in streaming responses

API Changes

  • New agent action types for better request handling
  • Support for image and transaction inputs in chat messages
  • More structured error responses with helpful suggestions
  • Revised agent action structure to use more specific types
  • Updated event streaming format for better client compatibility

Bug Fixes

  • Fix undefined behavior when no routes found in Universal Bridge
  • Handle payment required errors from storage service
  • Fix wallet balance formatting and improve entity display
  • Ensure price and token supply data is displayed correctly

Ready to try out all these new features? Give it a spin at https://nebula.thirdweb.com!

Greg

We just added Universal Bridge support for $HONEY, Berachain's stablecoin. You can now pay with or accept HONEY for any transaction on any chain.

0:00
/0:34
Joaquim Verges
Prithvish Baidya

Introducing Engine Cloud — read and write to the blockchain at scale, without the cost or complexity of traditional blockchain API setups.

Why we built Engine Cloud

Engine Cloud is our answer to lowering the barrier to developing high volume applications onchain- with fully-hosted, scalable APIs that let you perform on-chain actions from your backend. No upfront costs. Only pay-as-you-go.

It includes a non-custodial way to manage your wallets and ready-to-go API calls that do things like mint NFTs, transfer tokens, airdrops, sponsor gas for users — on any contract, across any EVM chain.

Engine Cloud includes:

  • Server Wallets managed via Vault (our new key management system)
  • New Transaction Gateway with retry logic, nonce management, and sub-second speed
  • New transaction API improved DX, new typescript SDK integration, and more
  • Secure, granular access tokens to work with multiple wallets and teams via vault access tokens and permissions
  • No more manual gas top-ups or alerts— we handle that for you by topping through our paymasters from your payment on file.

Learn more about use cases and benefits of using Engine Cloud.

Get Started

  1. Create a thirdweb project — this will include a ready-to-go Engine server for you to start making API calls on.
  2. Get your Vault Admin Key + Access Tokens — via the dashboard. Learn more about Vault.
  3. Create a server wallet — for secure, granular signing and management. You can create one or multiple server wallets.
  4. Start calling the API — write and send transactions from your backend using the simple API endpoints. All API endpoints can be accessed via the dashboard or through the API reference.

Engine will be free during beta without charging for any requests until May 19th. You can integrate it to your application today.

For any questions or feedback, please reach out to our support team.

Joaquim Verges

EIP-7702 unlocks a new capability for externally-owned accounts (EOAs): the ability to behave like smart contract accounts. The latest SDK let you enable 7702 on any of your in-app wallets with one line of code, giving your users gas-sponsored, batched and automated transactions faster and more efficiently than ever before.

Why you’ll care

Once an in-app wallet is running in EIP-7702 mode you can:

Sponsor gas so users can sign transactions with zero ETH in their balance.
Batch transactions so multiple contract calls clear in a single signature.
Add session keys to automate on-chain actions safely (think scheduled mints, subscription based payments or game loops).
• …and any other capability you’d expect from smart accounts—all while your user keeps their familiar EOA address.

All it takes is a tiny config change.

But what about EIP-4337 smart wallets?
In our testing, using 7702 is up to twice as fast and orders of magnitude cheaper than using 4337 smart contract wallets!

Try it for yourself

Don't take our word for it, try it yourself on the live playground:

https://playground.thirdweb.com/connect/account-abstraction/7702


Using 7702 with In-App Wallets

In-app wallets lets you create wallets for your users based on standard logins like email, passkey or Google. Below are drop-in examples to turn those wallets into 7702 smart accounts for every stack the thirdweb SDK supports today.

TypeScript / React

// plain TypeScript
import { inAppWallet } from "thirdweb/wallets";
const wallet = inAppWallet({
executionMode: {
mode: "EIP7702",
sponsorGas: true,
},
});
// React (e.g. Next.js)
import { inAppWallet } from "thirdweb/wallets";
import { ConnectButton } from "thirdweb/react";
<ConnectButton
client={client}
wallets={[
inAppWallet({
executionMode: {
mode: "EIP7702",
sponsorGas: true,
},
}),
]}
/>;

. NET / Unity

// .NET (server, Godot C#, MAUI, etc.)
var smartEoa = await InAppWallet.Create(
client: thirdwebClient,
authProvider: AuthProvider.Google,
executionMode: ExecutionMode.EIP7702Sponsored
);
// Unity (C#)
var wallet = await ConnectWallet(
new WalletOptions(
provider: WalletProvider.InAppWallet,
chainId: 11155111,
inAppWalletOptions: new InAppWalletOptions(
authprovider: AuthProvider.Google,
executionMode: ExecutionMode.EIP7702Sponsored
)
)
);
Heads-up EIP-7702 only works on chains that enable it. Ethereum mainnet and Sepolia already support it, with more coming soon; keep an eye on the thirdweb blog for other chain activation dates.

Using EIP-7702 with External Wallets (EIP-5792)

Don’t want to embed an in-app wallet? No problem. EIP-5792 lets you tap into the same 7702 capabilities from any external wallet—like Metamask and Coinbase Wallet —via the sendCalls RPC method.

Sponsoring Gas & Batching Transactions

The useSendCalls React hook (or the plain sendCalls function in vanilla TypeScript) lets you bundle multiple calls into one and attach a paymaster so your dApp covers the gas:

import { useSendCalls } from "thirdweb/react";
const { mutate: sendCalls, data: bundleId } = useSendCalls();
await sendCalls({
client,
calls: [sendTx1, sendTx2],
capabilities: {
paymasterService: {
url: `https://${CHAIN.id}.bundler.thirdweb.com/${client.clientId}`,
},
},
});

Thie enabled single signature, gas-free, batched execution on exernal wallets like Metamask!

Documentation links: React API | TypeScript API

Ready to ship?

Upgrade your thirdweb SDK to the latest version, flip on executionMode: "EIP7702" or use EIP5792's sendCalls, and your users instantly level-up to smart-account features—no new wallets, no migrations, just better UX.

Got questions or feedback? Jump into the thirdweb Discord and let us know what you’re building!

Greg

With the latest release of Universal Bridge, we've added a number of new filters to make building advanced payment UIs more convenient. These are available starting in v5.97.0 of the TypeScript SDK.

The sortBy Filter

The /routes endpoint (API) and Bridge.routes function (SDK) now have an optional sortBy option to determine how the returned routes will be ordered. The first option we've made available is sortBy: "popularity", which will ordered the returned routes based on the number of times they've been used. The following will return the 10 most popular routes originating from ETH on mainnet:

import { Bridge } from "thirdweb";
const routes = await Bridge.routes({
originChainId: 1,
originTokenAddress: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
limit: 10,
offset: 0,
sortBy: "popularity",
client: thirdwebClient,
});
[
{
"originToken": {
"chainId": 8453,
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6
},
"destinationToken": {
"chainId": 466,
"address": "0x675C3ce7F43b00045a4Dab954AF36160fb57cB45",
"iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6
}
},
{
"originToken": {
"chainId": 42161,
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"iconUri": "https://ethereum-optimism.github.io/data/USDC/logo.png",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6
},
"destinationToken": {
"chainId": 466,
"address": "0x675C3ce7F43b00045a4Dab954AF36160fb57cB45",
"iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6
}
},
{
"originToken": {
"chainId": 1,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"iconUri": "https://assets.relay.link/icons/1/light.png",
"symbol": "ETH",
"name": "Ether",
"decimals": 18
},
"destinationToken": {
"chainId": 8453,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"iconUri": "https://assets.relay.link/icons/1/light.png",
"symbol": "ETH",
"name": "Ether",
"decimals": 18
}
},
...
]

The maxSteps Filter

The maxSteps filter already allows you to filter routes based on the number of steps required to fulfill a routes. With this update, we've added this same option to the Buy.quote, Buy.prepare, Sell.quote, and Sell.prepare functions, as well as their corresponding API endpoints. You can now guarantee the quote returned uses a certain number of steps or fewer:

import { Bridge } from "thirdweb";
const quote = await Bridge.Buy.quote({
originChainId: 1,
originTokenAddress: "0x...",
destinationChainId: 137,
destinationTokenAddress: "0x...",
amount: 1000000n,
maxSteps: 2,
});
const preparedQuote = await Bridge.Buy.prepare({
originChainId: 1,
originTokenAddress: "0x...",
destinationChainId: 137,
destinationTokenAddress: "0x...",
amount: 1000000n,
sender: "0x...",
receiver: "0x...",
maxSteps: 2,
});
const quote = await Bridge.Sell.quote({
originChainId: 1,
originTokenAddress: "0x...",
destinationChainId: 137,
destinationTokenAddress: "0x...",
amount: 1000000n,
maxSteps: 3,
});
const preparedQuote = await Bridge.Sell.prepare({
originChainId: 1,
originTokenAddress: "0x...",
destinationChainId: 137,
destinationTokenAddress: "0x...",
amount: 1000000n,
sender: "0x...",
receiver: "0x...",
maxSteps: 3,
});

The Chains Endpoint

We've added a new endpoint and SDK function to get all chains supported by Universal Bridge along with their name, icon, and native currency.

import { Bridge } from "thirdweb";
const chains = await Bridge.chains({
client: thirdwebClient,
});

This will return:

[
{
"chainId": 1868,
"name": "Soneium Mainnet",
"icon": "ipfs://QmPSGdP5WKe2bC5JCo43JjWff8Agw7dg6WQpmUktyW7sat",
"nativeCurrency": {
"name": "Ethereum",
"symbol": "ETH",
"decimals": 18
}
},
{
"chainId": 466,
"name": "AppChain",
"icon": "ipfs://bafybeigx76uxvcvet7365sjdzuxxcgl5auzck6vbbigu2jeg6ixl5k3tya",
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
}
},
{
"chainId": 42161,
"name": "Arbitrum One",
"icon": "ipfs://QmcxZHpyJa8T4i63xqjPYrZ6tKrt55tZJpbXcjSDKuKaf9/arbitrum/512.png",
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
}
},
...
]

Bug Fixes

  • Fixed an issue where Coinbase onramps were not returning the associated transaction hash
  • Fixed routes returning the zero address rather than the native token address
Jonas Daniels

You can now verify a domain for your team!

What’s new:

  • Teams can verify their domain (e.g. @yourcompany.com)
    → When logged in, navigate to Settings`→ General and scroll down Domain Verification to verify your domain.
  • To complete the verification, you'll need to add a DNS TXT record to your domain. This part must be completed through your domain provider's dashboard.
  • Please note you may only verify one domain per team.

Perks of verifying your domain:

  • Verified badge: Your team gets a special badge, so it’s easier to confirm you're in the right place.
  • Recommended team members: On the Settings → Members page, you’ll see users with emails that match your domain but aren’t in the team yet — making it super easy to invite everyone on the team.

Coming Soon:

  • Instant invite alerts: Team owners will get a notification (in the dashboard and optionally via email) when someone signs up with your verified domain — with a 1-click invite option.
  • Recommended teams for users: New users with a matching email domain will see teams they can request to join, giving team owners control to approve or deny.

For any questions or support please reach out to our support team.

Yash Kumar
Samina Kabir

In preparation for Ethereum’s upcoming Pectra upgrade this May, the thirdweb Pack contract has been officially deprecated and is no longer deployable via the dashboard, SDK, or CLI.

Important: Existing Pack contracts are not compatible with the Pectra upgrade.

We strongly recommend that users abandon or conclude any unopened packs as soon as possible to avoid potential issues once the upgrade goes live.

For any questions or support, please reach out to the official thirdweb team support channel.

Joaquim Verges

TL;DR: Update your SDK to 5.96.9+ to fix external wallet mobile connections.

A recent chrome update introduced a change in websockets that broke Wallet Connect connection flows on mobile. This resulted in users not being able to connect their wallets to mobile websites, infinitely loading. All wallet providers were affected. A bug fix was shipped by the Wallet Connect team to support the latest version of Chrome, and we immediately adopted the new version in the latest version of the thirdweb SDK.

Version 5.96.6 and above includes the fix, so update your library to resolve this issue.

Jake Loo

Overview

Nebula v0.0.12 brings significant improvements to the user experience and functionality. This release focuses on enhancing transaction management, adding support for NFTs and tokens, and improving the overall user interface. Key highlights include improved deployment workflows, better transaction formatting, and new token management capabilities.

Features

Memory management

    • More sophisticated entity tracking system
    • Better persistence of blockchain interactions
    • Enhanced context enrichment for more relevant responses

Token and NFT Management

  • Add ERC20 token transfer and approve functionality
    • Transferring tokens between addresses
    • Granting spending allowances to contracts
    • Add ERC721 transfer support for NFT management
  • Add minting capabilities
    • New NFT minting tool for creating digital collectibles
    • Token minting functionality with improved user feedback
  • Support for images in tokens and NFTs
    • Add rendering support for NFT and token images on the frontend

Transaction Improvements

  • Enhanced deployment workflows
    • Improve deployments to include more detailed information as markdown
    • Support multi-stage deployments for complex contract setups
    • Better UI feedback during deployment processes
  • Transaction array support
    • New functionality to handle batched transactions
  • Unify simulation and execution outputs
    • Consistent formatting for all transaction operations
    • Better readability of transaction details
  • Add rate limit checks to RPC calls
    • Prevent API throttling issues with improved handling

Bug Fixes

  • Fix native transfer rendering
    • Correct display of native token transfers in UI
  • Fix deploy UI issues
    • Address multiple UI bugs in the deployment interface
    • Fix early yielding creating duplicate UI cards
  • Fix contract output when metadata is missing
    • Better handling of contracts with missing information
  • Token Bridging / Swapping (Universal Bridge) fixes
    • Switch to new endpoints for improved reliability
    • Fix ABI handling for better contract interaction
  • Fix image parsing
    • Correct handling of image data in responses

Try it out today at https://nebula.thirdweb.com!

Toomas Oosalu

There are 2 changes to the Insight API to improve usability and fix a numeric overflow in Javascript.

Token & NFT Transfers

The NFT and Token transfer endpoints have been changed and now the owner_address query param is not mandatory anymore, enabling queries for all transfers on a chain.

Since this query can be heavy, we also added block number filters. You can narrow down the query using block_number_from and block_number_to query params.

Decoded Data Numeric Overflow Fix

Since Solidity supports numbers larger the Javascript's max number, APIs consuming the decoded events and transactions would receive some numeric values in scientific notation, losing precision.

We updated the decoded data to return large numeric values as string to prevent this. This is what a decoded transaction would look like now

{
"data": [
{
...rest of transaction...
"decoded": {
"name": "transfer",
"signature": "transfer(address,uint256)",
"inputs": {
"_to": "0x28c6c06298d514db089934071355e5743bf21d60",
"_value": "4179950264410000000000"
}
}
}
]
}

Note that the _value uint256 input is returned as string 4179950264410000000000


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

Jake Loo

Overview

This release introduces new image generation capabilities, improves error handling for rate limits, and fixes several key components including IPFS functionality and token minting. Performance optimizations have also been implemented to make token queries faster.

Improvements

  • Add image generation functionality - Implement new image generation capabilities. Create assets with generative artwork in a single prompt!
  • Improve rate limit handling - Add ability to gracefully abort execution when API rate limits are reached
  • Optimize token information retrieval - Add option to exclude price data for faster query performance

Try It Out!

Check it out at https://nebula.thirdweb.com

Joaquim Verges

The latest thirdweb typescript SDK release - v5.96.4 - adds a new way to make the Connect modal feel like your own by adding custom metadata to in-app wallets.

Wide mode

In wide mode, you can customize the name and icon of your in-app wallet in the list of wallets, and the image above the login options separately.

Compact mode

In compact mode, only the image above the login options is displayed.

How to setup your metadata

Simply pass your app metadata along the other options when creating your inAppWallet , then pass it as one of the available wallets in the ConnectButton or ConnectEmbed.

const wallets = [
inAppWallet({
// your auth options
auth: {
options: ["google", "x", "passkey"],
},
// your app metadata
metadata: {
name: "My App", // name for the wallet list
icon: "/twcoin.svg", // icon for the wallet list
image: {
src: "/twcoin.svg", // image above the login options
width: 100,
height: 100,
alt: "My App",
},
},
}),
createWallet("io.metamask"),
createWallet("com.coinbase.wallet"),
createWallet("io.rabby"),
];
<ConnectButton client={client} wallets={wallets} />;

Happy building! 🛠️

Jake Loo

Overview

This release focuses on improving reliability, performance, and user experience with several key enhancements:

  1. Universal Bridge: Enables bridge and swapping
  2. Search: Enhances search capability to improve onchain knowledge and optimizes thirdweb documentation search and access
  3. Contract Interaction: Simulates transactions result and improves contract information retrieval
  4. Performance: Improves contract interaction latency and performance

Improvements & Fixes

  • Improves token balance display with native token support
  • Fixes intermittent failure when interacting with newly deployed contracts
  • Improves error message formatting with actionable suggestions
  • Improves handling of missing contracts with better error messages
Jake Loo

This release significantly enhances Nebula's blockchain integration capabilities with a focus on improved multichain support, better token and NFT handling, and more robust authentication.

The model has been upgraded to provide more accurate and consistent responses more quickly. Users can now see the model's step-by-step thinking process as it performs tasks.

New approach to chain management. By default, only mainnet chains are enabled, to enable testnet requires setting context.networks = "testnet" in the /chat endpoint. The Chain IDs in the context may also be updated through conversations.

Breaking Changes 🔨

  • Model Updates: Experience more accurate and consistent responses with the improved t0_003 model.
  • Chain Management: Defaults to mainnet only. Enabling testnets require specific flag in the context. By setting, context.networks = "testnet"
  • Delegate Auth: Create a SIWE delegated auth tokens for scoped API access to chat and session.

Features ✨

Improvements

  • Guided Tool Prompts: More accurate tool selection by AI agents, resulting in fewer errors and more relevant responses.
  • Improved Output Consistency: More standardized and predictable response formats, making automated parsing of outputs more reliable.
  • Chain ID Parameter Prioritization: Explicit control over which blockchain they're interacting with, reducing confusion and errors from context-switching
  • Comprehensive Blockchain Data Retrieval: Access detailed information about blocks, transactions, and events, enabling more complex analyses within the tool.
  • Multi-chain Insight Support: Perform cross-chain operations and comparisons without needing to use separate tools or interfaces.
  • Domain Name Resolution: Interact with human-readable domain names (like ENS) instead of complex addresses, improving usability.
  • Human-readable Timestamps: See dates and times in standard formats rather than UNIX epochs, making information immediately understandable.

Token & NFT Support

  • Creating Assets: create different token standards (ERC20, ERC721, ERC1155) more easily.
  • NFT Collection Name Display: Friendly collection names rather than just contract addresses, making NFT identification more intuitive.
  • Better Wallet Balance Display: Updated token balances with proper decimal divisions, showing correct human-readable amounts. Correct token names for native blockchain currencies (e.g., ETH, MATIC).

Authentication

  • Nebula Auth Method: Developer can delegate scoped account access, improving security while maintaining functionality.
  • Smart Account Validator: Smart contract wallets (using ERC-1271 and ERC-6492) can now authenticate with Nebula Auth.
Greg

We just released one of our biggest updates yet to the Universal Bridge API. These changes will be coming soon to the SDK and UI components.

The new response schema includes a steps field, which gives you all the info you need to build a comprehensive bridge and swap UI. This includes token metadata, price, expected execution time, input and output amounts, and the transactions to be executed.

A buy, sell, or transfer prepared quote will now look something like this:

{
"data": {
"id": "0x11cb09cf545d9c1c1cc12aa20aaee180a59336ec72701b148f452734c50f1bbf",
"originAmount": "17055594260",
"destinationAmount": "10000001000001000005",
"blockNumber": "22325874",
"timestamp": 1745340923953,
"estimatedExecutionTimeMs": 22000,
"intent": {
"originChainId": 1,
"originTokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"destinationChainId": 8453,
"destinationTokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"amount": "10000001000001000005",
"sender": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
"receiver": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709"
},
"steps": [
{
"originToken": {
"chainId": 1,
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"priceUsd": 0.999949,
"iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694"
},
"destinationToken": {
"chainId": 8453,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"symbol": "ETH",
"name": "Ether",
"decimals": 18,
"priceUsd": 1695.537726,
"iconUri": "https://assets.relay.link/icons/1/light.png"
},
"transactions": [
{
"chainId": 1,
"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"data": "0x095ea7b3000000000000000000000000f8ab2dbe6c43bf1a856471182290f91d621ba76d00000000000000000000000000000000000000000000000000000003f897b714",
"type": "eip1559",
"id": "0xe984ce73defcb35a2decb07b1cbadb57bea0e9bd4c3d919f286988daae5e98a8",
"action": "approval"
},
{
"type": "eip1559",
"to": "0xF8Ab2dBE6c43bf1a856471182290f91D621Ba76d",
"from": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
"value": "0",
"data": "0x...",
"chainId": 1,
"action": "buy",
"id": "0x3b575d76157c50c94c61f0e1265dee784d00d2ad7502f1c6a6dba938e270b196",
"spender": "0xfCEF2Fe72413b65d3F393d278A714caD87512bcd"
}
],
"originAmount": "17055594260",
"destinationAmount": "10000001000001000005",
"estimatedExecutionTimeMs": 22000
}
]
}
}

Onramp quotes will now have the following schema:

{
"data": {
"id": "5a066908-82da-4d31-8dea-99c45f72e98b",
"link": "https://pay.coinbase.com/buy/select-asset?appId=41cbb2fb-8b35-45b9-949b-9672bc8edb78&addresses=%7B%220x2247d5d238d0f9d37184d8332aE0289d1aD9991b%22%3A%5B%22unichain%22%5D%7D&assets=%5B%22USDC%22%5D&defaultAsset=USDC&defaultNetwork=unichain&presetCryptoAmount=1716.321932&fiatCurrency=USD&partnerUserId=7d789de0-b4e0-4aac-84b4-5e13b11c896d",
"destinationAmount": "1000000100000010000",
"timestamp": 1745341089555,
"expiration": 1745344689547,
"intent": {
"chainId": 324,
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"amount": "1000000100000010000",
"receiver": "0x2247d5d238d0f9d37184d8332aE0289d1aD9991b",
"onramp": "coinbase",
"currency": "USD",
"maxSteps": 2,
"excludeChainIds": []
},
"steps": [
{
"originToken": {
"chainId": 130,
"address": "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
"symbol": "USDC",
"name": "USDCoin",
"decimals": 6,
"priceUsd": 0.999949,
"iconUri": "https://ethereum-optimism.github.io/data/USDC/logo.png"
},
"destinationToken": {
"chainId": 324,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"symbol": "ETH",
"name": "Ether",
"decimals": 18,
"priceUsd": 1691.447,
"iconUri": "https://assets.relay.link/icons/1/light.png"
},
"transactions": [
{
"chainId": 130,
"to": "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
"data": "0x095ea7b3000000000000000000000000f8ab2dbe6c43bf1a856471182290f91d621ba76d00000000000000000000000000000000000000000000000000000000664cfe8c",
"type": "eip1559",
"id": "0xb1ec1d50e1ef52ebb5fab91103f05605e9d24fb8ff26c4e5ef728e41ff82b788",
"action": "approval"
},
{
"type": "eip1559",
"to": "0xF8Ab2dBE6c43bf1a856471182290f91D621Ba76d",
"from": "0x2247d5d238d0f9d37184d8332aE0289d1aD9991b",
"value": "0",
"data": "0x...",
"chainId": 130,
"action": "buy",
"id": "0x1c66f9e7aefee5ffcc9b22595d07c3eedfa89deaec189707f73272f8e52d1d7b",
"spender": "0x078D782b760474a361dDA0AF3839290b0EF57AD6"
}
],
"originAmount": "1716321932",
"destinationAmount": "1000000100000010000",
"estimatedExecutionTimeMs": 2000
}
],
"currency": "USD",
"currencyAmount": 1716.321932
}
}

The steps are to be completed after the use has done the initial onramp.

You can find all this and more in our API reference docs.

Features

  • steps parameter for all quotes with prepared transactions and estimates
  • Faster approximate quote responses
  • Onramping with post-onramp cross-chain swaps
  • Fiat quote included in onramp responses

Bug Fixes

  • Removed ZK chains from intermediate steps, due to inconsistent addresses when using smart wallets
Yash Kumar

We have added CLI and SDK support for Stylus contracts.

This allows developers to use thirdweb CLI to create, publish, and deploy their contracts written with Stylus. The deployed contracts can be used via thirdweb dashboard or SDK.

Prerequisites:

You can also use the Stylus quickstart guide for reference: https://docs.arbitrum.io/stylus/quickstart

Here's how to use this feature:

Setup a starter repo (can be skipped if you already have a Stylus project)

npx thirdweb create-stylus

This will setup a project containing a template contract.

You can now publish this contract by running the publish command:

npx thirdweb publish-stylus -k <YOUR SECRET KEY>

Publishing a contract saves the contract metadata to an onchain registry, and creates a contract page from where you can deploy a specific version of this contract multiple times.

This is how it will look:

Alternatively, you can use the deploy command to do a one-time deployment:

npx thirdweb deploy-stylus -k <YOUR SECRET KEY>

After deployment, the contract will be available on thirdweb dashboard. You can interact with it via dashboard or integrate it in your app using the code snippets as shown below: