|
1 | | -use base64::Engine; |
2 | | -use base64::engine::general_purpose::STANDARD; |
3 | | -use bincode::{deserialize, serialize}; |
4 | | -use dotenv::dotenv; |
5 | | - |
| 1 | +use jup::sign_transaction; |
6 | 2 | use jup_ag_sdk::{ |
7 | 3 | JupiterClient, |
8 | | - types::{CreateTriggerOrder, ExecuteTriggerOrder, GetTriggerOrders, OrderStatus}, |
9 | | -}; |
10 | | -use solana_sdk::{ |
11 | | - signature::{Keypair, Signer}, |
12 | | - transaction::VersionedTransaction, |
| 4 | + types::{ |
| 5 | + CreateTriggerOrder, |
| 6 | + ExecuteTriggerOrder, |
| 7 | + GetTriggerOrders, |
| 8 | + OrderStatus, |
| 9 | + // CancelTriggerOrder, |
| 10 | + }, |
13 | 11 | }; |
14 | | -use std::env; |
15 | 12 |
|
16 | | -async fn trigger() { |
| 13 | +pub async fn trigger() { |
| 14 | + // Initialize the Jupiter client |
17 | 15 | let client = JupiterClient::new("https://lite-api.jup.ag"); |
18 | 16 |
|
19 | | - // create order parmas |
20 | | - let data = CreateTriggerOrder::new( |
21 | | - "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", |
22 | | - "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN", |
23 | | - "372sKPyyiwU5zYASHzqvYY48Sv4ihEujfN5rGFKhVQ9j", |
24 | | - "372sKPyyiwU5zYASHzqvYY48Sv4ihEujfN5rGFKhVQ9j", |
25 | | - 10_000_000, // swap 10 USDC for 20 JUP |
26 | | - 20_000_000, |
| 17 | + // User's wallet address |
| 18 | + let user_address = "your wallet address"; // Replace with your actual wallet address |
| 19 | + |
| 20 | + // Create a trigger order to swap 10 USDC for 20 JUP |
| 21 | + let input_mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; // USDC |
| 22 | + let output_mint = "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"; // JUP |
| 23 | + let input_amount = 10_000_000; // 10 USDC |
| 24 | + let output_amount = 20_000_000; // 20 JUP |
| 25 | + |
| 26 | + // Construct the trigger order request |
| 27 | + let create_order_request = CreateTriggerOrder::new( |
| 28 | + input_mint, |
| 29 | + output_mint, |
| 30 | + user_address, |
| 31 | + user_address, |
| 32 | + input_amount, |
| 33 | + output_amount, |
27 | 34 | ); |
28 | 35 |
|
29 | | - // get the unsigned transaction to create the order |
30 | | - let create_order = client |
31 | | - .create_trigger_order(&data) |
| 36 | + // Get the unsigned transaction and request ID for creating the order |
| 37 | + let create_response = client |
| 38 | + .create_trigger_order(&create_order_request) |
32 | 39 | .await |
33 | 40 | .expect("Failed to create trigger order"); |
34 | 41 |
|
35 | | - println!("Create Trigger Order: {:?}", create_order); |
36 | | - |
37 | | - // Load .env variables into std::env |
38 | | - dotenv().ok(); |
39 | | - |
40 | | - // Read the variable |
41 | | - let key = env::var("PRIVATE_KEY").expect("PRIVATE_KEY not set in .env"); |
42 | | - |
43 | | - // if you have the private key in base58 format. Else skip this decode |
44 | | - let key_bytes = bs58::decode(key) |
45 | | - .into_vec() |
46 | | - .expect("Failed to decode base58 private key"); |
47 | | - |
48 | | - let keypair = Keypair::from_bytes(&key_bytes).expect("Failed to create Keypair"); |
49 | | - |
50 | | - let swap_tx_bytes = STANDARD |
51 | | - .decode(create_order.transaction) |
52 | | - .expect("Failed to decode base64 transaction"); |
53 | | - |
54 | | - let mut tx: VersionedTransaction = deserialize(&swap_tx_bytes).unwrap(); |
55 | | - let message = tx.message.serialize(); |
56 | | - |
57 | | - // sign the transaction with the keypair |
58 | | - let signature = keypair.sign_message(&message); |
| 42 | + println!("📦 Created Trigger Order: {:?}", create_response); |
59 | 43 |
|
60 | | - if tx.signatures.is_empty() { |
61 | | - tx.signatures.push(signature); |
62 | | - } else { |
63 | | - tx.signatures[0] = signature; |
64 | | - }; |
65 | | - |
66 | | - let signed_tx_bytes = serialize(&tx).unwrap(); |
67 | | - let base64_signed_tx = STANDARD.encode(&signed_tx_bytes); |
| 44 | + // Sign the transaction locally |
| 45 | + let signed_tx_base64 = sign_transaction(create_response.transaction); |
68 | 46 |
|
69 | | - // here we execute the trigger order. Instead this you can directly send the transaction using a rpc |
70 | | - let exe = ExecuteTriggerOrder { |
71 | | - request_id: create_order.request_id, |
72 | | - signed_transaction: base64_signed_tx, |
| 47 | + // Send the signed transaction for execution |
| 48 | + let execute_request = ExecuteTriggerOrder { |
| 49 | + request_id: create_response.request_id, |
| 50 | + signed_transaction: signed_tx_base64, |
73 | 51 | }; |
74 | 52 |
|
75 | | - let execute = client |
76 | | - .execute_trigger_order(&exe) |
| 53 | + let execute_response = client |
| 54 | + .execute_trigger_order(&execute_request) |
77 | 55 | .await |
78 | 56 | .expect("Failed to execute trigger order"); |
79 | 57 |
|
80 | | - println!("Execute Trigger Order: {:?}", execute); |
| 58 | + println!( |
| 59 | + "🚀 Executed Trigger Order, singnature: {}", |
| 60 | + execute_response.signature |
| 61 | + ); |
81 | 62 |
|
82 | | - // get trigger orders for user address |
83 | | - let params = GetTriggerOrders { |
84 | | - user: "372sKPyyiwU5zYASHzqvYY48Sv4ihEujfN5rGFKhVQ9j".to_string(), |
| 63 | + // Fetch the list of trigger orders for the user |
| 64 | + let get_orders_params = GetTriggerOrders { |
| 65 | + user: user_address.to_string(), |
85 | 66 | order_status: OrderStatus::History, |
86 | 67 | input_mint: None, |
87 | 68 | output_mint: None, |
88 | 69 | include_failed_tx: None, |
89 | 70 | page: None, |
90 | 71 | }; |
91 | 72 |
|
92 | | - let orders = client |
93 | | - .get_trigger_orders(¶ms) |
| 73 | + let order_history = client |
| 74 | + .get_trigger_orders(&get_orders_params) |
94 | 75 | .await |
95 | 76 | .expect("Failed to get trigger orders"); |
96 | 77 |
|
97 | | - println!("Trigger Orders: {:?}", orders); |
98 | | - |
99 | | - // cance a trigger order |
100 | | - // let cancel = CancelTriggerOrder::new( |
101 | | - // "372sKPyyiwU5zYASHzqvYY48Sv4ihEujfN5rGFKhVQ9j", |
102 | | - // "HeyWQcYd9t6BFGDfwh3w13F9KmiSNyPJuRPm49kiynFs", |
103 | | - // ); |
104 | | - // |
105 | | - // let cancel_order = client |
106 | | - // .cancel_trigger_order(&cancel) |
107 | | - // .await |
108 | | - // .expect("Failed to cancel trigger order"); |
109 | | - // |
110 | | - // println!("Cancel Trigger Order: {:?}", cancel_order); |
111 | | - // |
112 | | - // and then sign the transaction and excute same as the create_order |
| 78 | + println!("📖 Trigger Order History: {:?}", order_history); |
| 79 | + |
| 80 | + // --- Cancel a trigger order --- |
| 81 | + /* |
| 82 | + let cancel_request = CancelTriggerOrder::new( |
| 83 | + user_address, |
| 84 | + "HeyWQcYd9t6BFGDfwh3w13F9KmiSNyPJuRPm49kiynFs", // Order ID to cancel |
| 85 | + ); |
| 86 | +
|
| 87 | + let cancel_response = client |
| 88 | + .cancel_trigger_order(&cancel_request) |
| 89 | + .await |
| 90 | + .expect("Failed to cancel trigger order"); |
| 91 | +
|
| 92 | + println!("❌ Cancelled Trigger Order: {:?}", cancel_response); |
| 93 | +
|
| 94 | + // Sign and execute cancel transaction same as above |
| 95 | + */ |
113 | 96 | } |
0 commit comments