Skip to main content

Network Providers

Network providers connect your application to the MultiversX blockchain. Two providers are available for different use cases.

Provider Comparison

FeatureGatewayNetworkProviderApiNetworkProvider
Best forTransaction submission, real-time dataHistorical data, token queries, indexing
Base URLgateway.multiversx.comapi.multiversx.com
Response formatWrapped in data envelopeDirect JSON responses
Token metadataBasic token dataExtended metadata (price, supply, etc.)
Account dataCore fieldsExtended fields (shard, txCount, etc.)
Transaction dataCore fieldsExtended fields (action, operations, etc.)
Economics data❌ Not supported✅ Full support

GatewayNetworkProvider

The gateway provider connects to MultiversX Gateway nodes:

import 'package:abidock_mvx/abidock_mvx.dart';

final mainnet = GatewayNetworkProvider.mainnet();
final devnet = GatewayNetworkProvider.devnet();
final testnet = GatewayNetworkProvider.testnet();

final custom = GatewayNetworkProvider(
baseUrl: 'https://gateway.multiversx.com',
chainId: ChainId('1'),
);

ApiNetworkProvider

The API provider connects to the MultiversX API (indexer):

import 'package:abidock_mvx/abidock_mvx.dart';

final mainnet = ApiNetworkProvider.mainnet();
final devnet = ApiNetworkProvider.devnet();
final testnet = ApiNetworkProvider.testnet();

final custom = ApiNetworkProvider(
baseUrl: 'https://api.multiversx.com',
chainId: ChainId('1'),
);

When to use ApiNetworkProvider:

  • Querying token prices and market data
  • Getting detailed account statistics (transaction count, shard)
  • Fetching historical transaction data with full details
  • Building explorer-style applications

Available Operations

Account Operations

final provider = GatewayNetworkProvider.devnet();

// Get account info
final account = await provider.getAccount(address);
print('Balance: ${account.balance.toDenominatedTrimmed} EGLD');
print('Nonce: ${account.nonce.value}');

// Get ESDT tokens
final tokens = await provider.getFungibleTokensOfAccount(address);

// Get specific token
final token = await provider.getTokenOfAccount(address, 'WEGLD-bd4d79');

// Get NFTs
final nfts = await provider.getNonFungibleTokensOfAccount(address);

Account Storage

Read smart contract storage directly:

// Get all storage entries
final storage = await provider.getAccountStorage(contractAddress);
for (final entry in storage.entries) {
print('${entry.key}: ${entry.value}');
}

// Get specific storage entry
final entry = await provider.getAccountStorageEntry(
contractAddress,
'storage_key_hex',
);
print('Value: ${entry.value}');

// Check if key exists
if (storage.hasKey('some_key')) {
final value = storage.getEntry('some_key')?.value;
}

Transaction Operations

// Send transaction
final hash = await provider.sendTransaction(signedTx);

// Get transaction details
final tx = await provider.getTransaction(hash);

// Get transaction status
final status = await provider.getTransactionStatus(hash);

Network Operations

// Network configuration
final config = await provider.getNetworkConfig();
print('Chain ID: ${config.chainId}');
print('Min gas price: ${config.minGasPrice}');
print('Gas per byte: ${config.gasPerDataByte}');

// Network status
final status = await provider.getNetworkStatus();
print('Current round: ${status.currentRound}');
print('Epoch: ${status.epochNumber}');
print('Nonce: ${status.nonce}');

// Network economics (API provider only)
final economics = await apiProvider.getNetworkEconomics();
print('Total Supply: ${economics.totalSupply} EGLD');
print('Staked: ${economics.staked} EGLD');
print('Price: \$${economics.price}');
print('APR: ${(economics.apr * 100).toStringAsFixed(2)}%');
note

The getNetworkEconomics() method is only available on ApiNetworkProvider. Gateway does not support this endpoint and will throw UnsupportedError.

Smart Contract Queries

For smart contract queries, use SmartContractController instead:

// Use SmartContractController for type-safe queries
final controller = SmartContractController(
contractAddress: SmartContractAddress.fromBech32('erd1qqq...'),
networkProvider: provider,
abi: abi,
);

final result = await controller.query(
endpointName: 'getTokenPrice',
arguments: ['WEGLD-bd4d79'],
);

Provider Configuration

Custom HTTP Client

import 'package:http/http.dart' as http;

final customClient = http.Client();

final provider = GatewayNetworkProvider(
baseUrl: 'https://devnet-gateway.multiversx.com',
chainId: ChainId('D'),
);

Timeout Configuration

final provider = GatewayNetworkProvider(
baseUrl: 'https://gateway.multiversx.com',
chainId: ChainId('1'),
);

Multiple Providers

Use different providers for different purposes:

class MultiProvider {
final GatewayNetworkProvider primary;
final GatewayNetworkProvider fallback;

MultiProvider({
required this.primary,
required this.fallback,
});

Future<T> query<T>(Future<T> Function(GatewayNetworkProvider) fn) async {
try {
return await fn(primary);
} catch (e) {
print('Primary failed, trying fallback...');
return await fn(fallback);
}
}
}

// Usage
final multi = MultiProvider(
primary: GatewayNetworkProvider(
baseUrl: 'https://gateway.multiversx.com',
chainId: ChainId('1'),
),
fallback: GatewayNetworkProvider(
baseUrl: 'https://backup-gateway.example.com',
chainId: ChainId('1'),
),
);

final account = await multi.query((p) => p.getAccount(address));

API Endpoints

Gateway Endpoints

OperationEndpoint
Get account/address/{address}
Get tokens/address/{address}/esdt
Get NFTs/address/{address}/nft
Send transaction/transaction/send
Get transaction/transaction/{hash}
Network config/network/config
VM query/vm-values/query

API Endpoints

OperationEndpoint
Get account/accounts/{address}
Get tokens/accounts/{address}/tokens
Get NFTs/accounts/{address}/nfts
Send transaction/transactions
Get transaction/transactions/{hash}
Network config/economics + /constants
Network economics/economics

Response Models

AccountOnNetwork

Account information returned by getAccount():

FieldTypeDescription
addressAddressAccount address
balanceBalanceEGLD balance
nonceNonceTransaction counter
shardintAccount's shard (API only)
txCountint?Total transaction count (API only)
scrCountint?Smart contract result count (API only)
ownerAddressString?Contract owner (for smart contracts)
deployedAtint?Deployment timestamp (for smart contracts)
assetsMap?Account assets/metadata (API only)

TransactionOnNetwork

Transaction information returned by getTransaction():

FieldTypeDescription
txHashStringTransaction hash
transactionTransactionOriginal transaction details
statusTransactionStatusCurrent status
timestampintUnix timestamp
gasUsedintGas consumed
feeStringTotal fee paid
senderShardint?Sender's shard
receiverShardint?Receiver's shard
logsTransactionLogs?Event logs
smartContractResultsList?SC execution results
actionMap?Parsed action details (API only)
operationsList?Token operations (API only)
hyperblockNonceint?Hyperblock nonce
hyperblockHashString?Hyperblock hash

TokenOnNetwork

Token information returned by getFungibleTokensOfAccount():

FieldTypeDescription
identifierStringToken identifier
balanceStringToken balance
decimalsintToken decimals
typeString?Token type (FungibleESDT, etc.)
nameString?Token name
tickerString?Token ticker
ownerString?Token owner address
pricedouble?Current price USD (API only)
marketCapdouble?Market capitalization (API only)
supplyString?Total supply (API only)

NetworkEconomics

Network economics data returned by getNetworkEconomics() (API provider only):

FieldTypeDescription
totalSupplyintTotal EGLD supply
circulatingSupplyintCirculating EGLD supply
stakedintTotal EGLD staked
pricedoubleCurrent EGLD price (USD)
marketCapintEGLD market capitalization (USD)
aprdoubleTotal staking APR
topUpAprdoubleTop-up APR component
baseAprdoubleBase APR component
tokenMarketCapintTotal token market cap (USD)

Error Handling

try {
final account = await provider.getAccount(address);
} on NetworkException catch (e) {
print('Network error: ${e.message}');
// Check for specific errors
if (e.statusCode == 404) {
print('Resource not found');
} else if (e.statusCode == 400) {
print('Invalid request (e.g., invalid address format)');
}
}

Complete Example

import 'package:abidock_mvx/abidock_mvx.dart';

void main() async {
print('=== Network Provider Demo ===\n');

final provider = GatewayNetworkProvider.devnet();

// 1. Network configuration
print('Network Config:');
final config = await provider.getNetworkConfig();
print(' Chain ID: ${config.chainId}');
print(' Gas price: ${config.minGasPrice}');
print(' Gas/byte: ${config.gasPerDataByte}');

// 2. Network status
final status = await provider.getNetworkStatus();
print(' Epoch: ${status.epochNumber}');
print(' Round: ${status.currentRound}');

// 3. Account info
final address = Address.fromBech32(
'erd1qqqqqqqqqqqqqpgq6wegs2xkypfpync8mn2sa5cmpqjlvrhwz5nqgepyg8'
);

final account = await provider.getAccount(address);
print(' Balance: ${account.balance.toDenominatedTrimmed} EGLD');
print(' Nonce: ${account.nonce.value}');

// 4. Token balances
final tokens = await provider.getFungibleTokensOfAccount(address);
for (final token in tokens.take(3)) {
print(' ${token.identifier}: ${token.balance}');
}


}

Next Steps