4
4
use anyhow:: Result ;
5
5
use once_cell:: sync:: Lazy ;
6
6
use starcoin_crypto:: hash:: PlainCryptoHash ;
7
+ use starcoin_state_api:: ChainStateWriter ;
7
8
use starcoin_transaction_builder:: {
8
9
encode_transfer_script_by_token_code, DEFAULT_EXPIRATION_TIME , DEFAULT_MAX_GAS_AMOUNT ,
9
10
} ;
@@ -14,6 +15,7 @@ use starcoin_types::{
14
15
account:: Account , block_metadata:: BlockMetadata , transaction:: Transaction ,
15
16
transaction:: TransactionStatus ,
16
17
} ;
18
+ use starcoin_vm_runtime:: starcoin_vm:: StarcoinVM ;
17
19
use starcoin_vm_types:: account_address:: AccountAddress ;
18
20
use starcoin_vm_types:: account_config:: core_code_address;
19
21
use starcoin_vm_types:: account_config:: { genesis_address, stc_type_tag} ;
@@ -252,3 +254,81 @@ fn test_call_deprecated_function() -> Result<()> {
252
254
// assert_eq!(Some(4875), move_abort_code(status));
253
255
Ok ( ( ) )
254
256
}
257
+
258
+ #[ stest:: test]
259
+ fn test_stm_dependency ( ) -> Result < ( ) > {
260
+ let ( chain_state, net) = prepare_genesis ( ) ;
261
+ let account1 = Account :: new ( ) ;
262
+ let txn1 = Transaction :: UserTransaction ( create_account_txn_sent_as_association (
263
+ & account1, 0 , 50_000_000 , 1 , & net,
264
+ ) ) ;
265
+ let output1 = execute_and_apply ( & chain_state, txn1) ;
266
+ assert_eq ! ( KeptVMStatus :: Executed , output1. status( ) . status( ) . unwrap( ) ) ;
267
+ let account2 = Account :: new ( ) ;
268
+ let txn2 = Transaction :: UserTransaction ( account1. sign_txn (
269
+ starcoin_transaction_builder:: build_transfer_txn (
270
+ * account1. address ( ) ,
271
+ * account2. address ( ) ,
272
+ 0 ,
273
+ 1000 ,
274
+ 1 ,
275
+ DEFAULT_MAX_GAS_AMOUNT ,
276
+ net. time_service ( ) . now_secs ( ) + DEFAULT_EXPIRATION_TIME ,
277
+ net. chain_id ( ) ,
278
+ ) ,
279
+ ) ) ;
280
+ let output2 = execute_and_apply ( & chain_state, txn2) ;
281
+ assert_eq ! ( KeptVMStatus :: Executed , output2. status( ) . status( ) . unwrap( ) ) ;
282
+ let txn3 = Transaction :: UserTransaction ( account1. sign_txn (
283
+ starcoin_transaction_builder:: build_transfer_txn (
284
+ * account1. address ( ) ,
285
+ * account2. address ( ) ,
286
+ 1 ,
287
+ 1000 ,
288
+ 1 ,
289
+ DEFAULT_MAX_GAS_AMOUNT ,
290
+ net. time_service ( ) . now_secs ( ) + DEFAULT_EXPIRATION_TIME ,
291
+ net. chain_id ( ) ,
292
+ ) ,
293
+ ) ) ;
294
+ let txn4 = Transaction :: UserTransaction ( account1. sign_txn (
295
+ starcoin_transaction_builder:: build_transfer_txn (
296
+ * account1. address ( ) ,
297
+ * account2. address ( ) ,
298
+ 2 ,
299
+ 1000 ,
300
+ 1 ,
301
+ DEFAULT_MAX_GAS_AMOUNT ,
302
+ net. time_service ( ) . now_secs ( ) + DEFAULT_EXPIRATION_TIME ,
303
+ net. chain_id ( ) ,
304
+ ) ,
305
+ ) ) ;
306
+ //
307
+ // let txn5 = Transaction::UserTransaction(account1.sign_txn(
308
+ // starcoin_transaction_builder::build_transfer_txn(
309
+ // *account1.address(),
310
+ // *account2.address(),
311
+ // 1,
312
+ // 1000,
313
+ // 1,
314
+ // DEFAULT_MAX_GAS_AMOUNT,
315
+ // net.time_service().now_secs() + DEFAULT_EXPIRATION_TIME,
316
+ // net.chain_id(),
317
+ // ),
318
+ // ));
319
+ StarcoinVM :: set_concurrency_level_once ( 4 ) ;
320
+ let outputs =
321
+ starcoin_executor:: execute_transactions ( & chain_state, vec ! [ txn3, txn4] , None ) . unwrap ( ) ;
322
+ outputs. into_iter ( ) . for_each ( |output| {
323
+ if let TransactionStatus :: Keep ( _) = output. status ( ) {
324
+ chain_state
325
+ . apply_write_set ( output. write_set ( ) . clone ( ) )
326
+ . expect ( "apply write_set should success." ) ;
327
+ chain_state. commit ( ) . expect ( "commit should success." ) ;
328
+ }
329
+ } ) ;
330
+ let balance = get_balance ( * account2. address ( ) , & chain_state) ;
331
+
332
+ assert_eq ! ( balance, 3000 ) ;
333
+ Ok ( ( ) )
334
+ }
0 commit comments