parseJsonRpcAccount function
Parses an arbitrary jsonParsed account provided by the RPC client into
an Account type or a MaybeAccount type if the raw data is null.
The rpcAccount map is expected to have the structure returned by the
Solana RPC getAccountInfo method with jsonParsed encoding:
{
"data": {
"parsed": {
"info": { ... },
"type": "token"
},
"program": "splToken",
"space": 165
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"space": 165
}
Implementation
MaybeAccount<JsonParsedAccountData<Map<String, Object?>>> parseJsonRpcAccount(
Address address,
Map<String, Object?>? rpcAccount,
) {
if (rpcAccount == null) {
return NonExistingAccount<JsonParsedAccountData<Map<String, Object?>>>(
address,
);
}
final dataField = rpcAccount['data']! as Map<String, Object?>;
final parsed = dataField['parsed']! as Map<String, Object?>;
final info = (parsed['info'] as Map<String, Object?>?) ?? <String, Object?>{};
final program = dataField['program'] as String?;
final type = parsed['type'] as String?;
ParsedAccountMeta? meta;
if (program != null || type != null) {
meta = ParsedAccountMeta(program: program ?? '', type: type);
}
final parsedData = JsonParsedAccountData<Map<String, Object?>>(
data: info,
parsedAccountMeta: meta,
);
final baseAccount = parseBaseAccount(rpcAccount);
return ExistingAccount<JsonParsedAccountData<Map<String, Object?>>>(
Account<JsonParsedAccountData<Map<String, Object?>>>(
address: address,
data: parsedData,
executable: baseAccount.executable,
lamports: baseAccount.lamports,
programAddress: baseAccount.programAddress,
space: baseAccount.space,
),
);
}