near_dart 0.1.0
near_dart: ^0.1.0 copied to clipboard
Complete NEAR Protocol SDK for Flutter/Dart. RPC client, wallet integration, and type-safe primitives.
near_dart #
Complete NEAR Protocol SDK for Flutter/Dart.
A type-safe, platform-agnostic SDK for building NEAR Protocol applications with Flutter and Dart. Works on iOS, Android, Web, and Desktop.
Features #
- RPC Client: Query blockchain state, accounts, contracts, and validators
- Wallet Integration: Connect wallets via WalletConnect or deep links
- Type-Safe Primitives:
AccountId,NearToken,PublicKey,CryptoHash - Transaction Building: Construct and sign transactions with multiple actions
- NEP-413 Support: Message signing for authentication
Installation #
dependencies:
near_dart: ^0.1.0
Quick Start #
import 'package:near_dart/near_dart.dart';
void main() async {
// Create client (mainnet or testnet)
final client = NearRpcClient.mainnet();
// Get network status
final status = await client.status();
switch (status) {
case RpcSuccess(:final value):
print('Chain: ${value.chainId}');
print('Block: ${value.syncInfo.latestBlockHeight}');
case RpcFailure(:final error):
print('Error: ${error.message}');
}
// Query account
final result = await client.viewAccount(
accountId: AccountId('alice.near'),
blockReference: BlockReference.finality(Finality.final_),
);
if (result.isSuccess) {
final account = result.getOrNull()!;
print('Balance: ${account.amount.toNear()} NEAR');
}
client.close();
}
RPC Client #
Network Status #
final result = await client.status();
Account Information #
final result = await client.viewAccount(
accountId: AccountId('alice.near'),
blockReference: BlockReference.finality(Finality.final_),
);
Call Contract View Function #
final result = await client.callFunction(
accountId: AccountId('token.near'),
methodName: 'ft_balance_of',
args: {'account_id': 'alice.near'},
blockReference: BlockReference.finality(Finality.final_),
);
if (result.isSuccess) {
final balance = result.getOrNull()!.resultAsJson();
print('Token balance: $balance');
}
Validators #
final result = await client.validators();
if (result.isSuccess) {
final validators = result.getOrNull()!;
print('Current validators: ${validators.currentValidators.length}');
}
Wallet Integration #
Building Transactions #
// Simple transfer
final tx = Transaction(
signerId: AccountId('alice.near'),
receiverId: AccountId('bob.near'),
actions: [
TransferAction(deposit: NearToken.fromNear(1)),
],
);
// Contract function call
final tx = Transaction(
signerId: AccountId('alice.near'),
receiverId: AccountId('token.near'),
actions: [
FunctionCallAction(
methodName: 'ft_transfer',
args: {'receiver_id': 'bob.near', 'amount': '1000000'},
deposit: NearToken.oneYocto(),
),
],
);
Action Types #
CreateAccountAction()
DeployContractAction(code: wasmBytes)
FunctionCallAction(methodName: 'method', args: {...}, deposit: NearToken.zero())
TransferAction(deposit: NearToken.fromNear(10))
StakeAction(stake: NearToken.fromNear(100), publicKey: PublicKey('ed25519:...'))
AddKeyAction(publicKey: key, accessKey: FullAccessKey())
DeleteKeyAction(publicKey: key)
DeleteAccountAction(beneficiaryId: AccountId('beneficiary.near'))
MyNearWallet Integration #
final adapter = MyNearWalletAdapter(
config: MyNearWalletConfig(
contractId: AccountId('app.near'),
successUrl: 'myapp://callback/success',
failureUrl: 'myapp://callback/failure',
network: MyNearWalletNetwork.mainnet,
),
launchUrl: (uri) async {
// Use url_launcher package
return await launchUrl(uri, mode: LaunchMode.externalApplication);
},
);
// Sign in
await adapter.signIn(contractId: AccountId('app.near'));
// Handle callback in your app
final callback = adapter.handleCallback(callbackUri);
if (callback.isSuccess) {
print('Connected: ${callback.accountId}');
}
Type-Safe Primitives #
AccountId #
final account = AccountId('alice.near'); // Validates format
NearToken #
final amount = NearToken.fromNear(10); // 10 NEAR
final small = NearToken.oneYocto(); // 1 yoctoNEAR
final zero = NearToken.zero();
print(amount.toNear()); // 10.0
PublicKey #
final key = PublicKey('ed25519:6E8sCci9badyRkXb3JoRpBj5p8C6Tw41ELDZoiihKEtp');
print(key.keyType); // KeyType.ed25519
BlockReference #
BlockReference.finality(Finality.final_) // Latest finalized
BlockReference.finality(Finality.optimistic) // Latest (may reorg)
BlockReference.blockId(123456789) // Specific height
BlockReference.blockHash(CryptoHash('...')) // Specific hash
Error Handling #
final result = await client.viewAccount(...);
switch (result) {
case RpcSuccess(:final value):
print('Balance: ${value.amount.toNear()}');
case RpcFailure(:final error):
switch (error.kind) {
case RpcErrorKind.rpcError:
print('RPC error: ${error.message}');
case RpcErrorKind.networkError:
print('Network error');
case RpcErrorKind.timeout:
print('Request timeout');
default:
print('Error: ${error.message}');
}
}
Example App #
See the example directory for a complete Flutter app demonstrating network status and account lookup.
Testing #
dart test
111 tests covering unit tests, integration tests against NEAR testnet and mainnet.
License #
MIT License - see LICENSE for details.