@@ -60,6 +60,9 @@ fn import_log_implementation(mut env: FunctionEnvMut<HostEnv>, ptr: i32, len: i3
6060 let applyenv = unsafe { data. applyenv_ptr . as_mut ( ) } ;
6161 let len = len as usize ;
6262
63+ if len <= 0 {
64+ panic_any ( "exec_ptr_term_too_short" )
65+ }
6366 if len > protocol:: WASM_MAX_PTR_LEN {
6467 panic_any ( "exec_ptr_term_too_long" )
6568 }
@@ -106,6 +109,56 @@ fn build_prefixed_key(applyenv: &mut ApplyEnv, view: &MemoryView, ptr: i32, len:
106109 crate :: bcat ( & [ & b"account:" [ ..] , & applyenv. caller_env . account_current , & b":storage:" [ ..] , & key] )
107110}
108111
112+ fn import_storage_kv_put_implementation ( mut env : FunctionEnvMut < HostEnv > , key_ptr : i32 , key_len : i32 , val_ptr : i32 , val_len : i32 ) -> Result < i32 , RuntimeError > {
113+ let ( data, mut store) = env. data_and_store_mut ( ) ;
114+ let instance = data. instance . clone ( ) . unwrap_or_else ( || panic_any ( "exec_instance_not_injected" ) ) ;
115+ let applyenv = unsafe { data. applyenv_ptr . as_mut ( ) } ;
116+
117+ if key_len as usize > protocol:: WASM_MAX_PTR_LEN {
118+ panic_any ( "exec_ptr_term_too_long" )
119+ }
120+ if val_len as usize > protocol:: WASM_MAX_PTR_LEN {
121+ panic_any ( "exec_ptr_term_too_long" )
122+ }
123+
124+ let view = data. memory . clone ( ) . view ( & store) ;
125+ let key = build_prefixed_key ( applyenv, & view, key_ptr, key_len) ;
126+ let mut value = vec ! [ 0u8 ; val_len as usize ] ;
127+ view. read ( val_ptr as u64 , & mut value) . unwrap_or_else ( |_| panic_any ( "exec_log_invalid_ptr" ) ) ;
128+
129+ kv_put ( applyenv, & key, & value) ;
130+ Ok ( 1 )
131+ }
132+
133+ fn import_storage_kv_increment_implementation ( mut env : FunctionEnvMut < HostEnv > , key_ptr : i32 , key_len : i32 , val_ptr : i32 , val_len : i32 ) -> Result < i32 , RuntimeError > {
134+ let ( data, mut store) = env. data_and_store_mut ( ) ;
135+ let instance = data. instance . clone ( ) . unwrap_or_else ( || panic_any ( "exec_instance_not_injected" ) ) ;
136+ let applyenv = unsafe { data. applyenv_ptr . as_mut ( ) } ;
137+
138+ if key_len as usize > protocol:: WASM_MAX_PTR_LEN {
139+ panic_any ( "exec_ptr_term_too_long" )
140+ }
141+ if val_len as usize > protocol:: WASM_MAX_PTR_LEN {
142+ panic_any ( "exec_ptr_term_too_long" )
143+ }
144+
145+ let view = data. memory . clone ( ) . view ( & store) ;
146+ let key = build_prefixed_key ( applyenv, & view, key_ptr, key_len) ;
147+ let mut value = vec ! [ 0u8 ; val_len as usize ] ;
148+ view. read ( val_ptr as u64 , & mut value) . unwrap_or_else ( |_| panic_any ( "exec_log_invalid_ptr" ) ) ;
149+
150+ let value_int128 = std:: str:: from_utf8 ( & value) . ok ( ) . and_then ( |s| s. parse :: < i128 > ( ) . ok ( ) ) . unwrap_or_else ( || panic_any ( "invalid_integer" ) ) ;
151+ let new_value = kv_increment ( applyenv, & key, value_int128) . to_string ( ) ;
152+ let new_value = new_value. as_bytes ( ) ;
153+
154+ view. write ( 10_000 , & new_value. len ( ) . to_le_bytes ( ) ) . unwrap_or_else ( |_| panic_any ( "exec_memwrite" ) ) ;
155+ view. write ( 10_004 , & new_value) . unwrap_or_else ( |_| panic_any ( "exec_memwrite" ) ) ;
156+ //For C / ZIG
157+ view. write ( 10_004 + new_value. len ( ) as u64 , & [ 0 ] ) . unwrap_or_else ( |_| panic_any ( "exec_memwrite" ) ) ;
158+
159+ Ok ( 10_000 )
160+ }
161+
109162fn import_storage_kv_get_implementation ( mut env : FunctionEnvMut < HostEnv > , ptr : i32 , len : i32 ) -> Result < i32 , RuntimeError > {
110163 let ( data, mut store) = env. data_and_store_mut ( ) ;
111164 let instance = data. instance . clone ( ) . unwrap_or_else ( || panic_any ( "exec_instance_not_injected" ) ) ;
@@ -124,12 +177,34 @@ fn import_storage_kv_get_implementation(mut env: FunctionEnvMut<HostEnv>, ptr: i
124177 Some ( value) => {
125178 view. write ( 10_000 , & value. len ( ) . to_le_bytes ( ) ) . unwrap_or_else ( |_| panic_any ( "exec_memwrite" ) ) ;
126179 view. write ( 10_004 , & value) . unwrap_or_else ( |_| panic_any ( "exec_memwrite" ) ) ;
180+ // For C / ZIG
181+ view. write ( 10_004 + value. len ( ) as u64 , & [ 0 ] ) . unwrap_or_else ( |_| panic_any ( "exec_memwrite" ) ) ;
127182 }
128183 }
129184 set_remaining_points ( & mut store, & instance, applyenv. exec_left . max ( 0 ) as u64 ) ;
130185 Ok ( 10_000 )
131186}
132187
188+ fn import_storage_kv_exists_implementation ( mut env : FunctionEnvMut < HostEnv > , ptr : i32 , len : i32 ) -> Result < i32 , RuntimeError > {
189+ let ( data, mut store) = env. data_and_store_mut ( ) ;
190+ let instance = data. instance . clone ( ) . unwrap_or_else ( || panic_any ( "exec_instance_not_injected" ) ) ;
191+ let applyenv = unsafe { data. applyenv_ptr . as_mut ( ) } ;
192+
193+ if len as usize > protocol:: WASM_MAX_PTR_LEN {
194+ panic_any ( "exec_ptr_term_too_long" )
195+ }
196+
197+ let view = data. memory . clone ( ) . view ( & store) ;
198+ let key = build_prefixed_key ( applyenv, & view, ptr, len) ;
199+
200+ let result = kv_exists ( applyenv, & key) ;
201+ set_remaining_points ( & mut store, & instance, applyenv. exec_left . max ( 0 ) as u64 ) ;
202+ match result {
203+ true => Ok ( 1 ) ,
204+ false => Ok ( 0 )
205+ }
206+ }
207+
133208//AssemblyScript specific
134209fn as_read_string ( view : & MemoryView , ptr : i32 ) -> String {
135210 if ptr == 0 { return "null" . to_string ( ) ; }
@@ -329,24 +404,24 @@ pub fn setup_wasm_instance(env: &mut ApplyEnv, module: &Module, store: &mut Stor
329404 // Setup Memory
330405 let memory = Memory :: new ( store, MemoryType :: new ( Pages ( 2 ) , Some ( Pages ( 30 ) ) , false ) ) . unwrap_or_else ( |_| panic_any ( "exec_memory_alloc" ) ) ;
331406
332- let mut wasm_arg_ptrs = Vec :: new ( ) ;
407+ let mut wasm_arg_ptrs: Vec < Value > = Vec :: new ( ) ;
333408 {
334409 let view = memory. view ( store) ;
335410 inject_env_data ( & view, env) ;
336411 let mut current_offset: u64 = 10_000 ;
337412 for arg_bytes in function_args {
413+ // Write the length
414+ let len = arg_bytes. len ( ) as i32 ;
415+ view. write ( current_offset, & len. to_le_bytes ( ) ) . unwrap_or_else ( |_| panic_any ( "exec_arg_len_write" ) ) ;
338416 // Write the bytes
339- view. write ( current_offset, arg_bytes) . unwrap_or_else ( |_| panic_any ( "exec_arg_write" ) ) ;
340-
417+ view. write ( current_offset + 4 , arg_bytes) . unwrap_or_else ( |_| panic_any ( "exec_arg_write" ) ) ;
341418 // NULL terminate for C / ZIG compat
342- let null_term_offset = current_offset + arg_bytes. len ( ) as u64 ;
419+ let null_term_offset = current_offset + 4 + arg_bytes. len ( ) as u64 ;
343420 view. write ( null_term_offset, & [ 0 ] ) . unwrap_or_else ( |_| panic_any ( "exec_arg_null_write" ) ) ;
344-
345421 // Save the POINTER (i32) to pass to the function call later
346422 wasm_arg_ptrs. push ( Value :: I32 ( current_offset as i32 ) ) ;
347-
348423 // Advance offset (Add +1 if you need null-termination for C-strings)
349- current_offset += ( arg_bytes. len ( ) as u64 ) + 1 ;
424+ current_offset += 4 + ( arg_bytes. len ( ) as u64 ) + 1 ;
350425 }
351426 }
352427
@@ -371,11 +446,14 @@ pub fn setup_wasm_instance(env: &mut ApplyEnv, module: &Module, store: &mut Stor
371446 "import_return" => Function :: new_typed_with_env( store, & host_env, import_return_implementation) ,
372447
373448 //Storage
374- "import_kv_get" => Function :: new_typed_with_env( store, & host_env, import_storage_kv_get_implementation) ,
449+ "import_kv_put" => Function :: new_typed_with_env( store, & host_env, import_storage_kv_put_implementation) ,
450+ "import_kv_increment" => Function :: new_typed_with_env( store, & host_env, import_storage_kv_increment_implementation) ,
375451
376- /*
452+ "import_kv_get" => Function :: new_typed_with_env( store, & host_env, import_storage_kv_get_implementation) ,
453+ "import_kv_exists" => Function :: new_typed_with_env( store, & host_env, import_storage_kv_exists_implementation) ,
377454
378455
456+ /*
379457 "import_attach" => Function::new_typed_with_env(&mut store, &host_env, import_attach_implementation),
380458
381459
@@ -386,17 +464,12 @@ pub fn setup_wasm_instance(env: &mut ApplyEnv, module: &Module, store: &mut Stor
386464 "import_call_4" => Function::new_typed_with_env(&mut store, &host_env, import_call_4_implementation),
387465
388466 //storage
389- "import_kv_put" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_put_implementation),
390- "import_kv_increment" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_increment_implementation),
391467 "import_kv_delete" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_delete_implementation),
392468 "import_kv_clear" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_clear_implementation),
393469
394- "import_kv_exists" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_exists_implementation),
395470 "import_kv_get_prev" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_get_prev_implementation),
396471 "import_kv_get_next" => Function::new_typed_with_env(&mut store, &host_env, import_storage_kv_get_next_implementation),
397472 */
398- //"import_kv_put_int" => Function::new_typed(&mut store, || println!("called_kv_put_in_rust")),
399- //"import_kv_get_prefix" => Function::new_typed(&mut store, || println!("called_kv_get_in_rust")),
400473
401474 //AssemblyScript specific
402475 "abort" => Function :: new_typed_with_env( store, & host_env, as_abort_implementation) ,
@@ -486,7 +559,7 @@ pub fn call_contract(env: &mut ApplyEnv, wasm_bytes: &[u8], function_name: Strin
486559 }
487560 } ;
488561
489- let ( instance, wasm_args) = setup_wasm_instance ( env, & module, & mut store, false , & [ ] ) ;
562+ let ( instance, wasm_args) = setup_wasm_instance ( env, & module, & mut store, false , & function_args ) ;
490563
491564 let entry_to_call = instance. exports . get_function ( & function_name) . unwrap_or_else ( |e| {
492565 log_line ( env, e. to_string ( ) . into_bytes ( ) ) ;
0 commit comments