@@ -24,7 +24,14 @@ use alloc::string::String;
2424use alloc:: vec:: Vec ;
2525use core:: { ptr, slice} ;
2626
27+ use crate :: keys:: {
28+ derive_bls_pk, derive_bls_sk, derive_phoenix_pk, derive_phoenix_sk,
29+ derive_phoenix_vk,
30+ } ;
31+ use crate :: notes:: { self , balance, owned, pick} ;
32+ use crate :: Seed ;
2733use dusk_bytes:: { DeserializableSlice , Serializable } ;
34+ use dusk_core:: abi:: ContractId ;
2835use dusk_core:: signatures:: bls:: PublicKey as BlsPublicKey ;
2936use dusk_core:: stake:: { Stake , STAKE_CONTRACT } ;
3037use dusk_core:: transfer:: data:: { ContractCall , TransactionData } ;
@@ -41,13 +48,6 @@ use rand_chacha::ChaCha12Rng;
4148use rkyv:: to_bytes;
4249use zeroize:: Zeroize ;
4350
44- use crate :: keys:: {
45- derive_bls_pk, derive_bls_sk, derive_phoenix_pk, derive_phoenix_sk,
46- derive_phoenix_vk,
47- } ;
48- use crate :: notes:: { self , balance, owned, pick} ;
49- use crate :: Seed ;
50-
5151use error:: ErrorCode ;
5252
5353#[ no_mangle]
@@ -388,8 +388,10 @@ pub unsafe fn phoenix(
388388 None
389389 } else {
390390 let buffer = mem:: read_buffer ( data) ;
391-
392- Some ( buffer[ 1 ..] . to_vec ( ) . into ( ) )
391+ let transaction_data: TransactionData =
392+ rkyv:: from_bytes ( buffer. to_vec ( ) . as_slice ( ) )
393+ . or ( Err ( ErrorCode :: DeserializationError ) ) ?;
394+ Some ( transaction_data)
393395 } ;
394396
395397 let prover = NoOpProver :: default ( ) ;
@@ -467,8 +469,10 @@ pub unsafe fn moonlight(
467469 None
468470 } else {
469471 let buffer = mem:: read_buffer ( data) ;
470-
471- Some ( buffer[ 1 ..] . to_vec ( ) . into ( ) )
472+ let transaction_data: TransactionData =
473+ rkyv:: from_bytes ( buffer. to_vec ( ) . as_slice ( ) )
474+ . or ( Err ( ErrorCode :: DeserializationError ) ) ?;
475+ Some ( transaction_data)
472476 } ;
473477
474478 let tx = MoonlightTransaction :: new (
@@ -818,3 +822,60 @@ pub unsafe fn moonlight_stake_reward(
818822
819823 ErrorCode :: Ok
820824}
825+
826+ #[ no_mangle]
827+ pub unsafe fn create_tx_data (
828+ fn_name_len : * const u32 ,
829+ fn_name_buf : * mut u8 ,
830+ fn_args_len : * const u32 ,
831+ fn_args_buf : * mut u8 ,
832+ contract_id : [ u8 ; 32 ] ,
833+ memo_len : * const u32 ,
834+ memo_buf : * mut u8 ,
835+ rkyv_ptr : * mut * mut u8 ,
836+ ) -> ErrorCode {
837+ let tx_data = if memo_len == crate :: ffi:: ptr:: null ( )
838+ || memo_buf == crate :: ffi:: ptr:: null_mut ( )
839+ {
840+ let fn_name = alloc:: string:: String :: from_raw_parts (
841+ fn_name_buf,
842+ * fn_name_len as usize ,
843+ * fn_name_len as usize ,
844+ ) ;
845+ let fn_args = alloc:: vec:: Vec :: from_raw_parts (
846+ fn_args_buf,
847+ * fn_args_len as usize ,
848+ * fn_args_len as usize ,
849+ ) ;
850+ let contract = ContractId :: from_bytes ( contract_id) ;
851+
852+ let contract_call = ContractCall {
853+ fn_name,
854+ fn_args,
855+ contract,
856+ } ;
857+ TransactionData :: Call ( contract_call)
858+ } else {
859+ let memo = alloc:: vec:: Vec :: from_raw_parts (
860+ memo_buf,
861+ * memo_len as usize ,
862+ * memo_len as usize ,
863+ ) ;
864+ TransactionData :: Memo ( memo)
865+ } ;
866+ let bytes = match rkyv:: to_bytes :: < _ , 4096 > ( & tx_data) {
867+ Ok ( v) => v. to_vec ( ) ,
868+ Err ( _) => return ErrorCode :: ArchivingError ,
869+ } ;
870+ let len = bytes. len ( ) . to_le_bytes ( ) ;
871+
872+ let ptr = mem:: malloc ( 4 + bytes. len ( ) as u32 ) ;
873+ let ptr = ptr as * mut u8 ;
874+
875+ * rkyv_ptr = ptr;
876+
877+ ptr:: copy_nonoverlapping ( len. as_ptr ( ) , ptr, 4 ) ;
878+ ptr:: copy_nonoverlapping ( bytes. as_ptr ( ) , ptr. add ( 4 ) , bytes. len ( ) ) ;
879+
880+ ErrorCode :: Ok
881+ }
0 commit comments