@@ -3,11 +3,12 @@ use cosmwasm_std::{
3
3
from_json,
4
4
testing:: { mock_dependencies, mock_env, mock_info, MockQuerier , MOCK_CONTRACT_ADDR } ,
5
5
to_json_binary, Addr , ContractResult , CosmosMsg , Decimal , DepsMut , Empty , IbcMsg , IbcTimeout ,
6
- Order , QuerierResult , Response , StdResult , SubMsg , Timestamp , WasmQuery ,
6
+ Order , QuerierResult , Response , StdResult , SubMsg , Timestamp , WasmMsg , WasmQuery ,
7
7
} ;
8
8
use cw721:: {
9
9
msg:: {
10
- AllNftInfoResponse , CollectionInfoAndExtensionResponse , NftInfoResponse , NumTokensResponse ,
10
+ AllNftInfoResponse , CollectionInfoAndExtensionResponse , NftExtensionMsg , NftInfoResponse ,
11
+ NumTokensResponse ,
11
12
} ,
12
13
CollectionExtension , DefaultOptionalCollectionExtension , DefaultOptionalNftExtension ,
13
14
NftExtension , RoyaltyInfo ,
@@ -27,15 +28,15 @@ use crate::{
27
28
Ics721Query ,
28
29
} ,
29
30
state:: {
30
- CollectionData , CLASS_ID_TO_CLASS , CONTRACT_ADDR_LENGTH , CW721_ADMIN , CW721_CODE_ID ,
31
- IBC_RECEIVE_TOKEN_METADATA , INCOMING_PROXY , OUTGOING_CLASS_TOKEN_TO_CHANNEL ,
32
- OUTGOING_PROXY , PO ,
31
+ ClassIdInfo , CollectionData , CLASS_ID_AND_NFT_CONTRACT_INFO , CLASS_ID_TO_CLASS ,
32
+ CONTRACT_ADDR_LENGTH , CW721_ADMIN , CW721_CODE_ID , IBC_RECEIVE_TOKEN_METADATA ,
33
+ INCOMING_PROXY , OUTGOING_CLASS_TOKEN_TO_CHANNEL , OUTGOING_PROXY , PO ,
33
34
} ,
34
35
utils:: get_collection_data,
35
36
} ;
36
37
use ics721_types:: {
37
38
ibc_types:: { IbcOutgoingMsg , NonFungibleTokenPacketData } ,
38
- token_types:: { ClassId , TokenId } ,
39
+ token_types:: { ClassId , Token , TokenId } ,
39
40
} ;
40
41
41
42
const NFT_CONTRACT_1 : & str = "nft1" ;
@@ -46,6 +47,11 @@ const OWNER_ADDR: &str = "owner";
46
47
const ADMIN_ADDR : & str = "admin" ;
47
48
const PAUSER_ADDR : & str = "pauser" ;
48
49
50
+ #[ derive( Deserialize , Serialize , Clone , Debug , PartialEq ) ]
51
+ pub struct UnknownMetadata {
52
+ pub unknown : String ,
53
+ }
54
+
49
55
#[ derive( Default ) ]
50
56
pub struct Ics721Contract { }
51
57
impl Ics721Execute < Empty > for Ics721Contract {
@@ -376,10 +382,6 @@ fn test_receive_nft() {
376
382
querier. update_wasm ( mock_querier) ;
377
383
378
384
let mut deps = mock_dependencies ( ) ;
379
- #[ derive( Deserialize , Serialize , Clone , Debug , PartialEq ) ]
380
- struct UnknownMetadata {
381
- pub unknown : String ,
382
- }
383
385
let token_id = "1" ;
384
386
IBC_RECEIVE_TOKEN_METADATA
385
387
. save (
@@ -645,6 +647,149 @@ fn test_receive_nft() {
645
647
}
646
648
}
647
649
650
+ #[ test]
651
+ fn test_callback_mint ( ) {
652
+ // test case: token data is NftExtension
653
+ {
654
+ let mut querier = MockQuerier :: default ( ) ;
655
+ querier. update_wasm ( mock_querier) ;
656
+
657
+ let mut deps = mock_dependencies ( ) ;
658
+ deps. querier = querier;
659
+ let class_id_info = ClassIdInfo {
660
+ class_id : ClassId :: new ( NFT_CONTRACT_1 ) ,
661
+ address : Addr :: unchecked ( NFT_CONTRACT_1 ) ,
662
+ } ;
663
+ CLASS_ID_AND_NFT_CONTRACT_INFO
664
+ . save (
665
+ deps. as_mut ( ) . storage ,
666
+ & ClassId :: new ( NFT_CONTRACT_1 ) ,
667
+ & class_id_info,
668
+ )
669
+ . unwrap ( ) ;
670
+
671
+ let token_id = "1" ;
672
+ let token = Token {
673
+ id : TokenId :: new ( token_id) ,
674
+ uri : None ,
675
+ data : Some ( to_json_binary ( & NftExtension {
676
+ image : Some ( "https://ark.pass/image.png" . to_string ( ) ) ,
677
+ external_url : Some ( "https://interchain.arkprotocol.io" . to_string ( ) ) ,
678
+ description : Some ( "description" . to_string ( ) ) ,
679
+ ..Default :: default ( )
680
+ } ) )
681
+ . transpose ( )
682
+ . unwrap ( ) ,
683
+ } ;
684
+ let res: cosmwasm_std:: Response < _ > = Ics721Contract :: default ( )
685
+ . callback_mint (
686
+ deps. as_mut ( ) ,
687
+ ClassId :: new ( NFT_CONTRACT_1 ) ,
688
+ vec ! [ token] ,
689
+ "receiver" . to_string ( ) ,
690
+ )
691
+ . unwrap ( ) ;
692
+ assert_eq ! ( res. messages. len( ) , 1 ) ;
693
+ // get mint message
694
+ let sub_msg = res. messages [ 0 ] . clone ( ) ;
695
+ match sub_msg. msg {
696
+ CosmosMsg :: Wasm ( WasmMsg :: Execute {
697
+ contract_addr, msg, ..
698
+ } ) => {
699
+ assert_eq ! ( contract_addr, NFT_CONTRACT_1 ) ;
700
+ let msg: cw721_metadata_onchain:: msg:: ExecuteMsg = from_json ( msg) . unwrap ( ) ;
701
+ match msg {
702
+ cw721_metadata_onchain:: msg:: ExecuteMsg :: Mint {
703
+ token_id,
704
+ token_uri,
705
+ owner,
706
+ extension,
707
+ } => {
708
+ assert_eq ! ( token_id, "1" ) ;
709
+ assert_eq ! ( token_uri, None ) ;
710
+ assert_eq ! ( owner, "receiver" ) ;
711
+ assert_eq ! (
712
+ extension,
713
+ Some ( NftExtensionMsg {
714
+ image: Some ( "https://ark.pass/image.png" . to_string( ) ) ,
715
+ external_url: Some ( "https://interchain.arkprotocol.io" . to_string( ) ) ,
716
+ description: Some ( "description" . to_string( ) ) ,
717
+ ..Default :: default ( )
718
+ } )
719
+ ) ;
720
+ }
721
+ _ => panic ! ( "unexpected message type" ) ,
722
+ }
723
+ }
724
+ _ => panic ! ( "unexpected message type" ) ,
725
+ }
726
+ }
727
+ // test case: token data is unknown
728
+ {
729
+ let mut querier = MockQuerier :: default ( ) ;
730
+ querier. update_wasm ( mock_querier) ;
731
+
732
+ let mut deps = mock_dependencies ( ) ;
733
+ deps. querier = querier;
734
+ let class_id_info = ClassIdInfo {
735
+ class_id : ClassId :: new ( NFT_CONTRACT_1 ) ,
736
+ address : Addr :: unchecked ( NFT_CONTRACT_1 ) ,
737
+ } ;
738
+ CLASS_ID_AND_NFT_CONTRACT_INFO
739
+ . save (
740
+ deps. as_mut ( ) . storage ,
741
+ & ClassId :: new ( NFT_CONTRACT_1 ) ,
742
+ & class_id_info,
743
+ )
744
+ . unwrap ( ) ;
745
+
746
+ let token_id = "1" ;
747
+ let token = Token {
748
+ id : TokenId :: new ( token_id) ,
749
+ uri : None ,
750
+ data : Some ( to_json_binary ( & UnknownMetadata {
751
+ unknown : "unknown" . to_string ( ) ,
752
+ } ) )
753
+ . transpose ( )
754
+ . unwrap ( ) ,
755
+ } ;
756
+ let res: cosmwasm_std:: Response < _ > = Ics721Contract :: default ( )
757
+ . callback_mint (
758
+ deps. as_mut ( ) ,
759
+ ClassId :: new ( NFT_CONTRACT_1 ) ,
760
+ vec ! [ token] ,
761
+ "receiver" . to_string ( ) ,
762
+ )
763
+ . unwrap ( ) ;
764
+ assert_eq ! ( res. messages. len( ) , 1 ) ;
765
+ // get mint message
766
+ let sub_msg = res. messages [ 0 ] . clone ( ) ;
767
+ match sub_msg. msg {
768
+ CosmosMsg :: Wasm ( WasmMsg :: Execute {
769
+ contract_addr, msg, ..
770
+ } ) => {
771
+ assert_eq ! ( contract_addr, NFT_CONTRACT_1 ) ;
772
+ let msg: cw721_metadata_onchain:: msg:: ExecuteMsg = from_json ( msg) . unwrap ( ) ;
773
+ match msg {
774
+ cw721_metadata_onchain:: msg:: ExecuteMsg :: Mint {
775
+ token_id,
776
+ token_uri,
777
+ owner,
778
+ extension,
779
+ } => {
780
+ assert_eq ! ( token_id, "1" ) ;
781
+ assert_eq ! ( token_uri, None ) ;
782
+ assert_eq ! ( owner, "receiver" ) ;
783
+ assert_eq ! ( extension, None ) ;
784
+ }
785
+ _ => panic ! ( "unexpected message type" ) ,
786
+ }
787
+ }
788
+ _ => panic ! ( "unexpected message type" ) ,
789
+ }
790
+ }
791
+ }
792
+
648
793
#[ test]
649
794
fn test_receive_sets_uri ( ) {
650
795
let mut querier = MockQuerier :: default ( ) ;
0 commit comments