Преглед на файлове

签名问题终于解决了……

skyfffire преди 3 седмици
родител
ревизия
80b00107f7
променени са 2 файла, в които са добавени 29 реда и са изтрити 13 реда
  1. 13 9
      src/exchange/extended_rest_client.rs
  2. 16 4
      src/utils/lib.rs

+ 13 - 9
src/exchange/extended_rest_client.rs

@@ -155,9 +155,9 @@ impl ExtendedRestClient {
         let account = self.account.clone().ok_or_else(|| anyhow!("请将账户传入再进行下单操作"))?;
 
         // 时间戳处理
-        // 1. 获取当前时间,并增加 14 天的缓冲期
+        // 1. 获取当前时间,并增加 1 天的缓冲期
         let now = Utc::now();
-        let expire_time_with_buffer = now + Duration::days(14);
+        let expire_time_with_buffer = now + Duration::hours(1);
 
         // 2. 向上取整到秒
         //    先截断到秒,如果原始时间在截断之后,说明有纳秒部分,需要再加一秒
@@ -167,18 +167,20 @@ impl ExtendedRestClient {
         }
         // 3. 获取 Unix 时间戳 (秒)
         let expire_time_as_seconds = expire_time_rounded.timestamp();
+        // let expire_time_as_seconds = 1760694584i64;
 
         // 需要传给extended的参数整理
-        let id = Uuid::new_v4().to_string();
+        // let id = Uuid::new_v4().to_string();
         let market = self.market.as_str();
         // type
         // side
         // qty
         // price
         let time_in_force = "GTT";
-        let expiry_epoch_millis = expire_time_rounded.timestamp_millis();
-        let nonce_u32: u32 = rand::random();
-        let nonce = nonce_u32.to_string();
+        let expiry_epoch_millis = expire_time_as_seconds * 1000;
+        let nonce_i64 = Utc::now().timestamp_millis();
+        // let nonce_i64 = 1760690983597i64;
+        let nonce = nonce_i64.to_string();
         let self_trade_protection_level = "ACCOUNT";
 
         // 准备OrderHash
@@ -236,7 +238,8 @@ impl ExtendedRestClient {
         let fee_amount = stark_fee_part.to_u64() // Fee 通常是正数
             .context("stark_fee_part 无法转换为 u64")?
             .to_string();
-        let expiration = expire_time_as_seconds.to_string();
+        // !!!!!! 这傻逼签名时间还tm要往后延14天 !!!!!!
+        let expiration = (expire_time_as_seconds + (14 * 24 * 3600)).to_string();
         let salt = nonce.clone();
         let user_public_key_hex = account.stark_public_key.clone();
         let domain_name = "Perpetuals".to_string();
@@ -260,6 +263,7 @@ impl ExtendedRestClient {
             domain_chain_id,
             domain_revision,
         ).unwrap();
+        // info!("hash--------{}", hash.to_hex_string());
         let private_key = Felt::from_hex(account.stark_private_key.as_str())?;
 
         // 签名
@@ -276,6 +280,7 @@ impl ExtendedRestClient {
         });
 
         // 组装最后参数
+        let id = hash.to_hex_string();
         let params = json!({
             "id": id,
             "market": market,
@@ -292,7 +297,7 @@ impl ExtendedRestClient {
             "settlement": settlement,
             "selfTradeProtectionLevel": self_trade_protection_level,
         });
-        info!("{}", serde_json::to_string_pretty(&params)?);
+        // info!("{}", serde_json::to_string_pretty(&params)?);
 
         // 发送订单
         Ok(self.request("POST",
@@ -511,7 +516,6 @@ mod tests {
     async fn test_create_order() {
         let _guard = setup_logging().unwrap();
         let mut client = get_client().await;
-        info!("{}", serde_json::to_string_pretty(&client.market_info).unwrap());
         let response_result = client.post_order("LIMIT", "BUY", "0.0001", "100000").await;
 
         match response_result {

+ 16 - 4
src/utils/lib.rs

@@ -4,7 +4,6 @@ use sha2::{Digest, Sha256};
 use starknet::core::crypto::ecdsa_sign;
 use starknet::core::types::Felt;
 use std::str::FromStr;
-use tracing::info;
 use crate::utils::starknet_messages::{
     AssetId, OffChainMessage, Order, PositionId, StarknetDomain, Timestamp, TransferArgs,
 };
@@ -89,6 +88,21 @@ pub fn get_order_hash(
     domain_chain_id: String,
     domain_revision: String,
 ) -> Result<Felt, String> {
+    // println!("position_id: {}", position_id);
+    // println!("base_asset_id_hex: {}", base_asset_id_hex);
+    // println!("base_amount: {}", base_amount);
+    // println!("quote_asset_id_hex: {}", quote_asset_id_hex);
+    // println!("quote_amount: {}", quote_amount);
+    // println!("fee_asset_id_hex: {}", fee_asset_id_hex);
+    // println!("fee_amount: {}", fee_amount);
+    // println!("expiration: {}", expiration);
+    // println!("salt: {}", salt);
+    // println!("user_public_key_hex: {}", user_public_key_hex);
+    // println!("domain_name: {}", domain_name);
+    // println!("domain_version: {}", domain_version);
+    // println!("domain_chain_id: {}", domain_chain_id);
+    // println!("domain_revision: {}", domain_revision);
+
     let base_asset_id = Felt::from_hex(&base_asset_id_hex)
         .map_err(|e| format!("Invalid base_asset_id_hex: {:?}", e))?;
     let quote_asset_id = Felt::from_hex(&quote_asset_id_hex)
@@ -139,9 +153,7 @@ pub fn get_order_hash(
         chain_id: domain_chain_id,
         revision,
     };
-    
-    info!("{:?}", order);
-    info!("{:?}", domain);
+
     order
         .message_hash(&domain, user_key)
         .map_err(|e| format!("Failed to compute message hash: {:?}", e))