Skip to content

Commit 51b0a9a

Browse files
wip
1 parent 2511fdf commit 51b0a9a

File tree

2 files changed

+65
-59
lines changed

2 files changed

+65
-59
lines changed

sdk-libs/compressed-token-client/src/instructions.rs

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,12 @@ pub struct DecompressParams {
6262

6363
/// Create a compress instruction
6464
///
65-
/// This instruction transfers tokens from an SPL token account to compressed token accounts.
65+
/// This instruction compresses tokens from an SPL token account to N recipients.
6666
pub fn create_compress_instruction(
6767
params: CompressParams,
6868
) -> Result<Instruction, CompressedTokenError> {
6969
let token_program = params.token_program_id.unwrap_or(anchor_spl::token::ID);
7070

71-
// Create output compressed accounts
7271
let output_compressed_accounts = if let Some(ref batch_recipients) = params.batch_recipients {
7372
batch_recipients
7473
.iter()
@@ -87,32 +86,30 @@ pub fn create_compress_instruction(
8786
merkle_tree: params.output_state_tree,
8887
}]
8988
};
90-
91-
// Calculate total amount
9289
let total_amount: u64 = output_compressed_accounts.iter().map(|x| x.amount).sum();
9390

94-
// Create the instruction using the transfer SDK
95-
let mut ix = match transfer_sdk::create_transfer_instruction(
91+
// TODO: refactor.
92+
let ix = match transfer_sdk::create_transfer_instruction(
9693
&params.payer,
9794
&params.owner,
98-
&[], // empty input merkle context for compression
95+
&[],
9996
&output_compressed_accounts,
100-
&[], // empty root indices for compression
101-
&None, // no proof needed for compression
102-
&[], // empty input token data for compression
103-
&[], // empty input compressed accounts for compression
97+
&[],
98+
&None,
99+
&[],
100+
&[],
104101
params.mint,
105-
None, // no delegate
106-
true, // is_compress = true
107-
Some(total_amount), // compress_or_decompress_amount
108-
Some(crate::get_token_pool_pda(&params.mint)), // token_pool_pda
109-
Some(params.source), // compress_or_decompress_token_account
110-
false, // don't sort outputs
111-
None, // no delegate change account
112-
None, // no lamports change account
113-
token_program == spl_token_2022::ID, // is_token_22
114-
&[], // no additional token pools
115-
false, // with_transaction_hash = false
102+
None,
103+
true,
104+
Some(total_amount),
105+
Some(crate::get_token_pool_pda(&params.mint)),
106+
Some(params.source),
107+
false,
108+
None,
109+
None,
110+
token_program == spl_token_2022::ID,
111+
&[],
112+
false,
116113
) {
117114
Ok(ix) => ix,
118115
Err(e) => {
@@ -128,7 +125,7 @@ pub fn create_compress_instruction(
128125

129126
/// Create a decompress instruction
130127
///
131-
/// This instruction transfers tokens from compressed token accounts to an SPL token account.
128+
/// This instruction decompresses compressed tokens to an SPL token account.
132129
pub fn create_decompress_instruction(
133130
params: DecompressParams,
134131
) -> Result<Instruction, CompressedTokenError> {
@@ -140,7 +137,6 @@ pub fn create_decompress_instruction(
140137

141138
let token_program = params.token_program_id.unwrap_or(anchor_spl::token::ID);
142139

143-
// Extract components from input accounts
144140
let (compressed_accounts, token_data, merkle_contexts): (Vec<_>, Vec<_>, Vec<_>) = params
145141
.input_compressed_token_accounts
146142
.into_iter()
@@ -155,13 +151,9 @@ pub fn create_decompress_instruction(
155151
},
156152
);
157153

158-
// Get mint from first token data
159154
let mint = token_data[0].mint;
160-
161-
// Get owner from first token data
162155
let owner = token_data[0].owner;
163156

164-
// Create output state for remaining tokens (if any)
165157
let input_total: u64 = token_data.iter().map(|td| td.amount).sum();
166158
let remaining_amount = input_total.saturating_sub(params.amount);
167159

@@ -178,7 +170,7 @@ pub fn create_decompress_instruction(
178170
vec![]
179171
};
180172

181-
// Create the instruction using the transfer SDK
173+
// TODO: refactor.
182174
transfer_sdk::create_transfer_instruction(
183175
&params.payer,
184176
&owner,
@@ -189,26 +181,24 @@ pub fn create_decompress_instruction(
189181
&token_data,
190182
&compressed_accounts,
191183
mint,
192-
None, // no delegate
193-
false, // is_compress = false
194-
Some(params.amount), // compress_or_decompress_amount
195-
Some(crate::get_token_pool_pda(&mint)), // token_pool_pda
196-
Some(params.to_address), // compress_or_decompress_token_account
197-
false, // don't sort outputs
198-
None, // no delegate change account
199-
None, // no lamports change account
200-
token_program == spl_token_2022::ID, // is_token_22
201-
&[], // no additional token pools
202-
false, // with_transaction_hash = false
184+
None,
185+
false,
186+
Some(params.amount),
187+
Some(crate::get_token_pool_pda(&mint)),
188+
Some(params.to_address),
189+
false,
190+
None,
191+
None,
192+
token_program == spl_token_2022::ID,
193+
&[],
194+
false,
203195
)
204196
.map_err(|e| {
205197
CompressedTokenError::SerializationError(format!("Failed to create instruction: {:?}", e))
206198
})
207199
}
208200

209-
/// Helper function to create a simple compress instruction
210-
///
211-
/// This is a convenience function for the most common compress use case.
201+
/// Create a compress instruction with a single recipient.
212202
pub fn compress(
213203
payer: Pubkey,
214204
owner: Pubkey,
@@ -231,27 +221,32 @@ pub fn compress(
231221
})
232222
}
233223

234-
/// Helper function to create a batch compress instruction
235-
///
236-
/// Compress tokens to multiple recipients in a single transaction.
224+
/// Creates a compress instruction to compress tokens to multiple recipients.
237225
pub fn batch_compress(
238226
payer: Pubkey,
239227
owner: Pubkey,
240228
source_token_account: Pubkey,
241229
mint: Pubkey,
242-
recipients: Vec<(Pubkey, u64)>,
230+
recipients: Vec<Pubkey>,
231+
amounts: Vec<u64>,
243232
output_state_tree: Pubkey,
244233
) -> Result<Instruction, CompressedTokenError> {
234+
if recipients.len() != amounts.len() {
235+
return Err(CompressedTokenError::InvalidParams(
236+
"Recipients and amounts must have the same length".to_string(),
237+
));
238+
}
239+
245240
create_compress_instruction(CompressParams {
246241
payer,
247242
owner,
248243
source: source_token_account,
249-
to_address: Pubkey::default(), // Not used in batch mode
244+
to_address: Pubkey::default(),
250245
mint,
251-
amount: 0, // Not used in batch mode
246+
amount: 0,
252247
output_state_tree,
253248
token_program_id: None,
254-
batch_recipients: Some(recipients),
249+
batch_recipients: Some(recipients.into_iter().zip(amounts).collect()),
255250
})
256251
}
257252

@@ -293,12 +288,21 @@ mod tests {
293288
let output_state_tree = Pubkey::new_unique();
294289

295290
let recipients = vec![
296-
(Pubkey::new_unique(), 500),
297-
(Pubkey::new_unique(), 300),
298-
(Pubkey::new_unique(), 200),
291+
Pubkey::new_unique(),
292+
Pubkey::new_unique(),
293+
Pubkey::new_unique(),
299294
];
295+
let amounts = vec![500, 300, 200];
300296

301-
let result = batch_compress(payer, owner, source, mint, recipients, output_state_tree);
297+
let result = batch_compress(
298+
payer,
299+
owner,
300+
source,
301+
mint,
302+
recipients,
303+
amounts,
304+
output_state_tree,
305+
);
302306

303307
assert!(result.is_ok());
304308
let instruction = result.unwrap();

sdk-libs/compressed-token-client/tests/integration_test.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,22 @@ mod tests {
4848
let output_state_tree = Pubkey::new_unique();
4949

5050
let recipients = vec![
51-
(Pubkey::new_unique(), 500),
52-
(Pubkey::new_unique(), 300),
53-
(Pubkey::new_unique(), 200),
51+
Pubkey::new_unique(),
52+
Pubkey::new_unique(),
53+
Pubkey::new_unique(),
5454
];
55+
let amounts = vec![500, 300, 200];
5556

56-
let total_amount: u64 = recipients.iter().map(|(_, amt)| amt).sum();
57+
let total_amount: u64 = amounts.iter().sum();
5758
assert_eq!(total_amount, 1000);
5859

5960
let instruction = batch_compress(
6061
payer,
6162
owner,
6263
source_token_account,
6364
mint,
64-
recipients.clone(),
65+
recipients,
66+
amounts,
6567
output_state_tree,
6668
)
6769
.expect("Failed to create batch compress instruction");

0 commit comments

Comments
 (0)