Update to token pack/unpack changes (#11900)
This commit is contained in:
parent
c4253dc0f9
commit
2eff9a19c3
|
@ -4649,9 +4649,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spl-token"
|
name = "spl-token"
|
||||||
version = "2.0.1"
|
version = "2.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "89ee48031d5b189a9da7295076ba07bf0ccd407e0fee1279281fb2c3258fa9fb"
|
checksum = "b7f6163bedb29690345acc9614295c8fdabc1251d4e87a3d72edf48487e937a0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayref",
|
"arrayref",
|
||||||
"num-derive 0.3.0",
|
"num-derive 0.3.0",
|
||||||
|
|
|
@ -19,7 +19,7 @@ solana-config-program = { path = "../programs/config", version = "1.4.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.4.0" }
|
solana-sdk = { path = "../sdk", version = "1.4.0" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.4.0" }
|
solana-stake-program = { path = "../programs/stake", version = "1.4.0" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.4.0" }
|
solana-vote-program = { path = "../programs/vote", version = "1.4.0" }
|
||||||
spl-token-v2-0 = { package = "spl-token", version = "2.0.1", features = ["skip-no-mangle"] }
|
spl-token-v2-0 = { package = "spl-token", version = "2.0.2", features = ["skip-no-mangle"] }
|
||||||
serde = "1.0.112"
|
serde = "1.0.112"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.56"
|
serde_json = "1.0.56"
|
||||||
|
|
|
@ -9,7 +9,7 @@ use spl_token_v2_0::{
|
||||||
solana_sdk::pubkey::Pubkey as SplTokenPubkey,
|
solana_sdk::pubkey::Pubkey as SplTokenPubkey,
|
||||||
state::{Account, AccountState, Mint, Multisig},
|
state::{Account, AccountState, Mint, Multisig},
|
||||||
};
|
};
|
||||||
use std::{mem::size_of, str::FromStr};
|
use std::str::FromStr;
|
||||||
|
|
||||||
// A helper function to convert spl_token_v2_0::id() as spl_sdk::pubkey::Pubkey to
|
// A helper function to convert spl_token_v2_0::id() as spl_sdk::pubkey::Pubkey to
|
||||||
// solana_sdk::pubkey::Pubkey
|
// solana_sdk::pubkey::Pubkey
|
||||||
|
@ -27,7 +27,7 @@ pub fn parse_token(
|
||||||
data: &[u8],
|
data: &[u8],
|
||||||
mint_decimals: Option<u8>,
|
mint_decimals: Option<u8>,
|
||||||
) -> Result<TokenAccountType, ParseAccountError> {
|
) -> Result<TokenAccountType, ParseAccountError> {
|
||||||
if data.len() == size_of::<Account>() {
|
if data.len() == Account::get_packed_len() {
|
||||||
let account = Account::unpack(data)
|
let account = Account::unpack(data)
|
||||||
.map_err(|_| ParseAccountError::AccountNotParsable(ParsableAccount::SplToken))?;
|
.map_err(|_| ParseAccountError::AccountNotParsable(ParsableAccount::SplToken))?;
|
||||||
let decimals = mint_decimals.ok_or_else(|| {
|
let decimals = mint_decimals.ok_or_else(|| {
|
||||||
|
@ -62,7 +62,7 @@ pub fn parse_token(
|
||||||
COption::None => None,
|
COption::None => None,
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
} else if data.len() == size_of::<Mint>() {
|
} else if data.len() == Mint::get_packed_len() {
|
||||||
let mint = Mint::unpack(data)
|
let mint = Mint::unpack(data)
|
||||||
.map_err(|_| ParseAccountError::AccountNotParsable(ParsableAccount::SplToken))?;
|
.map_err(|_| ParseAccountError::AccountNotParsable(ParsableAccount::SplToken))?;
|
||||||
Ok(TokenAccountType::Mint(UiMint {
|
Ok(TokenAccountType::Mint(UiMint {
|
||||||
|
@ -78,7 +78,7 @@ pub fn parse_token(
|
||||||
COption::None => None,
|
COption::None => None,
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
} else if data.len() == size_of::<Multisig>() {
|
} else if data.len() == Multisig::get_packed_len() {
|
||||||
let multisig = Multisig::unpack(data)
|
let multisig = Multisig::unpack(data)
|
||||||
.map_err(|_| ParseAccountError::AccountNotParsable(ParsableAccount::SplToken))?;
|
.map_err(|_| ParseAccountError::AccountNotParsable(ParsableAccount::SplToken))?;
|
||||||
Ok(TokenAccountType::Multisig(UiMultisig {
|
Ok(TokenAccountType::Multisig(UiMultisig {
|
||||||
|
@ -186,7 +186,7 @@ pub struct UiMultisig {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_token_account_mint(data: &[u8]) -> Option<Pubkey> {
|
pub fn get_token_account_mint(data: &[u8]) -> Option<Pubkey> {
|
||||||
if data.len() == size_of::<Account>() {
|
if data.len() == Account::get_packed_len() {
|
||||||
Some(Pubkey::new(&data[0..32]))
|
Some(Pubkey::new(&data[0..32]))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -201,7 +201,7 @@ mod test {
|
||||||
fn test_parse_token() {
|
fn test_parse_token() {
|
||||||
let mint_pubkey = SplTokenPubkey::new(&[2; 32]);
|
let mint_pubkey = SplTokenPubkey::new(&[2; 32]);
|
||||||
let owner_pubkey = SplTokenPubkey::new(&[3; 32]);
|
let owner_pubkey = SplTokenPubkey::new(&[3; 32]);
|
||||||
let mut account_data = [0; size_of::<Account>()];
|
let mut account_data = vec![0; Account::get_packed_len()];
|
||||||
Account::unpack_unchecked_mut(&mut account_data, &mut |account: &mut Account| {
|
Account::unpack_unchecked_mut(&mut account_data, &mut |account: &mut Account| {
|
||||||
account.mint = mint_pubkey;
|
account.mint = mint_pubkey;
|
||||||
account.owner = owner_pubkey;
|
account.owner = owner_pubkey;
|
||||||
|
@ -233,7 +233,7 @@ mod test {
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut mint_data = [0; size_of::<Mint>()];
|
let mut mint_data = vec![0; Mint::get_packed_len()];
|
||||||
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
||||||
mint.mint_authority = COption::Some(owner_pubkey);
|
mint.mint_authority = COption::Some(owner_pubkey);
|
||||||
mint.supply = 42;
|
mint.supply = 42;
|
||||||
|
@ -258,7 +258,7 @@ mod test {
|
||||||
let signer1 = SplTokenPubkey::new(&[1; 32]);
|
let signer1 = SplTokenPubkey::new(&[1; 32]);
|
||||||
let signer2 = SplTokenPubkey::new(&[2; 32]);
|
let signer2 = SplTokenPubkey::new(&[2; 32]);
|
||||||
let signer3 = SplTokenPubkey::new(&[3; 32]);
|
let signer3 = SplTokenPubkey::new(&[3; 32]);
|
||||||
let mut multisig_data = [0; size_of::<Multisig>()];
|
let mut multisig_data = vec![0; Multisig::get_packed_len()];
|
||||||
let mut signers = [SplTokenPubkey::default(); 11];
|
let mut signers = [SplTokenPubkey::default(); 11];
|
||||||
signers[0] = signer1;
|
signers[0] = signer1;
|
||||||
signers[1] = signer2;
|
signers[1] = signer2;
|
||||||
|
@ -292,7 +292,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_token_account_mint() {
|
fn test_get_token_account_mint() {
|
||||||
let mint_pubkey = SplTokenPubkey::new(&[2; 32]);
|
let mint_pubkey = SplTokenPubkey::new(&[2; 32]);
|
||||||
let mut account_data = [0; size_of::<Account>()];
|
let mut account_data = vec![0; Account::get_packed_len()];
|
||||||
Account::unpack_unchecked_mut(&mut account_data, &mut |account: &mut Account| {
|
Account::unpack_unchecked_mut(&mut account_data, &mut |account: &mut Account| {
|
||||||
account.mint = mint_pubkey;
|
account.mint = mint_pubkey;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -67,7 +67,7 @@ solana-transaction-status = { path = "../transaction-status", version = "1.4.0"
|
||||||
solana-version = { path = "../version", version = "1.4.0" }
|
solana-version = { path = "../version", version = "1.4.0" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.4.0" }
|
solana-vote-program = { path = "../programs/vote", version = "1.4.0" }
|
||||||
solana-vote-signer = { path = "../vote-signer", version = "1.4.0" }
|
solana-vote-signer = { path = "../vote-signer", version = "1.4.0" }
|
||||||
spl-token-v2-0 = { package = "spl-token", version = "2.0.1", features = ["skip-no-mangle"] }
|
spl-token-v2-0 = { package = "spl-token", version = "2.0.2", features = ["skip-no-mangle"] }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
tokio = { version = "0.2.22", features = ["full"] }
|
tokio = { version = "0.2.22", features = ["full"] }
|
||||||
|
|
|
@ -65,7 +65,6 @@ use spl_token_v2_0::{
|
||||||
use std::{
|
use std::{
|
||||||
cmp::{max, min},
|
cmp::{max, min},
|
||||||
collections::{HashMap, HashSet},
|
collections::{HashMap, HashSet},
|
||||||
mem::size_of,
|
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
sync::{
|
sync::{
|
||||||
|
@ -1080,7 +1079,7 @@ impl JsonRpcRequestProcessor {
|
||||||
encoding: None,
|
encoding: None,
|
||||||
}),
|
}),
|
||||||
// Filter on Token Account state
|
// Filter on Token Account state
|
||||||
RpcFilterType::DataSize(size_of::<TokenAccount>() as u64),
|
RpcFilterType::DataSize(TokenAccount::get_packed_len() as u64),
|
||||||
];
|
];
|
||||||
let mut token_balances: Vec<RpcTokenAccountBalance> =
|
let mut token_balances: Vec<RpcTokenAccountBalance> =
|
||||||
get_filtered_program_accounts(&bank, &mint_owner, filters)
|
get_filtered_program_accounts(&bank, &mint_owner, filters)
|
||||||
|
@ -1128,7 +1127,7 @@ impl JsonRpcRequestProcessor {
|
||||||
encoding: None,
|
encoding: None,
|
||||||
}),
|
}),
|
||||||
// Filter on Token Account state
|
// Filter on Token Account state
|
||||||
RpcFilterType::DataSize(size_of::<TokenAccount>() as u64),
|
RpcFilterType::DataSize(TokenAccount::get_packed_len() as u64),
|
||||||
];
|
];
|
||||||
if let Some(mint) = mint {
|
if let Some(mint) = mint {
|
||||||
// Optional filter on Mint address
|
// Optional filter on Mint address
|
||||||
|
@ -1187,7 +1186,7 @@ impl JsonRpcRequestProcessor {
|
||||||
encoding: None,
|
encoding: None,
|
||||||
}),
|
}),
|
||||||
// Filter on Token Account state
|
// Filter on Token Account state
|
||||||
RpcFilterType::DataSize(size_of::<TokenAccount>() as u64),
|
RpcFilterType::DataSize(TokenAccount::get_packed_len() as u64),
|
||||||
];
|
];
|
||||||
if let Some(mint) = mint {
|
if let Some(mint) = mint {
|
||||||
// Optional filter on Mint address
|
// Optional filter on Mint address
|
||||||
|
@ -4727,7 +4726,7 @@ pub mod tests {
|
||||||
fn test_token_rpcs() {
|
fn test_token_rpcs() {
|
||||||
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&Pubkey::new_rand());
|
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&Pubkey::new_rand());
|
||||||
|
|
||||||
let mut account_data = [0; size_of::<TokenAccount>()];
|
let mut account_data = vec![0; TokenAccount::get_packed_len()];
|
||||||
let mint = SplTokenPubkey::new(&[2; 32]);
|
let mint = SplTokenPubkey::new(&[2; 32]);
|
||||||
let owner = SplTokenPubkey::new(&[3; 32]);
|
let owner = SplTokenPubkey::new(&[3; 32]);
|
||||||
let delegate = SplTokenPubkey::new(&[4; 32]);
|
let delegate = SplTokenPubkey::new(&[4; 32]);
|
||||||
|
@ -4755,7 +4754,7 @@ pub mod tests {
|
||||||
bank.store_account(&token_account_pubkey, &token_account);
|
bank.store_account(&token_account_pubkey, &token_account);
|
||||||
|
|
||||||
// Add the mint
|
// Add the mint
|
||||||
let mut mint_data = [0; size_of::<Mint>()];
|
let mut mint_data = vec![0; Mint::get_packed_len()];
|
||||||
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
||||||
*mint = Mint {
|
*mint = Mint {
|
||||||
mint_authority: COption::Some(owner),
|
mint_authority: COption::Some(owner),
|
||||||
|
@ -4829,7 +4828,7 @@ pub mod tests {
|
||||||
bank.store_account(&other_token_account_pubkey, &token_account);
|
bank.store_account(&other_token_account_pubkey, &token_account);
|
||||||
|
|
||||||
// Add another token account with the same owner and delegate but different mint
|
// Add another token account with the same owner and delegate but different mint
|
||||||
let mut account_data = [0; size_of::<TokenAccount>()];
|
let mut account_data = vec![0; TokenAccount::get_packed_len()];
|
||||||
let new_mint = SplTokenPubkey::new(&[5; 32]);
|
let new_mint = SplTokenPubkey::new(&[5; 32]);
|
||||||
TokenAccount::unpack_unchecked_mut(&mut account_data, &mut |account: &mut TokenAccount| {
|
TokenAccount::unpack_unchecked_mut(&mut account_data, &mut |account: &mut TokenAccount| {
|
||||||
*account = TokenAccount {
|
*account = TokenAccount {
|
||||||
|
@ -5038,7 +5037,7 @@ pub mod tests {
|
||||||
assert!(accounts.is_empty());
|
assert!(accounts.is_empty());
|
||||||
|
|
||||||
// Add new_mint, and another token account on new_mint with different balance
|
// Add new_mint, and another token account on new_mint with different balance
|
||||||
let mut mint_data = [0; size_of::<Mint>()];
|
let mut mint_data = vec![0; Mint::get_packed_len()];
|
||||||
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
||||||
*mint = Mint {
|
*mint = Mint {
|
||||||
mint_authority: COption::Some(owner),
|
mint_authority: COption::Some(owner),
|
||||||
|
@ -5060,7 +5059,7 @@ pub mod tests {
|
||||||
&Pubkey::from_str(&new_mint.to_string()).unwrap(),
|
&Pubkey::from_str(&new_mint.to_string()).unwrap(),
|
||||||
&mint_account,
|
&mint_account,
|
||||||
);
|
);
|
||||||
let mut account_data = [0; size_of::<TokenAccount>()];
|
let mut account_data = vec![0; TokenAccount::get_packed_len()];
|
||||||
TokenAccount::unpack_unchecked_mut(&mut account_data, &mut |account: &mut TokenAccount| {
|
TokenAccount::unpack_unchecked_mut(&mut account_data, &mut |account: &mut TokenAccount| {
|
||||||
*account = TokenAccount {
|
*account = TokenAccount {
|
||||||
mint: new_mint,
|
mint: new_mint,
|
||||||
|
@ -5121,7 +5120,7 @@ pub mod tests {
|
||||||
fn test_token_parsing() {
|
fn test_token_parsing() {
|
||||||
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&Pubkey::new_rand());
|
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&Pubkey::new_rand());
|
||||||
|
|
||||||
let mut account_data = [0; size_of::<TokenAccount>()];
|
let mut account_data = vec![0; TokenAccount::get_packed_len()];
|
||||||
let mint = SplTokenPubkey::new(&[2; 32]);
|
let mint = SplTokenPubkey::new(&[2; 32]);
|
||||||
let owner = SplTokenPubkey::new(&[3; 32]);
|
let owner = SplTokenPubkey::new(&[3; 32]);
|
||||||
let delegate = SplTokenPubkey::new(&[4; 32]);
|
let delegate = SplTokenPubkey::new(&[4; 32]);
|
||||||
|
@ -5149,7 +5148,7 @@ pub mod tests {
|
||||||
bank.store_account(&token_account_pubkey, &token_account);
|
bank.store_account(&token_account_pubkey, &token_account);
|
||||||
|
|
||||||
// Add the mint
|
// Add the mint
|
||||||
let mut mint_data = [0; size_of::<Mint>()];
|
let mut mint_data = vec![0; Mint::get_packed_len()];
|
||||||
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
Mint::unpack_unchecked_mut(&mut mint_data, &mut |mint: &mut Mint| {
|
||||||
*mint = Mint {
|
*mint = Mint {
|
||||||
mint_authority: COption::Some(owner),
|
mint_authority: COption::Some(owner),
|
||||||
|
@ -5180,7 +5179,7 @@ pub mod tests {
|
||||||
result["result"]["value"]["data"],
|
result["result"]["value"]["data"],
|
||||||
json!({
|
json!({
|
||||||
"program": "spl-token",
|
"program": "spl-token",
|
||||||
"space": 176,
|
"space": TokenAccount::get_packed_len(),
|
||||||
"parsed": {
|
"parsed": {
|
||||||
"type": "account",
|
"type": "account",
|
||||||
"info": {
|
"info": {
|
||||||
|
@ -5222,7 +5221,7 @@ pub mod tests {
|
||||||
result["result"]["value"]["data"],
|
result["result"]["value"]["data"],
|
||||||
json!({
|
json!({
|
||||||
"program": "spl-token",
|
"program": "spl-token",
|
||||||
"space": 88,
|
"space": Mint::get_packed_len(),
|
||||||
"parsed": {
|
"parsed": {
|
||||||
"type": "mint",
|
"type": "mint",
|
||||||
"info": {
|
"info": {
|
||||||
|
|
|
@ -19,7 +19,7 @@ solana-sdk = { path = "../sdk", version = "1.4.0" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.4.0" }
|
solana-stake-program = { path = "../programs/stake", version = "1.4.0" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.4.0" }
|
solana-vote-program = { path = "../programs/vote", version = "1.4.0" }
|
||||||
spl-memo-v1-0 = { package = "spl-memo", version = "1.0.7", features = ["skip-no-mangle"] }
|
spl-memo-v1-0 = { package = "spl-memo", version = "1.0.7", features = ["skip-no-mangle"] }
|
||||||
spl-token-v2-0 = { package = "spl-token", version = "2.0.1", features = ["skip-no-mangle"] }
|
spl-token-v2-0 = { package = "spl-token", version = "2.0.2", features = ["skip-no-mangle"] }
|
||||||
serde = "1.0.112"
|
serde = "1.0.112"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.56"
|
serde_json = "1.0.56"
|
||||||
|
|
Loading…
Reference in New Issue