parseJsonRpcAccount function

MaybeAccount<JsonParsedAccountData<Map<String, Object?>>> parseJsonRpcAccount(
  1. Address address,
  2. Map<String, Object?>? rpcAccount
)

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,
    ),
  );
}