Fix token rpc-client methods (#11361)
* Convert None to error in parse_keyed_accounts * Allow encoding configuration in getTokenAccounts methods
This commit is contained in:
parent
cad36e1b3c
commit
d0144ce382
@ -1120,7 +1120,15 @@ fn parse_keyed_accounts(
|
|||||||
request,
|
request,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
pubkey_accounts.push((pubkey, account.decode().unwrap()));
|
pubkey_accounts.push((
|
||||||
|
pubkey,
|
||||||
|
account.decode().ok_or_else(|| {
|
||||||
|
ClientError::new_with_request(
|
||||||
|
RpcError::ParseError("Account from rpc".to_string()).into(),
|
||||||
|
request,
|
||||||
|
)
|
||||||
|
})?,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
Ok(pubkey_accounts)
|
Ok(pubkey_accounts)
|
||||||
}
|
}
|
||||||
|
@ -939,9 +939,11 @@ impl JsonRpcRequestProcessor {
|
|||||||
&self,
|
&self,
|
||||||
owner: &Pubkey,
|
owner: &Pubkey,
|
||||||
token_account_filter: TokenAccountsFilter,
|
token_account_filter: TokenAccountsFilter,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcAccountInfoConfig>,
|
||||||
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
||||||
let bank = self.bank(commitment);
|
let config = config.unwrap_or_default();
|
||||||
|
let bank = self.bank(config.commitment);
|
||||||
|
let encoding = config.encoding.unwrap_or(UiAccountEncoding::Binary);
|
||||||
let (token_program_id, mint) = get_token_program_id_and_mint(&bank, token_account_filter)?;
|
let (token_program_id, mint) = get_token_program_id_and_mint(&bank, token_account_filter)?;
|
||||||
|
|
||||||
let mut filters = vec![
|
let mut filters = vec![
|
||||||
@ -965,7 +967,7 @@ impl JsonRpcRequestProcessor {
|
|||||||
let accounts = get_filtered_program_accounts(&bank, &token_program_id, filters)
|
let accounts = get_filtered_program_accounts(&bank, &token_program_id, filters)
|
||||||
.map(|(pubkey, account)| RpcKeyedAccount {
|
.map(|(pubkey, account)| RpcKeyedAccount {
|
||||||
pubkey: pubkey.to_string(),
|
pubkey: pubkey.to_string(),
|
||||||
account: UiAccount::encode(account, UiAccountEncoding::JsonParsed),
|
account: UiAccount::encode(account, encoding.clone()),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
Ok(new_response(&bank, accounts))
|
Ok(new_response(&bank, accounts))
|
||||||
@ -975,9 +977,11 @@ impl JsonRpcRequestProcessor {
|
|||||||
&self,
|
&self,
|
||||||
delegate: &Pubkey,
|
delegate: &Pubkey,
|
||||||
token_account_filter: TokenAccountsFilter,
|
token_account_filter: TokenAccountsFilter,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcAccountInfoConfig>,
|
||||||
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
||||||
let bank = self.bank(commitment);
|
let config = config.unwrap_or_default();
|
||||||
|
let bank = self.bank(config.commitment);
|
||||||
|
let encoding = config.encoding.unwrap_or(UiAccountEncoding::Binary);
|
||||||
let (token_program_id, mint) = get_token_program_id_and_mint(&bank, token_account_filter)?;
|
let (token_program_id, mint) = get_token_program_id_and_mint(&bank, token_account_filter)?;
|
||||||
|
|
||||||
let mut filters = vec![
|
let mut filters = vec![
|
||||||
@ -1009,7 +1013,7 @@ impl JsonRpcRequestProcessor {
|
|||||||
let accounts = get_filtered_program_accounts(&bank, &token_program_id, filters)
|
let accounts = get_filtered_program_accounts(&bank, &token_program_id, filters)
|
||||||
.map(|(pubkey, account)| RpcKeyedAccount {
|
.map(|(pubkey, account)| RpcKeyedAccount {
|
||||||
pubkey: pubkey.to_string(),
|
pubkey: pubkey.to_string(),
|
||||||
account: UiAccount::encode(account, UiAccountEncoding::JsonParsed),
|
account: UiAccount::encode(account, encoding.clone()),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
Ok(new_response(&bank, accounts))
|
Ok(new_response(&bank, accounts))
|
||||||
@ -1402,7 +1406,7 @@ pub trait RpcSol {
|
|||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
owner_str: String,
|
owner_str: String,
|
||||||
token_account_filter: RpcTokenAccountsFilter,
|
token_account_filter: RpcTokenAccountsFilter,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcAccountInfoConfig>,
|
||||||
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>>;
|
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>>;
|
||||||
|
|
||||||
#[rpc(meta, name = "getTokenAccountsByDelegate")]
|
#[rpc(meta, name = "getTokenAccountsByDelegate")]
|
||||||
@ -1411,7 +1415,7 @@ pub trait RpcSol {
|
|||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
delegate_str: String,
|
delegate_str: String,
|
||||||
token_account_filter: RpcTokenAccountsFilter,
|
token_account_filter: RpcTokenAccountsFilter,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcAccountInfoConfig>,
|
||||||
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>>;
|
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2050,7 +2054,7 @@ impl RpcSol for RpcSolImpl {
|
|||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
owner_str: String,
|
owner_str: String,
|
||||||
token_account_filter: RpcTokenAccountsFilter,
|
token_account_filter: RpcTokenAccountsFilter,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcAccountInfoConfig>,
|
||||||
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
||||||
debug!(
|
debug!(
|
||||||
"get_token_accounts_by_owner rpc request received: {:?}",
|
"get_token_accounts_by_owner rpc request received: {:?}",
|
||||||
@ -2058,7 +2062,7 @@ impl RpcSol for RpcSolImpl {
|
|||||||
);
|
);
|
||||||
let owner = verify_pubkey(owner_str)?;
|
let owner = verify_pubkey(owner_str)?;
|
||||||
let token_account_filter = verify_token_account_filter(token_account_filter)?;
|
let token_account_filter = verify_token_account_filter(token_account_filter)?;
|
||||||
meta.get_token_accounts_by_owner(&owner, token_account_filter, commitment)
|
meta.get_token_accounts_by_owner(&owner, token_account_filter, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_token_accounts_by_delegate(
|
fn get_token_accounts_by_delegate(
|
||||||
@ -2066,7 +2070,7 @@ impl RpcSol for RpcSolImpl {
|
|||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
delegate_str: String,
|
delegate_str: String,
|
||||||
token_account_filter: RpcTokenAccountsFilter,
|
token_account_filter: RpcTokenAccountsFilter,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcAccountInfoConfig>,
|
||||||
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
) -> Result<RpcResponse<Vec<RpcKeyedAccount>>> {
|
||||||
debug!(
|
debug!(
|
||||||
"get_token_accounts_by_delegate rpc request received: {:?}",
|
"get_token_accounts_by_delegate rpc request received: {:?}",
|
||||||
@ -2074,7 +2078,7 @@ impl RpcSol for RpcSolImpl {
|
|||||||
);
|
);
|
||||||
let delegate = verify_pubkey(delegate_str)?;
|
let delegate = verify_pubkey(delegate_str)?;
|
||||||
let token_account_filter = verify_token_account_filter(token_account_filter)?;
|
let token_account_filter = verify_token_account_filter(token_account_filter)?;
|
||||||
meta.get_token_accounts_by_delegate(&delegate, token_account_filter, commitment)
|
meta.get_token_accounts_by_delegate(&delegate, token_account_filter, config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1052,7 +1052,10 @@ Returns all SPL Token accounts by approved Delegate.
|
|||||||
- `<object>` - Either:
|
- `<object>` - Either:
|
||||||
* `mint: <string>` - Pubkey of the specific token Mint to limit accounts to, as base-58 encoded string; or
|
* `mint: <string>` - Pubkey of the specific token Mint to limit accounts to, as base-58 encoded string; or
|
||||||
* `programId: <string>` - Pubkey of the Token program ID that owns the accounts, as base-58 encoded string
|
* `programId: <string>` - Pubkey of the Token program ID that owns the accounts, as base-58 encoded string
|
||||||
- `<object>` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
- `<object>` - (optional) Configuration object containing the following optional fields:
|
||||||
|
- (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
||||||
|
- (optional) `encoding: <string>` - encoding for Account data, either "binary" or jsonParsed". If parameter not provided, the default encoding is binary.
|
||||||
|
Parsed-JSON encoding attempts to use program-specific state parsers to return more human-readable and explicit account state data. If parsed-JSON is requested but a parser cannot be found, the field falls back to binary encoding, detectable when the `data` field is type `<string>`.
|
||||||
|
|
||||||
#### Results:
|
#### Results:
|
||||||
|
|
||||||
@ -1062,7 +1065,7 @@ The result will be an RpcResponse JSON object with `value` equal to an array of
|
|||||||
- `account: <object>` - a JSON object, with the following sub fields:
|
- `account: <object>` - a JSON object, with the following sub fields:
|
||||||
- `lamports: <u64>`, number of lamports assigned to this account, as a u64
|
- `lamports: <u64>`, number of lamports assigned to this account, as a u64
|
||||||
- `owner: <string>`, base-58 encoded Pubkey of the program this account has been assigned to
|
- `owner: <string>`, base-58 encoded Pubkey of the program this account has been assigned to
|
||||||
`data: <object>`, Token state data associated with the account, in JSON format `{<program>: <state>}`
|
- `data: <object>`, Token state data associated with the account, either as base-58 encoded binary data or in JSON format `{<program>: <state>}`
|
||||||
- `executable: <bool>`, boolean indicating if the account contains a program \(and is strictly read-only\)
|
- `executable: <bool>`, boolean indicating if the account contains a program \(and is strictly read-only\)
|
||||||
- `rentEpoch: <u64>`, the epoch at which this account will next owe rent, as u64
|
- `rentEpoch: <u64>`, the epoch at which this account will next owe rent, as u64
|
||||||
|
|
||||||
@ -1070,7 +1073,7 @@ The result will be an RpcResponse JSON object with `value` equal to an array of
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
// Request
|
// Request
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getTokenAccountsByDelegate", "params": ["4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T", {"programId": "TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o"}]}' http://localhost:8899
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getTokenAccountsByDelegate", "params": ["4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T", {"programId": "TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o"}, {"encoding": "jsonParsed"}]}' http://localhost:8899
|
||||||
// Result
|
// Result
|
||||||
{"jsonrpc":"2.0","result":{"context":{"slot":1114},"value":[{"data":{"token":{"account":{"amount":1,"delegate":"4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T","delegatedAmount":1,"isInitialized":true,"isNative":false,"mint":"3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E","owner":"CnPoSPKXu7wJqxe59Fs72tkBeALovhsCxYeFwPCQH9TD"}}},"executable":false,"lamports":1726080,"owner":"TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o","rentEpoch":4},"pubkey":"CnPoSPKXu7wJqxe59Fs72tkBeALovhsCxYeFwPCQH9TD"}],"id":1}
|
{"jsonrpc":"2.0","result":{"context":{"slot":1114},"value":[{"data":{"token":{"account":{"amount":1,"delegate":"4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T","delegatedAmount":1,"isInitialized":true,"isNative":false,"mint":"3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E","owner":"CnPoSPKXu7wJqxe59Fs72tkBeALovhsCxYeFwPCQH9TD"}}},"executable":false,"lamports":1726080,"owner":"TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o","rentEpoch":4},"pubkey":"CnPoSPKXu7wJqxe59Fs72tkBeALovhsCxYeFwPCQH9TD"}],"id":1}
|
||||||
```
|
```
|
||||||
@ -1085,7 +1088,10 @@ Returns all SPL Token accounts by token owner.
|
|||||||
- `<object>` - Either:
|
- `<object>` - Either:
|
||||||
* `mint: <string>` - Pubkey of the specific token Mint to limit accounts to, as base-58 encoded string; or
|
* `mint: <string>` - Pubkey of the specific token Mint to limit accounts to, as base-58 encoded string; or
|
||||||
* `programId: <string>` - Pubkey of the Token program ID that owns the accounts, as base-58 encoded string
|
* `programId: <string>` - Pubkey of the Token program ID that owns the accounts, as base-58 encoded string
|
||||||
- `<object>` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
- `<object>` - (optional) Configuration object containing the following optional fields:
|
||||||
|
- (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
||||||
|
- (optional) `encoding: <string>` - encoding for Account data, either "binary" or jsonParsed". If parameter not provided, the default encoding is binary.
|
||||||
|
Parsed-JSON encoding attempts to use program-specific state parsers to return more human-readable and explicit account state data. If parsed-JSON is requested but a parser cannot be found, the field falls back to binary encoding, detectable when the `data` field is type `<string>`.
|
||||||
|
|
||||||
#### Results:
|
#### Results:
|
||||||
|
|
||||||
@ -1095,7 +1101,7 @@ The result will be an RpcResponse JSON object with `value` equal to an array of
|
|||||||
- `account: <object>` - a JSON object, with the following sub fields:
|
- `account: <object>` - a JSON object, with the following sub fields:
|
||||||
- `lamports: <u64>`, number of lamports assigned to this account, as a u64
|
- `lamports: <u64>`, number of lamports assigned to this account, as a u64
|
||||||
- `owner: <string>`, base-58 encoded Pubkey of the program this account has been assigned to
|
- `owner: <string>`, base-58 encoded Pubkey of the program this account has been assigned to
|
||||||
`data: <object>`, Token state data associated with the account, in JSON format `{<program>: <state>}`
|
- `data: <object>`, Token state data associated with the account, either as base-58 encoded binary data or in JSON format `{<program>: <state>}`
|
||||||
- `executable: <bool>`, boolean indicating if the account contains a program \(and is strictly read-only\)
|
- `executable: <bool>`, boolean indicating if the account contains a program \(and is strictly read-only\)
|
||||||
- `rentEpoch: <u64>`, the epoch at which this account will next owe rent, as u64
|
- `rentEpoch: <u64>`, the epoch at which this account will next owe rent, as u64
|
||||||
|
|
||||||
@ -1103,7 +1109,7 @@ The result will be an RpcResponse JSON object with `value` equal to an array of
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
// Request
|
// Request
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getTokenAccountsByOwner", "params": ["4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F", {"mint":"3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E"}]}' http://localhost:8899
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getTokenAccountsByOwner", "params": ["4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F", {"mint":"3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E"}, {"encoding": "jsonParsed"}]}' http://localhost:8899
|
||||||
// Result
|
// Result
|
||||||
{"jsonrpc":"2.0","result":{"context":{"slot":1114},"value":[{"data":{"token":{"account":{"amount":1,"delegate":null,"delegatedAmount":1,"isInitialized":true,"isNative":false,"mint":"3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E","owner":"4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F"}}},"executable":false,"lamports":1726080,"owner":"TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o","rentEpoch":4},"pubkey":"CnPoSPKXu7wJqxe59Fs72tkBeALovhsCxYeFwPCQH9TD"}],"id":1}
|
{"jsonrpc":"2.0","result":{"context":{"slot":1114},"value":[{"data":{"token":{"account":{"amount":1,"delegate":null,"delegatedAmount":1,"isInitialized":true,"isNative":false,"mint":"3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E","owner":"4Qkev8aNZcqFNSRhQzwyLMFSsi94jHqE8WNVTJzTP99F"}}},"executable":false,"lamports":1726080,"owner":"TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o","rentEpoch":4},"pubkey":"CnPoSPKXu7wJqxe59Fs72tkBeALovhsCxYeFwPCQH9TD"}],"id":1}
|
||||||
```
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user