Actions
- Listen to balance change
You can subscribe to _appKitModal.balanceNotifier
to be up to date with balance.
// Example usage:
ValueListenableBuilder<String>(
valueListenable: _appKitModal.balanceNotifier,
builder: (_, balance, __) {
return Text(balance);
},
),
- Launch the current wallet
If you connected your dApp through deep linking to a Wallet app you can launch that wallet app with the following:
_appKitModal.launchConnectedWallet();
- Launch block explorer
You can open the selected chain's block explorer easily:
_appKitModal.launchBlockExplorer();
- Send an RPC request
final bytes = utf8.encode(message);
final encodedMessage = hex.encode(bytes);
final chainId = _appKitModal.selectedChain!.chainId;
final namespace = ReownAppKitModalNetworks.getNamespaceForChainId(chainId);
final result = await _appKitModal.request(
topic: _appKitModal.session!.topic,
chainId: chainId,
request: SessionRequestParams(
method: 'personal_sign',
params: [
'0x$encodedMessage',
_appKitModal.session!.getAddress(namespace)!;
],
),
);
A list of all available methods can be found in constants.dart file, which is already exported for you to use directly from AppKit package.
- List of approved chains by the connected wallet
_appKitModal.getApprovedChains();
- List of approved methods by connected wallet
_appKitModal.getApprovedMethods();
- List of approved events by the connected wallet
_appKitModal.getApprovedEvents();
- Interact with Smart Contracts
These Smart Contract interaction methods only works for EVM chains but you can always structure your smart contract transaction and call the relevant chain method by using request() method.
Read function:
Future<List<dynamic>> requestReadContract({
required String? topic,
required String chainId,
required DeployedContract deployedContract,
required String functionName,
EthereumAddress? sender,
List parameters = const [],
});
Usage:
- Create a
DeployedContract
object
// Create DeployedContract object using contract's ABI and address
final tetherContract = DeployedContract(
ContractAbi.fromJson(
jsonEncode([{.....}]), // ABI object
'Tether USD',
),
EthereumAddress.fromHex('0xdAC17F958D2ee523a2206206994597C13D831ec7'), // https://etherscan.io/token/0xdAC17F958D2ee523a2206206994597C13D831ec7
);
- Read from it by calling a read function
final chainId = _appKitModal.selectedChain!.chainId;
final namespace = ReownAppKitModalNetworks.getNamespaceForChainId(chainId);
// Get token decimals
final decimals = await _appKitModal.requestReadContract(
topic: _appKitModal.session!.topic,
chainId: chainId,
deployedContract: tetherContract,
functionName: 'decimals',
);
// Get balance of wallet
final balanceOf = await _appKitModal.requestReadContract(
deployedContract: tetherContract,
topic: _appKitModal.session!.topic,
chainId: chainId,
functionName: 'balanceOf',
parameters: [
EthereumAddress.fromHex(_appKitModal.session!.getAddress(namespace)),
],
);
// Get token total supply
final totalSupply = await _appKitModal.requestReadContract(
deployedContract: tetherContract,
topic: _appKitModal.session!.topic,
chainId: _appKitModal.selectedChain!.chainId,
functionName: 'totalSupply',
);
- Write function:
Future<dynamic> requestWriteContract({
required String? topic,
required String chainId,
required DeployedContract deployedContract,
required String functionName,
required Transaction transaction,
List<dynamic> parameters = const [],
String? method,
});
Usage:
Write to it by calling a write function, for example, transfer
function from USDC token contract:
final decimalUnits = (decimals.first as BigInt); // decimals value from `decimals` contract function
final transferValue = _formatValue(0.23, decimals: decimalUnits); // your format value function
// Transfer USDT
Future<void> transferToken() async {
final chainId = _appKitModal.selectedChain!.chainId;
final namespace = ReownAppKitModalNetworks.getNamespaceForChainId(chainId);
// Transfer 0.01 amount of Token using Smart Contract's transfer function
final result = await _appKitModal.requestWriteContract(
topic: _appKitModal.session!.topic,
chainId: chainId,
deployedContract: deployedContract,
functionName: 'transfer',
transaction: Transaction(
from: EthereumAddress.fromHex(_appKitModal.session!.getAddress(namespace)), // sender address
),
parameters: [
EthereumAddress.fromHex('0x59e2f66C0E96803206B6486cDb39029abAE834c0'), // recipient address
transferValue, // == 0.23 USDT
],
);
}
Additional example:
Call a sayHello
function of a smart contract to write a message.
// Write a message data
Future<void> writeMessage() async {
final chainId = _appKitModal.selectedChain!.chainId;
final namespace = ReownAppKitModalNetworks.getNamespaceForChainId(chainId);
final result = await _appKitModal.requestWriteContract(
topic: _appKitModal.session!.topic,
chainId: chainId,
deployedContract: deployedContract,
functionName: 'sayHello',
transaction: Transaction(
from: EthereumAddress.fromHex(_appKitModal.session!.getAddress(namespace)), // sender address
),
parameters: ['Hello world!'],
);
}
For a complete example app check out the example app for AppKit