From 8e864bb14d0e1a08c443e52d5c9b5785e5c75549 Mon Sep 17 00:00:00 2001 From: the-frey Date: Tue, 30 Aug 2022 10:57:59 +0100 Subject: [PATCH] Bump dependencies and add additional test for intersection of path and token transfer (#82) --- Cargo.lock | 179 ++++++++++------- Cargo.toml | 16 +- src/contract_tests.rs | 437 ++++++++++++++++++++++++++++++++++++++++++ src/query.rs | 1 - src/utils.rs | 1 - 5 files changed, 555 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 69ad817..5d286a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,24 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base64" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64ct" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474" + [[package]] name = "block-buffer" version = "0.9.0" @@ -31,15 +43,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "const-oid" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" [[package]] name = "cosmwasm-crypto" -version = "1.0.0-beta7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c2565b1e73a816fb659ef4838fc356143fbd35f43c48a51d2d7d4e5d6679d3" +checksum = "5eb0afef2325df81aadbf9be1233f522ed8f6e91df870c764bc44cca2b1415bd" dependencies = [ "digest", "ed25519-zebra", @@ -50,18 +62,18 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.0.0-beta7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa89fcdf8dbbe0088e663d0a814aa7368e7ebe8fb045a3a150fb5fdc2ffe3b45" +checksum = "4b36e527620a2a3e00e46b6e731ab6c9b68d11069c986f7d7be8eba79ef081a4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "1.0.0-beta7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f79866e7b2190b6b6cb06959e308183c8d9511a8530f7292073f3cddc963db" +checksum = "772e80bbad231a47a2068812b723a1ff81dd4a0d56c9391ac748177bea3a61da" dependencies = [ "schemars", "serde_json", @@ -69,9 +81,9 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.0.0-beta7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb8f99a61d0b9069e1afc80a4ffea87dcc3523edd992080923870b13a677da0" +checksum = "875994993c2082a6fcd406937bf0fca21c349e4a624f3810253a14fa83a3a195" dependencies = [ "base64", "cosmwasm-crypto", @@ -101,9 +113,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.2.11" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" dependencies = [ "generic-array", "rand_core 0.6.3", @@ -136,9 +148,9 @@ dependencies = [ [[package]] name = "cw-storage-plus" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e8b7f9a758c030d375520df947323c052704f784561fc28dcaab4f988c50a30" +checksum = "648b1507290bbc03a8d88463d7cd9b04b1fa0155e5eef366c4fa052b9caaac7a" dependencies = [ "cosmwasm-std", "schemars", @@ -147,9 +159,9 @@ dependencies = [ [[package]] name = "cw-utils" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aa10861dc5d74400eaf0ed920b6f8fdbc36ce53840ffee1688d9757dfc9fc9f" +checksum = "9dbaecb78c8e8abfd6b4258c7f4fbeb5c49a5e45ee4d910d3240ee8e1d714e1b" dependencies = [ "cosmwasm-std", "schemars", @@ -159,9 +171,9 @@ dependencies = [ [[package]] name = "cw2" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686da2d2b3b646bea15d448dc25c3e132097a7c40ef9ba7b4db741375b6181f" +checksum = "04cf4639517490dd36b333bbd6c4fbd92e325fd0acf4683b41753bc5eb63bfc1" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -171,9 +183,9 @@ dependencies = [ [[package]] name = "cw20" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c18f816c73fcbb0897d2be4efeb6f1277602cc5b7acd5949a7ead20db0e682" +checksum = "4cb782b8f110819a4eb5dbbcfed25ffba49ec16bbe32b4ad8da50a5ce68fec05" dependencies = [ "cosmwasm-std", "cw-utils", @@ -183,9 +195,9 @@ dependencies = [ [[package]] name = "cw721" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbe0ac5785fea815f43e44cf0397cbfe525f6957bb8509b2b009ea8eb35c707" +checksum = "035818368a74c07dd9ed5c5a93340199ba251530162010b9f34c3809e3b97df1" dependencies = [ "cosmwasm-std", "cw-utils", @@ -195,9 +207,9 @@ dependencies = [ [[package]] name = "cw721-base" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e92893af5039f9cb99810ad9c392ebdad61fa5aa94fec98c912a9823a4a7a81" +checksum = "423d4efe8b649d228d1533e141c238415f49aa8a9ee4e40fce192d7a93ffd057" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -211,9 +223,9 @@ dependencies = [ [[package]] name = "der" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e98c534e9c8a0483aa01d6f6913bc063de254311bd267c9cf535e9b70e15b2" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" dependencies = [ "const-oid", ] @@ -235,13 +247,13 @@ checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" [[package]] name = "ecdsa" -version = "0.12.4" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ee23aa5b4f68c7a092b5c3beb25f50c406adc75e2363634f242f28ab255372" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" dependencies = [ "der", "elliptic-curve", - "hmac", + "rfc6979", "signature", ] @@ -262,25 +274,27 @@ dependencies = [ [[package]] name = "elliptic-curve" -version = "0.10.6" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" dependencies = [ + "base16ct", "crypto-bigint", + "der", "ff", "generic-array", "group", - "pkcs8", "rand_core 0.6.3", + "sec1", "subtle", "zeroize", ] [[package]] name = "ff" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" dependencies = [ "rand_core 0.6.3", "subtle", @@ -326,9 +340,9 @@ dependencies = [ [[package]] name = "group" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" dependencies = [ "ff", "rand_core 0.6.3", @@ -359,13 +373,14 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "k256" -version = "0.9.6" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "sec1", "sha2", ] @@ -383,21 +398,22 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "pkcs8" -version = "0.7.6" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" dependencies = [ "der", "spki", + "zeroize", ] [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -442,6 +458,17 @@ version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +[[package]] +name = "rfc6979" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + [[package]] name = "ryu" version = "1.0.5" @@ -450,9 +477,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +checksum = "1847b767a3d62d95cbf3d8a9f0e421cf57a0d8aa4f411d4b16525afb0284d4ed" dependencies = [ "dyn-clone", "schemars_derive", @@ -462,9 +489,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" dependencies = [ "proc-macro2", "quote", @@ -472,29 +499,42 @@ dependencies = [ "syn", ] +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "serde" -version = "1.0.130" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-wasm" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "042ac496d97e5885149d34139bad1d617192770d7eb8f1866da2317ff4501853" +checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.130" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ "proc-macro2", "quote", @@ -503,9 +543,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", @@ -548,10 +588,11 @@ dependencies = [ [[package]] name = "spki" -version = "0.4.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" dependencies = [ + "base64ct", "der", ] @@ -569,29 +610,29 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.81" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" dependencies = [ "proc-macro2", "quote", @@ -606,9 +647,9 @@ checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" [[package]] name = "uint" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" +checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" dependencies = [ "byteorder", "crunchy", @@ -617,10 +658,10 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-ident" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" [[package]] name = "version_check" diff --git a/Cargo.toml b/Cargo.toml index 32658a3..bf75ac7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,19 +25,19 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw-utils = { version = "0.13.1" } -cw2 = { version = "0.13.1" } -cw20 = { version = "0.13.1" } -cw721 = { version = "0.13.1" } -cw721-base = { version = "0.13.1", features = ["library"] } -cw-storage-plus = { version = "0.13.1", features = ["iterator"] } -cosmwasm-std = { version = "1.0.0-beta7" } +cw-utils = { version = "0.13.2" } +cw2 = { version = "0.13.2" } +cw20 = { version = "0.13.2" } +cw721 = { version = "0.13.2" } +cw721-base = { version = "0.13.2", features = ["library"] } +cw-storage-plus = { version = "0.13.2", features = ["iterator"] } +cosmwasm-std = { version = "1.0.0" } schemars = "0.8.6" serde = { version = "1.0.130", default-features = false, features = ["derive"] } thiserror = { version = "1.0.30" } [dev-dependencies] -cosmwasm-schema = { version = "1.0.0-beta7" } +cosmwasm-schema = { version = "1.0.0" } [dependencies.regex] version = "1.5.4" diff --git a/src/contract_tests.rs b/src/contract_tests.rs index c986833..cbc34c6 100644 --- a/src/contract_tests.rs +++ b/src/contract_tests.rs @@ -3333,6 +3333,443 @@ XGo8Un24WP40IT78XjKO ); } + #[test] + fn double_transfer() { + // init a plausible username + let token_id = "thebestguy".to_string(); + let token_uri = "https://example.com/jeff-vader".to_string(); + let jeff_address = String::from("jeff-vader"); + + let mut deps = mock_dependencies(); + let contract = Cw721MetadataContract::default(); + + let init_msg = InstantiateMsg { + name: CONTRACT_NAME.to_string(), + symbol: SYMBOL.to_string(), + native_denom: "uatom".to_string(), + native_decimals: 6, + token_cap: Some(6), + base_mint_fee: None, + burn_percentage: Some(50), + short_name_surcharge: Some(SurchargeInfo { + surcharge_max_characters: 5, // small enough that "jeff" will be caught + surcharge_fee: Uint128::new(1_500_000), + }), + admin_address: jeff_address.clone(), + username_length_cap: None, + }; + + let allowed = mock_info(&jeff_address, &[]); + entry::instantiate(deps.as_mut(), mock_env(), allowed.clone(), init_msg).unwrap(); + + let meta = Metadata { + twitter_id: Some(String::from("@jeff-vader")), + ..Metadata::default() + }; + + let default_meta = Metadata { + ..Metadata::default() + }; + + let mint_msg = ExecuteMsg::Mint(MintMsg { + token_id: token_id.clone(), + owner: jeff_address.clone(), + token_uri: Some(token_uri.clone()), + extension: meta, + }); + + // CHECK: jeff can mint + let _ = entry::execute(deps.as_mut(), mock_env(), allowed.clone(), mint_msg).unwrap(); + + // CHECK: ensure num tokens increases + let count = contract.num_tokens(deps.as_ref()).unwrap(); + assert_eq!(1, count.count); + + // CHECK: alias returns something + let alias_query_res: PrimaryAliasResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::PrimaryAlias { + address: jeff_address.clone(), + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!(alias_query_res.username, token_id); + + // CHECK: mint a path + let path_id = "secret-plans".to_string(); + + let path_meta = Metadata { + parent_token_id: Some(token_id.clone()), + ..Metadata::default() + }; + + let path_mint_msg = ExecuteMsg::MintPath(MintMsg { + token_id: path_id.clone(), + owner: String::from("jeff-vader"), + token_uri: Some(token_uri.clone()), + extension: path_meta.clone(), + }); + + let _ = entry::execute(deps.as_mut(), mock_env(), allowed.clone(), path_mint_msg).unwrap(); + + let prepended_path_id = format!("{}::{}", token_id, path_id); + + // CHECK: this path info is correct + let path_info = contract + .nft_info(deps.as_ref(), prepended_path_id.clone()) + .unwrap(); + assert_eq!( + path_info, + NftInfoResponse:: { + token_uri: Some(token_uri.clone()), + extension: path_meta, + } + ); + + // CHECK: 1 path under base token minted + let jeffvader_paths_query_res: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::PathsForToken { + owner: jeff_address.clone(), + token_id: token_id.clone(), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + // expect response to be ["thebestguy::secret-plans"] + assert_eq!( + jeffvader_paths_query_res, + TokensResponse { + tokens: [prepended_path_id.clone()].to_vec() + } + ); + + // CHECK: mint a second path + let path_id_2 = "death-star-1".to_string(); + + let path_meta_2 = Metadata { + parent_token_id: Some(prepended_path_id.clone()), + ..Metadata::default() + }; + + let path_mint_msg = ExecuteMsg::MintPath(MintMsg { + token_id: path_id_2.clone(), + owner: String::from("jeff-vader"), + token_uri: Some(token_uri.clone()), + extension: path_meta_2.clone(), + }); + + let _ = entry::execute(deps.as_mut(), mock_env(), allowed.clone(), path_mint_msg).unwrap(); + + let prepended_path_id_2 = format!("{}::{}", prepended_path_id, path_id_2); + assert_eq!( + prepended_path_id_2, + "thebestguy::secret-plans::death-star-1" + ); + + // CHECK: this path info is correct + let path_info_2 = contract + .nft_info(deps.as_ref(), prepended_path_id_2.clone()) + .unwrap(); + assert_eq!( + path_info_2, + NftInfoResponse:: { + token_uri: Some(token_uri.clone()), + extension: path_meta_2, + } + ); + + // CHECK: 2 paths under base token minted + let jeffvader_paths_query_res: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::PathsForToken { + owner: jeff_address.clone(), + token_id: token_id.clone(), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + // expect response to be ["thebestguy::secret-plans"] + assert_eq!( + jeffvader_paths_query_res, + TokensResponse { + tokens: [prepended_path_id.clone(), prepended_path_id_2.clone()].to_vec() + } + ); + + // set alias + let _update_alias_res = entry::execute( + deps.as_mut(), + mock_env(), + allowed.clone(), + ExecuteMsg::UpdatePrimaryAlias { + token_id: token_id.clone(), + }, + ); + + // CHECK: alias updated to token_id + let alias_query_res_3: PrimaryAliasResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::PrimaryAlias { + address: jeff_address.clone(), + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!(alias_query_res_3.username, token_id); + + // first we transfer a path + let first_buyer_address = "yoda"; + + let path_transfer_msg = ExecuteMsg::TransferNft { + recipient: first_buyer_address.to_string(), + token_id: prepended_path_id.clone(), + }; + + let _ = entry::execute( + deps.as_mut(), + mock_env(), + allowed.clone(), + path_transfer_msg, + ); + + // CHECK: owner info is correct for path + let new_owner = contract + .owner_of(deps.as_ref(), mock_env(), prepended_path_id.clone(), true) + .unwrap(); + assert_eq!( + new_owner, + OwnerOfResponse { + owner: first_buyer_address.to_string(), + approvals: vec![], + } + ); + + // CHECK: owner info is correct for base token + let base_nft_owner = contract + .owner_of(deps.as_ref(), mock_env(), token_id.clone(), true) + .unwrap(); + assert_eq!( + base_nft_owner, + OwnerOfResponse { + owner: jeff_address.to_string(), + approvals: vec![], + } + ); + + // okay time to move NFT 1 + let john_q_rando_address = "random-guy"; + + // he really wants to be thebestguy so he buys the NFT off of jeff + // and then jeff transfers the token + let transfer_msg = ExecuteMsg::TransferNft { + recipient: john_q_rando_address.to_string(), + token_id: token_id.clone(), + }; + + let _ = entry::execute(deps.as_mut(), mock_env(), allowed, transfer_msg); + + // CHECK: owner info is correct + let owner = contract + .owner_of(deps.as_ref(), mock_env(), token_id.clone(), true) + .unwrap(); + assert_eq!( + owner, + OwnerOfResponse { + owner: john_q_rando_address.to_string(), + approvals: vec![], + } + ); + + // CHECK: this nft info META is correct + // i.e. it has been reset to the default + let info = contract.nft_info(deps.as_ref(), token_id.clone()).unwrap(); + assert_eq!( + info, + NftInfoResponse:: { + token_uri: Some(token_uri), + extension: default_meta, + } + ); + + // CHECK: path is still with yoda + let path_info_after_transfer = contract + .owner_of(deps.as_ref(), mock_env(), prepended_path_id.clone(), true) + .unwrap(); + assert_eq!( + path_info_after_transfer, + OwnerOfResponse { + owner: first_buyer_address.to_string(), + approvals: vec![], + } + ); + + // CHECK: no nested path (thebestguy::secret-plans::death-star-1) though + let nested_path_info_after_transfer = contract + .nft_info(deps.as_ref(), prepended_path_id_2) + .unwrap_err(); + assert_eq!( + nested_path_info_after_transfer, + StdError::NotFound { + kind: "cw721_base::state::TokenInfo".to_string() + } + ); + + // CHECK: no path under base token + let jeffvader_basetoken_paths_query_res_after_transfer: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::PathsForToken { + owner: jeff_address.clone(), + token_id: token_id.clone(), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + jeffvader_basetoken_paths_query_res_after_transfer, + TokensResponse { + tokens: [].to_vec() + } + ); + + // CHECK: jeff should actually have no paths left + let jeffvader_all_paths_query_res_after_transfer: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::Paths { + owner: jeff_address, + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + jeffvader_all_paths_query_res_after_transfer, + TokensResponse { + tokens: [].to_vec() + } + ); + + // CHECK: jeff should have no tokens at all + let base_tokens_query_res: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::BaseTokens { + owner: String::from("jeff-vader"), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + base_tokens_query_res, + TokensResponse { + tokens: [].to_vec() + } + ); + + // CHECK: buyer should have one + let buyer_base_tokens_query_res: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::BaseTokens { + owner: john_q_rando_address.to_string(), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + buyer_base_tokens_query_res, + TokensResponse { + tokens: [token_id.clone()].to_vec() + } + ); + + // CHECK: buyer should have one via base CW721 interface + let buyer_cw721_tokens_query_res: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::Tokens { + owner: john_q_rando_address.to_string(), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + buyer_cw721_tokens_query_res, + TokensResponse { + tokens: [token_id].to_vec() + } + ); + + // CHECK: yoda should have 1 path + let yoda_all_paths_query_res_after_transfer: TokensResponse = from_binary( + &entry::query( + deps.as_ref(), + mock_env(), + QueryMsg::Paths { + owner: first_buyer_address.to_string(), + start_after: None, + limit: None, + }, + ) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + yoda_all_paths_query_res_after_transfer, + TokensResponse { + tokens: [prepended_path_id].to_vec() + } + ); + } + #[test] fn alias_unchanged_if_primary_not_burned() { let mut deps = mock_dependencies(); diff --git a/src/query.rs b/src/query.rs index 97ddaff..96cba58 100644 --- a/src/query.rs +++ b/src/query.rs @@ -31,7 +31,6 @@ fn get_tokens( .prefix(owner_addr) .keys(deps.storage, start, None, Order::Ascending) .take(limit) - .map(|x| x.map(|addr| addr.to_string())) .collect::>>()?; Ok(tokens) diff --git a/src/utils.rs b/src/utils.rs index 654bb11..9f4edf7 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -186,7 +186,6 @@ pub fn get_number_of_owned_tokens( .prefix(address) .keys(deps.storage, None, None, Order::Ascending) .take(default_limit) // set default big limit - .map(|x| x.map(|addr| addr.to_string())) .collect::>>()?; let number_of_tokens_owned = owned_tokens.len();