@@ -116,7 +116,7 @@ impl<B: Backend + ShardBackend> ShardLevelState<B> {
116116 nonce,
117117 owners,
118118 ..
119- } => Ok ( self . create_world ( shard_id, nonce, owners) ?) ,
119+ } => Ok ( self . create_world ( shard_id, nonce, owners, sender , shard_owners ) ?) ,
120120 Transaction :: SetWorldOwners {
121121 shard_id,
122122 world_id,
@@ -144,7 +144,18 @@ impl<B: Backend + ShardBackend> ShardLevelState<B> {
144144 }
145145 }
146146
147- fn create_world ( & mut self , shard_id : ShardId , nonce : & u64 , owners : & Vec < Address > ) -> StateResult < ( ) > {
147+ fn create_world (
148+ & mut self ,
149+ shard_id : ShardId ,
150+ nonce : & u64 ,
151+ owners : & Vec < Address > ,
152+ sender : & Address ,
153+ shard_owners : & [ Address ] ,
154+ ) -> StateResult < ( ) > {
155+ if !shard_owners. contains ( sender) {
156+ return Err ( TransactionError :: InsufficientPermission . into ( ) )
157+ }
158+
148159 let metadata_address = ShardMetadataAddress :: new ( shard_id) ;
149160 let mut metadata = self . require_metadata ( & metadata_address, || unreachable ! ( "Shard must have metadata" ) ) ?;
150161
@@ -572,9 +583,8 @@ mod tests {
572583 } ;
573584
574585 let sender = address ( ) ;
575- let shard_owner = address ( ) ;
576- let result = state. apply ( shard_id, & transaction, & sender, & [ shard_owner] ) ;
577- assert_eq ! ( Ok ( TransactionInvoice :: Success ) , result) ;
586+ let shard_owner = sender;
587+ assert_eq ! ( Ok ( TransactionInvoice :: Success ) , state. apply( shard_id, & transaction, & sender, & [ shard_owner] ) ) ;
578588
579589 let metadata = state. metadata ( ) ;
580590 assert_eq ! ( Ok ( Some ( ShardMetadata :: new_with_nonce( 1 , 1 ) ) ) , metadata) ;
@@ -601,9 +611,8 @@ mod tests {
601611 } ;
602612
603613 let sender = address ( ) ;
604- let shard_owner = address ( ) ;
605- let result = state. apply ( shard_id, & transaction, & sender, & [ shard_owner] ) ;
606- assert_eq ! ( Ok ( TransactionInvoice :: Success ) , result) ;
614+ let shard_owner = sender;
615+ assert_eq ! ( Ok ( TransactionInvoice :: Success ) , state. apply( shard_id, & transaction, & sender, & [ shard_owner] ) ) ;
607616
608617 let metadata = state. metadata ( ) ;
609618 assert_eq ! ( Ok ( Some ( ShardMetadata :: new_with_nonce( 1 , 1 ) ) ) , metadata) ;
@@ -630,7 +639,7 @@ mod tests {
630639 } ;
631640
632641 let sender = address ( ) ;
633- let shard_owner = address ( ) ;
642+ let shard_owner = sender ;
634643 assert_eq ! (
635644 Ok ( TransactionInvoice :: Fail ( TransactionError :: InvalidShardNonce ( Mismatch {
636645 expected: 0 ,
@@ -953,7 +962,7 @@ mod tests {
953962 let mut state = get_temp_shard_state ( shard_id) ;
954963
955964 let owners = vec ! [ Address :: random( ) , Address :: random( ) ] ;
956- assert_eq ! ( Ok ( ( ) ) , state. create_world( shard_id, & 0 , & owners) ) ;
965+ assert_eq ! ( Ok ( ( ) ) , state. create_world( shard_id, & 0 , & owners, & owners [ 0 ] , & owners ) ) ;
957966 assert_eq ! ( Ok ( ( ) ) , state. commit( ) ) ;
958967
959968 let metadata = state. metadata ( ) ;
@@ -996,7 +1005,7 @@ mod tests {
9961005
9971006 let sender = Address :: random ( ) ;
9981007 let old_owners = vec ! [ sender, Address :: random( ) ] ;
999- assert_eq ! ( Ok ( ( ) ) , state. create_world( shard_id, & 0 , & old_owners) ) ;
1008+ assert_eq ! ( Ok ( ( ) ) , state. create_world( shard_id, & 0 , & old_owners, & sender , & old_owners ) ) ;
10001009 assert_eq ! ( Ok ( ( ) ) , state. commit( ) ) ;
10011010
10021011 let metadata = state. metadata ( ) ;
@@ -1032,7 +1041,7 @@ mod tests {
10321041 let mut state = get_temp_shard_state ( shard_id) ;
10331042
10341043 let owners = vec ! [ Address :: random( ) , Address :: random( ) ] ;
1035- assert_eq ! ( Ok ( ( ) ) , state. create_world( shard_id, & 0 , & owners) ) ;
1044+ assert_eq ! ( Ok ( ( ) ) , state. create_world( shard_id, & 0 , & owners, & owners [ 0 ] , & owners ) ) ;
10361045 assert_eq ! ( Ok ( ( ) ) , state. commit( ) ) ;
10371046
10381047 let metadata = state. metadata ( ) ;
0 commit comments