Skip to main content

Gasless Stablecoin Transfers

Chain-specific gas fees can introduce several points of friction to end users and complicate institutional compliance for asset trading or payments. Eliminating chain-specific gas is a major simplification for regulated institutions to conduct payments without the burden of holding digital assets that might fluctuate in value.

Gasless stablecoin transfers on Sui enable peer-to-peer payments of qualified stablecoins to execute without paying gas fees in SUI. The sender of the transaction does not need to hold SUI in their wallet. When the network is congested, the network prioritizes transactions that pay gas fees over gasless stablecoin transfers.

caution

All gasless stablecoin transfers have a minimum transfer balance of 0.01. The network does not execute transfers below this minimum.

Which stablecoins are eligible for gasless transfers?​

The protocol configuration (get_gasless_allowed_token_types in sui-types) governs the stablecoins eligible for gasless stablecoin transfers, and the list can change across protocol versions. The current allowlist is:

SymbolIssuerPackage Address
USDCCircle0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC
USDSUIBridge/Stripe0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI
SUI_USDEEthena0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE
USDYOndo0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY
FDUSDFirst Digital0xf16e6b723f242ec745dfd7634ad072c42d5c1d9ac9d62a39c381303eaa57693a::fdusd::FDUSD
AUSDAgora0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD
USDBBucket Protocol0xe14726c336e81b32328e92afc37345d159f5b550b09fa92bd43640cfdd0a0cfd::usdb::USDB

What gasless stablecoin transfers don't cover​

Gasless stablecoin transfers are narrow by design. A transaction qualifies only when:

  • The programmable transaction block (PTB) consists of allowlisted balance, coin, or funds_accumulator operations on an allowlisted stablecoin type. The primary one is 0x2::balance::send_funds<T>. The allowlist also includes a few related helpers (balance::redeem_funds, coin::send_funds, coin::into_balance, funds_accumulator::withdrawal_split, and so on), which might appear in resolved transactions.
  • gasPayment is empty and gasPrice = 0.
  • The transaction writes no objects, and it consumes all input coins or converts them to address balances.

If the user is sending SUI, sending a non-allowlisted token, or executing any other Move call (NFT mint, swap, app interaction), the gasless stablecoin transfer does not apply and the transaction requires a normal gas payment.

How do I monitor gasless stablecoin transfers?​

You can monitor transactions for gasless stablecoin transfers through SuiVision, such as this example transaction.

How do I support gasless stablecoin transfers?​

Sui gasless stablecoin transfers are an extension of the Address Balances feature. You enable them by calling the Address Balances Move API send_funds() with gas=0 and gas_budget=0.

The TypeScript SDK automatically detects gasless stablecoin transfers when using the gRPC or GraphQL transports. Learn more in the TypeScript SDK documentation. With the JSON-RPC transport, the SDK cannot detect eligibility, so you set the gas price and payment yourself. See JSON-RPC fallback.

Gasless stablecoin transfers are limited to the allowlisted Move functions in What gasless stablecoin transfers don't cover. You cannot use gasless stablecoin transfers to write any object.

How do I integrate gasless stablecoins into wallets?​

To integrate gasless stablecoins into wallets, you need to detect eligible transfers and construct them with @mysten/sui. To do this:

  1. Confirm the coin type is on the eligible stablecoins allowlist and the transfer meets the 0.01 minimum.
  2. Build a PTB that calls 0x2::balance::send_funds<T> with a Balance<T> from tx.balance().
  3. Submit it through SuiGrpcClient. The SDK detects eligibility during simulate and sets gasPrice = 0 and gasBudget = 0.
import { SuiGrpcClient } from '@mysten/sui/grpc';
import { Transaction } from '@mysten/sui/transactions';

const USDC = '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC';

const client = new SuiGrpcClient({
network: 'mainnet',
baseUrl: 'https://fullnode.mainnet.sui.io:443',
});

const tx = new Transaction();
tx.setSender(senderAddress);

tx.moveCall({
target: '0x2::balance::send_funds',
typeArguments: [USDC],
arguments: [
tx.balance({ type: USDC, balance: 1_000_000n }), // 1 USDC
tx.pure.address(recipient),
],
});

const result = await client.signAndExecuteTransaction({
transaction: tx,
signer: keypair,
});

This example connects to Mainnet. To target a different network, change the network and baseUrl values passed to SuiGrpcClient.

If your wallet builds transactions with gRPC but executes through a different transport, pass the gRPC client to build so the SDK still sets the gas price correctly:

const bytes = await tx.build({ client: grpcClient });

SuiGraphQLClient works the same way as gRPC for this flow.

JSON-RPC fallback​

If you must use SuiJsonRpcClient, the SDK cannot detect eligibility for you. Set the price and payment yourself, but only after confirming the coin type is on the allowlist:

const tx = new Transaction();
tx.setSender(senderAddress);

// Manually set gas price to 0. Only do this when you know the coin type is on the allow list
tx.setGasPrice(0);
tx.setGasPayment([]);
tx.setGasBudget(0);

tx.moveCall({
target: '0x2::balance::send_funds',
typeArguments: [USDC],
arguments: [tx.balance({ type: USDC, balance: 1_000_000n }), tx.pure.address(recipient)],
});

If the coin type isn't allowlisted or the PTB shape isn't eligible, the transaction fails at validation.

Compliance considerations​

When you integrate stablecoins into your app, be aware of issuer-specific compliance requirements:

  • USDC (Circle): Circle maintains a blacklist of addresses. If Circle blacklists an address, transactions involving USDC to or from that address fail onchain. Your app should handle this gracefully by checking transaction results and displaying a clear error when a transfer fails. See Circle's compliance documentation for details.
  • Regulated tokens on Sui: Some stablecoins on Sui use the regulated token standard with DenyCapV2. The issuer can block specific addresses from transacting with the token through the DenyList object (0x403). Check whether the stablecoins you integrate use deny-listing and account for denied transactions in your error handling (Security Best Practices).
  • Provider responsibility: Sui documentation covers onchain primitives (coin types, transfer functions, deny-listing). Compliance obligations such as KYC verification, sanctions screening, and reporting are the responsibility of the stablecoin issuer and your app. Consult your legal team and the issuer's compliance documentation for your specific jurisdiction.