Skip to content

Commit 12d731d

Browse files
committed
stash started batch compress
1 parent 2a504f8 commit 12d731d

File tree

31 files changed

+1028
-693
lines changed

31 files changed

+1028
-693
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

program-tests/sdk-token-test/src/lib.rs

Lines changed: 70 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,114 +2,137 @@
22

33
use anchor_lang::{prelude::*, solana_program::program::invoke, Discriminator};
44
use light_compressed_token_sdk::{
5-
cpi::{create_compressed_token_instruction, CpiAccounts, CpiInputs},
6-
InputTokenDataWithContext, ValidityProof,
5+
account::CTokenAccount,
6+
cpi_account_infos::TransferAccountInfos,
7+
instructions::transfer::instruction::{
8+
compress, decompress, transfer, CompressInputs, TransferInputs,
9+
},
10+
TokenAccountMeta, ValidityProof,
711
};
8-
912
declare_id!("5p1t1GAaKtK1FKCh5Hd2Gu8JCu3eREhJm4Q2qYfTEPYK");
1013

1114
#[program]
1215
pub mod sdk_token_test {
1316

17+
use light_compressed_token_sdk::instructions::transfer::instruction::DecompressInputs;
18+
1419
use super::*;
1520

16-
pub fn compress<'info>(
21+
pub fn compress_tokens<'info>(
1722
ctx: Context<'_, '_, '_, 'info, Generic<'info>>,
1823
output_tree_index: u8,
1924
recipient: Pubkey, // TODO: make recpient pda
2025
mint: Pubkey, // TODO: deserialize from token account.
2126
amount: u64,
2227
) -> Result<()> {
23-
let mut token_account = light_compressed_token_sdk::account::CTokenAccount::new_empty(
24-
mint,
25-
recipient,
26-
output_tree_index,
27-
);
28-
token_account.compress(amount).unwrap();
29-
30-
let cpi_inputs = CpiInputs::new_compress(vec![token_account]);
31-
32-
let light_cpi_accounts = CpiAccounts::new_compress(
28+
let light_cpi_accounts = TransferAccountInfos::new_compress(
3329
ctx.accounts.signer.as_ref(),
3430
ctx.accounts.signer.as_ref(),
3531
ctx.remaining_accounts,
3632
);
3733

38-
// TODO: add to program error conversion
39-
let instruction =
40-
create_compressed_token_instruction(cpi_inputs, &light_cpi_accounts).unwrap();
34+
let compress_inputs = CompressInputs {
35+
fee_payer: *ctx.accounts.signer.key,
36+
authority: *ctx.accounts.signer.key,
37+
mint,
38+
recipient,
39+
sender_token_account: *light_cpi_accounts.sender_token_account().unwrap().key,
40+
amount,
41+
// can be hardcoded as 0, exposed for flexibility
42+
// and as marker that a tree has to be provided.
43+
output_tree_index,
44+
output_queue_pubkey: *light_cpi_accounts.tree_accounts().unwrap()[0].key,
45+
token_pool_pda: *light_cpi_accounts.token_pool_pda().unwrap().key,
46+
transfer_config: None,
47+
spl_token_program: *light_cpi_accounts.spl_token_program().unwrap().key,
48+
};
49+
50+
let instruction = compress(compress_inputs).map_err(ProgramError::from)?;
51+
msg!("instruction {:?}", instruction);
4152
let account_infos = light_cpi_accounts.to_account_infos();
4253

4354
invoke(&instruction, account_infos.as_slice())?;
4455

4556
Ok(())
4657
}
4758

48-
pub fn transfer<'info>(
59+
pub fn transfer_tokens<'info>(
4960
ctx: Context<'_, '_, '_, 'info, Generic<'info>>,
5061
validity_proof: ValidityProof,
51-
token_data: Vec<InputTokenDataWithContext>,
62+
token_metas: Vec<TokenAccountMeta>,
5263
output_tree_index: u8,
5364
mint: Pubkey,
5465
recipient: Pubkey,
5566
) -> Result<()> {
56-
let mut token_account = light_compressed_token_sdk::account::CTokenAccount::new(
57-
mint,
58-
ctx.accounts.signer.key(), // TODO: reconsider whether this makes sense
59-
token_data,
60-
output_tree_index,
61-
);
62-
// None is the same output_tree_index as token account
63-
let recipient_token_account = token_account.transfer(&recipient, 10, None).unwrap();
64-
65-
let cpi_inputs =
66-
CpiInputs::new(vec![token_account, recipient_token_account], validity_proof);
67-
let light_cpi_accounts = CpiAccounts::new(
67+
let light_cpi_accounts = TransferAccountInfos::new(
6868
ctx.accounts.signer.as_ref(),
6969
ctx.accounts.signer.as_ref(),
7070
ctx.remaining_accounts,
7171
);
72-
73-
// TODO: add to program error conversion
74-
let instruction =
75-
create_compressed_token_instruction(cpi_inputs, &light_cpi_accounts).unwrap();
72+
let sender_account = CTokenAccount::new(
73+
mint,
74+
ctx.accounts.signer.key(),
75+
token_metas,
76+
// We pack the accounts offchain.
77+
output_tree_index,
78+
);
79+
let transfer_inputs = TransferInputs {
80+
fee_payer: ctx.accounts.signer.key(),
81+
// This way we can use CTokenAccount as anchor account type
82+
sender_account,
83+
validity_proof,
84+
recipient,
85+
// This is necessary for on and offchain compatibility.
86+
// This is not an optimal solution because we collect pubkeys into a vector.
87+
tree_pubkeys: light_cpi_accounts.tree_pubkeys().unwrap(),
88+
config: None,
89+
amount: 10,
90+
};
91+
let instruction = transfer(transfer_inputs).unwrap();
7692

7793
let account_infos = light_cpi_accounts.to_account_infos();
7894

79-
// TODO: make invoke_signed
8095
invoke(&instruction, account_infos.as_slice())?;
8196

8297
Ok(())
8398
}
8499

85-
pub fn decompress<'info>(
100+
pub fn decompress_tokens<'info>(
86101
ctx: Context<'_, '_, '_, 'info, Generic<'info>>,
87102
validity_proof: ValidityProof,
88-
token_data: Vec<InputTokenDataWithContext>,
103+
token_data: Vec<TokenAccountMeta>,
89104
output_tree_index: u8,
90105
mint: Pubkey,
91106
) -> Result<()> {
92-
let mut token_account = light_compressed_token_sdk::account::CTokenAccount::new(
107+
let sender_account = light_compressed_token_sdk::account::CTokenAccount::new(
93108
mint,
94-
ctx.accounts.signer.key(), // TODO: reconsider whether this makes sense
109+
ctx.accounts.signer.key(),
95110
token_data,
96111
output_tree_index,
97112
);
98-
token_account.decompress(10).unwrap();
99113

100-
let cpi_inputs = CpiInputs::new(vec![token_account], validity_proof);
101-
let light_cpi_accounts = CpiAccounts::new_decompress(
114+
let light_cpi_accounts = TransferAccountInfos::new_decompress(
102115
ctx.accounts.signer.as_ref(),
103116
ctx.accounts.signer.as_ref(),
104117
ctx.remaining_accounts,
105118
);
106119

107-
// TODO: add to program error conversion
108-
let instruction =
109-
create_compressed_token_instruction(cpi_inputs, &light_cpi_accounts).unwrap();
120+
let inputs = DecompressInputs {
121+
fee_payer: *ctx.accounts.signer.key,
122+
validity_proof,
123+
sender_account,
124+
amount: 10,
125+
tree_pubkeys: light_cpi_accounts.tree_pubkeys().unwrap(),
126+
token_pool_pda: *light_cpi_accounts.token_pool_pda().unwrap().key,
127+
recipient_token_account: *light_cpi_accounts.decompression_recipient().unwrap().key,
128+
// TODO: consider replacing with token program id
129+
spl_token_program: *light_cpi_accounts.spl_token_program().unwrap().key,
130+
config: None,
131+
};
132+
133+
let instruction = decompress(inputs).unwrap();
110134
let account_infos = light_cpi_accounts.to_account_infos();
111135

112-
// TODO: make invoke_signed
113136
invoke(&instruction, account_infos.as_slice())?;
114137

115138
Ok(())

program-tests/sdk-token-test/tests/test.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
#![cfg(feature = "test-sbf")]
1+
// #![cfg(feature = "test-sbf")]
22

33
use anchor_lang::{AccountDeserialize, InstructionData};
44
use anchor_spl::token::TokenAccount;
55
use light_compressed_token_sdk::{
6-
instruction::{get_transfer_instruction_account_metas, TokenAccountsMetaConfig},
6+
instructions::transfer::account_metas::{
7+
get_transfer_instruction_account_metas, TokenAccountsMetaConfig,
8+
},
79
token_pool::get_token_pool_pda,
8-
InputTokenDataWithContext,
10+
TokenAccountMeta, SPL_TOKEN_PROGRAM_ID,
911
};
1012
use light_program_test::{Indexer, LightProgramTest, ProgramTestConfig, Rpc};
1113
use light_sdk::instruction::PackedAccounts;
@@ -284,11 +286,15 @@ async fn compress_spl_tokens(
284286
) -> Result<Signature, RpcError> {
285287
let mut remaining_accounts = PackedAccounts::default();
286288
let token_pool_pda = get_token_pool_pda(&mint);
287-
let config = TokenAccountsMetaConfig::compress(token_pool_pda, token_account, false);
289+
let config = TokenAccountsMetaConfig::compress_client(
290+
token_pool_pda,
291+
token_account,
292+
SPL_TOKEN_PROGRAM_ID.into(),
293+
);
288294
remaining_accounts.add_pre_accounts_signer_mut(payer.pubkey());
289295
let metas = get_transfer_instruction_account_metas(config);
290296
println!("metas {:?}", metas.to_vec());
291-
// Add the token account to pre_accounts for the compression
297+
// Add the token account to pre_accounts for the compressiospl_token_programn
292298
remaining_accounts.add_pre_accounts_metas(metas.as_slice());
293299

294300
let output_tree_index = rpc
@@ -303,7 +309,7 @@ async fn compress_spl_tokens(
303309
let instruction = Instruction {
304310
program_id: sdk_token_test::ID,
305311
accounts: [remaining_accounts].concat(),
306-
data: sdk_token_test::instruction::Compress {
312+
data: sdk_token_test::instruction::CompressTokens {
307313
output_tree_index,
308314
recipient,
309315
mint,
@@ -323,7 +329,7 @@ async fn transfer_compressed_tokens(
323329
compressed_account: &CompressedTokenAccount,
324330
) -> Result<Signature, RpcError> {
325331
let mut remaining_accounts = PackedAccounts::default();
326-
let config = TokenAccountsMetaConfig::new();
332+
let config = TokenAccountsMetaConfig::new_client();
327333
remaining_accounts.add_pre_accounts_signer_mut(payer.pubkey());
328334
let metas = get_transfer_instruction_account_metas(config);
329335
remaining_accounts.add_pre_accounts_metas(metas.as_slice());
@@ -350,22 +356,22 @@ async fn transfer_compressed_tokens(
350356
println!("Transfer tree_info: {:?}", tree_info);
351357

352358
// Create input token data
353-
let token_data = vec![InputTokenDataWithContext {
359+
let token_metas = vec![TokenAccountMeta {
354360
amount: compressed_account.token.amount,
355361
delegate_index: None,
356362
packed_tree_info: tree_info,
357363
lamports: None,
358364
tlv: None,
359365
}];
360366

361-
let (remaining_accounts, _, _) = remaining_accounts.to_account_metas();
367+
let (accounts, _, _) = remaining_accounts.to_account_metas();
362368

363369
let instruction = Instruction {
364370
program_id: sdk_token_test::ID,
365-
accounts: [remaining_accounts].concat(),
366-
data: sdk_token_test::instruction::Transfer {
371+
accounts,
372+
data: sdk_token_test::instruction::TransferTokens {
367373
validity_proof: rpc_result.proof,
368-
token_data,
374+
token_metas,
369375
output_tree_index,
370376
mint: compressed_account.token.mint,
371377
recipient,
@@ -385,8 +391,11 @@ async fn decompress_compressed_tokens(
385391
) -> Result<Signature, RpcError> {
386392
let mut remaining_accounts = PackedAccounts::default();
387393
let token_pool_pda = get_token_pool_pda(&compressed_account.token.mint);
388-
let config =
389-
TokenAccountsMetaConfig::decompress(token_pool_pda, decompress_token_account, false);
394+
let config = TokenAccountsMetaConfig::decompress_client(
395+
token_pool_pda,
396+
decompress_token_account,
397+
SPL_TOKEN_PROGRAM_ID.into(),
398+
);
390399
remaining_accounts.add_pre_accounts_signer_mut(payer.pubkey());
391400
let metas = get_transfer_instruction_account_metas(config);
392401
remaining_accounts.add_pre_accounts_metas(metas.as_slice());
@@ -412,7 +421,7 @@ async fn decompress_compressed_tokens(
412421
.packed_tree_infos[0];
413422

414423
// Create input token data
415-
let token_data = vec![InputTokenDataWithContext {
424+
let token_data = vec![TokenAccountMeta {
416425
amount: compressed_account.token.amount,
417426
delegate_index: None,
418427
packed_tree_info: tree_info,
@@ -426,7 +435,7 @@ async fn decompress_compressed_tokens(
426435
let instruction = Instruction {
427436
program_id: sdk_token_test::ID,
428437
accounts: [remaining_accounts].concat(),
429-
data: sdk_token_test::instruction::Decompress {
438+
data: sdk_token_test::instruction::DecompressTokens {
430439
validity_proof: rpc_result.proof,
431440
token_data,
432441
output_tree_index,

sdk-libs/compressed-token-sdk/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ solana-pubkey = { workspace = true, features = ["sha2", "curve25519"] }
2222
solana-instruction = { workspace = true }
2323
solana-account-info = { workspace = true }
2424
solana-cpi = { workspace = true }
25+
solana-program-error = { workspace = true }
2526

2627
# Optional Anchor dependency
2728
anchor-lang = { workspace = true, optional = true }

0 commit comments

Comments
 (0)