@@ -13,7 +13,7 @@ use crate::{
1313 actions:: {
1414 ApproveAgent , ApproveBuilderFee , BulkCancel , BulkModify , BulkOrder , ClaimRewards ,
1515 EvmUserModify , ScheduleCancel , SetReferrer , UpdateIsolatedMargin , UpdateLeverage ,
16- UsdSend ,
16+ UsdClassTransfer , UsdSend ,
1717 } ,
1818 cancel:: { CancelRequest , CancelRequestCloid , ClientCancelRequestCloid } ,
1919 modify:: { ClientModifyRequest , ModifyRequest } ,
@@ -26,8 +26,7 @@ use crate::{
2626 prelude:: * ,
2727 req:: HttpClient ,
2828 signature:: { sign_l1_action, sign_typed_data} ,
29- BaseUrl , BulkCancelCloid , ClassTransfer , Error , ExchangeResponseStatus , SpotSend , SpotUser ,
30- VaultTransfer , Withdraw3 ,
29+ BaseUrl , BulkCancelCloid , Error , ExchangeResponseStatus , SpotSend , VaultTransfer , Withdraw3 ,
3130} ;
3231
3332#[ derive( Debug ) ]
@@ -57,6 +56,8 @@ struct ExchangePayload {
5756 #[ serde( serialize_with = "serialize_sig" ) ]
5857 signature : Signature ,
5958 nonce : u64 ,
59+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
60+ // TODO: check if skip is needed
6061 vault_address : Option < Address > ,
6162}
6263
@@ -73,14 +74,14 @@ pub enum Actions {
7374 BatchModify ( BulkModify ) ,
7475 ApproveAgent ( ApproveAgent ) ,
7576 Withdraw3 ( Withdraw3 ) ,
76- SpotUser ( SpotUser ) ,
7777 VaultTransfer ( VaultTransfer ) ,
7878 SpotSend ( SpotSend ) ,
7979 SetReferrer ( SetReferrer ) ,
8080 ApproveBuilderFee ( ApproveBuilderFee ) ,
8181 EvmUserModify ( EvmUserModify ) ,
8282 ScheduleCancel ( ScheduleCancel ) ,
8383 ClaimRewards ( ClaimRewards ) ,
84+ UsdClassTransfer ( UsdClassTransfer ) ,
8485}
8586
8687impl Actions {
@@ -217,25 +218,30 @@ impl ExchangeClient {
217218
218219 pub async fn class_transfer (
219220 & self ,
220- usdc : f64 ,
221+ usd_amount : f64 ,
221222 to_perp : bool ,
222223 wallet : Option < & PrivateKeySigner > ,
223224 ) -> Result < ExchangeResponseStatus > {
224- // payload expects usdc without decimals
225- let usdc = ( usdc * 1e6 ) . round ( ) as u64 ;
226225 let wallet = wallet. unwrap_or ( & self . wallet ) ;
226+ let hyperliquid_chain = if self . http_client . is_mainnet ( ) {
227+ "Mainnet" . to_string ( )
228+ } else {
229+ "Testnet" . to_string ( )
230+ } ;
227231
228- let timestamp = next_nonce ( ) ;
229-
230- let action = Actions :: SpotUser ( SpotUser {
231- class_transfer : ClassTransfer { usdc, to_perp } ,
232- } ) ;
233- let connection_id = action. hash ( timestamp, self . vault_address ) ?;
234- let action = serde_json:: to_value ( & action) . map_err ( |e| Error :: JsonParse ( e. to_string ( ) ) ) ?;
235- let is_mainnet = self . http_client . is_mainnet ( ) ;
236- let signature = sign_l1_action ( wallet, connection_id, is_mainnet) ?;
232+ let nonce = next_nonce ( ) ;
233+ let payload = UsdClassTransfer {
234+ signature_chain_id : 421614 ,
235+ hyperliquid_chain,
236+ amount : format ! ( "{}" , usd_amount) ,
237+ to_perp,
238+ nonce,
239+ } ;
240+ let signature = sign_typed_data ( & payload, wallet) ?;
241+ let action = serde_json:: to_value ( Actions :: UsdClassTransfer ( payload) )
242+ . map_err ( |e| Error :: JsonParse ( e. to_string ( ) ) ) ?;
237243
238- self . post ( action, signature, timestamp ) . await
244+ self . post ( action, signature, nonce ) . await
239245 }
240246
241247 pub async fn vault_transfer (
0 commit comments