11//! NFC Collection
22
3- use soroban_sdk:: { contractimpl, contracttype, panic_with_error, Address , Bytes , BytesN , Env , String } ;
3+ use soroban_sdk:: { contractimpl, contracttype, panic_with_error, Address , Bytes , BytesN , Env , String , Vec } ;
44use soroban_sdk:: xdr:: ToXdr ;
55use crate :: { errors, events, Collection , CollectionArgs , CollectionClient , CollectionTrait } ;
66
@@ -12,6 +12,8 @@ pub enum DataKey {
1212#[ contracttype]
1313pub enum CollectionKey {
1414 NFTContract ,
15+ Collections ,
16+ Collectibles ( Address ) ,
1517}
1618
1719
@@ -27,9 +29,31 @@ impl CollectionTrait for Collection {
2729 admin. require_auth ( ) ;
2830
2931 e. deployer ( ) . update_current_contract_wasm ( wasm_hash. clone ( ) ) ;
32+ }
33+
34+ fn create_collection ( e : & Env , wasm_hash : BytesN < 32 > , name : String , symbol : String , uri : String , max_tokens : u32 ) {
35+ let admin: Address = e. storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
36+ admin. require_auth ( ) ;
37+
38+ let salt: BytesN < 32 > = e. crypto ( ) . sha256 ( & symbol. to_bytes ( ) ) . into ( ) ;
39+ let deployer = e. deployer ( ) . with_current_contract ( salt) ;
40+ let contract_address = deployer. deploy_v2 ( wasm_hash, ( name, symbol, uri, max_tokens) ) ;
3041
31- events:: Upgrade { admin, wasm_hash : wasm_hash. into ( ) } . publish ( e) ;
42+ let mut collections: Vec < Address > = e. storage ( ) . instance ( ) . get ( & CollectionKey :: Collections ) . unwrap_or ( Vec :: new ( & e) ) ;
43+ collections. push_back ( contract_address. clone ( ) ) ;
44+ e. storage ( ) . instance ( ) . set ( & CollectionKey :: Collections , & contract_address) ;
3245 }
3346
47+ fn assign_collectible ( e : & Env , collection : Address , to : Address , token_id : u32 ) {
48+ collection. require_auth ( ) ;
49+
50+ let mut collectibles: Vec < ( Address , u32 ) > = e. storage ( ) . instance ( ) . get ( & CollectionKey :: Collectibles ( to. clone ( ) ) ) . unwrap_or ( Vec :: new ( & e) ) ;
51+ collectibles. push_back ( ( collection, token_id) ) ;
52+ e. storage ( ) . instance ( ) . set ( & CollectionKey :: Collectibles ( to) , & collectibles) ;
53+ }
54+
55+ fn collectibles ( e : & Env , from : Address ) -> Vec < ( Address , u32 ) > {
56+ e. storage ( ) . instance ( ) . get ( & CollectionKey :: Collectibles ( from. clone ( ) ) ) . unwrap_or ( Vec :: new ( & e) )
57+ }
3458
3559}
0 commit comments