From fd8df9b209c6e79022fb23d6f7cee4a6fc7df0c0 Mon Sep 17 00:00:00 2001 From: Pavel Iakushin Date: Thu, 20 Oct 2022 16:19:48 +0400 Subject: [PATCH] add test for view method balance_of --- dist/non_fungible_token.wasm | Bin 0 -> 287259 bytes src/lib.rs | 2 +- src/tests/environment.rs | 283 +++++++++++++++++++++++++++++++++++ src/tests/integration.rs | 194 ++---------------------- src/tests/mod.rs | 26 ++++ src/tests/view_balance_of.rs | 33 ++++ src/vault.rs | 6 +- src/views.rs | 36 ++++- 8 files changed, 393 insertions(+), 187 deletions(-) create mode 100755 dist/non_fungible_token.wasm create mode 100644 src/tests/environment.rs create mode 100644 src/tests/view_balance_of.rs diff --git a/dist/non_fungible_token.wasm b/dist/non_fungible_token.wasm new file mode 100755 index 0000000000000000000000000000000000000000..cbc74bdafaa0b1d67ecda0850692cbe6851af34c GIT binary patch literal 287259 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�aMb<`p+ zmR~na%8Lom=*AbXrYycpRztVJFO85S393M8M*z51dZb8xfknI!g8ETY%uQcCU>(Q{ z!Z1c5rZ5nfof+^Fpk5Z#KTm2?L6j4eks3}-(u!dwouRO1Bk&jT`KqDrDiVKu*5n-; zClZoXdWK&7OFac!DEXC|fSaqNKafSZ4;Db;sLZ|eND@_0{<+XX9Vne3#-^9h`170C zYer}Qkmi4_>ISV6g}`ch$YdoZn?v5)y-QNe05K#u6BykcG;zP0VBqkFDYe$p;ooWD zEsK<+FRi#XC6&M1mq{-jaWl8A($>ci-nO+ad^K>^Bp=q;#C zIioQ}TI!>?Bw>O6(x9kp=MNfl1BP*H0h7Z2h@nyHRqD>PfmdoV#+w^d)1tD-8tSb= zt`<6L6g&bD$->a*R(J?{eUY?MVl$FFPvwLq?lyeKM^^B1oi!0Nh_UuMM(S0qNFJGM zv2qgs0}LEFrWk^J6ow|;rJeHoL`|ta+>A?xiJE%qYCa|0sW0pA=rE6Hf*heTMuRgG zmXys()Ap$#h5LN6Qwi5^7U>Q&=7MR=neySg7Hf^Ukf1V8B_>%wgI_Z2x;UvBb(p_) zlfV&!XgaDOg6Rx9`Sr#ndXj%eU#$QLp(t)}_RPnu7H% zigfVIBzpnuZu1bx@vf_f-MQpy{q7GHw`R{OH(su^-?J_ormImPfR*~u8HkA--ERJE z39cq>%wrw=c55`1Dl(z^2gwXgxP2`5Ngi=&UnH+X3!%&)n(CCy)yk5u5$M4OQ`@Li z$!=|?fXu>`&v`HDto{{pzss&>(eMn24%~Ik2xaCTO|G5mJ`>-oYX`vC!FuvBY$W)S zTsMuPmX9edn&sb=lQ{RnwKH9BnekKFf&(0TJpN(!bXrU0bdNgh_#4!VSYoL1rq#9* z1lc9hYl)ibfOjoX0$j&IT-u$=DPt`aA-Zb#Dvy~2V1+7GpiNFcERtQD1h!ltqe$qh z=|>Kp((w@#iG?&p_tyot2%X>UdpUrHL}9)+`~sXJF(@GtHaNRNFb-bdvaqPpir#`M z5k1oU0WpaB)4w7+qtn+RkVfo&g9QYOmtYF1$i~n;{f-6simmxx0tLJ>4n0d;p#gQcN37x4E6J! z=EwWv{JUNvco`L6v|NY>l2qIOPIY^@RHj-%A)dHAbUD#64FCgdTYdiQ^OE828GrlAy)k^7+UFn9t{zVQCseB4d25SkLA)Bq#OQ1d_Zkv3@MlV*Rsf z%r^PeaQR}729d7shy$By=bna-)k2SZN{wY32ufJ90)iM+eyz2tudv9$mN1~4bS4WQ zGm3rl@98bMt3(5UzZqk8P6v@-FJbK^Qekbn#`hQ|k^-ZtzENH-k_H?rvMl7|BTgDm3(N>_S)-(HipAS+C=5JzVMvR zlK}^EtS?eDYPODF>Pum5x&0lBxMcrmQA=7rSxOOOuQuYK=S zoj5-tP-YVFWsvyzJr~6GPBB7=F8B=5gz*i$;o326@D32=?-T+?8-z3=9&2uk{M}YS zmaH-1LF=IlI`zH7I*3bI)s8~yGdi5XpHSwfJ&C0lI~;Rpxk$7Wp|_%^I9Z34enTU< ziZ-aycaW=nyD{ii+{uT|QcTO9s0AG)A&s*XL0LFUvB5Jikx1_U)I>VW%5QW`QI`*O z?C!sC96P&i-X^kS`S%0AcFV+<&c+kvlJX8K(yfYQAV7Rt&?m8>7v~qy5$`R0P&B

i?%-VNQq3dcAfkO8mn0hJH8%EvjP%k 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

K4?(&{V|?3n61%S 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 Self { assert!(!env::state_exists(), "Already initialized"); Self { - vaults: UnorderedMap::new(b"v"), + vaults: UnorderedMap::new(b"a"), } } diff --git a/src/tests/environment.rs b/src/tests/environment.rs new file mode 100644 index 0000000..10b1b21 --- /dev/null +++ b/src/tests/environment.rs @@ -0,0 +1,283 @@ +use anyhow::{Context, Result}; +use near_sdk::{json_types::U128, serde_json::json}; +use tokio::fs::read; +use workspaces::{ + network::Sandbox, + result::{ExecutionFinalResult, ExecutionOutcome}, + sandbox, testnet, Account, AccountId, Contract, Worker, +}; + +use crate::{ + tests::{ + NEAR, NFT_MINT_STORAGE_DEPOSIT, NFT_TOKEN_ID, WASMS_LOCATION, WRAP_NEAR_DEPOSIT, + WRAP_NEAR_DEPOSIT_CALL, WRAP_NEAR_STORAGE_DEPOSIT, WRAP_NEAR_STORAGE_DEPOSIT_CALL, + WRAP_NEAR_TESTNET_ACCOUNT_ID, WRAP_NEAR_WASM, + }, + views::Balance, +}; + +use super::{NFT_MINT_CALL, NFT_NEW_DEFAULT_META_CALL, NFT_WASM, VAULT_BALANCE_OF_CALL}; + +pub struct Environment { + pub sandbox: Worker, + pub wrap_near: Contract, + pub issuer: Account, + pub nft_owner: Account, + pub vault: Contract, + pub nft: Contract, +} + +impl Environment { + pub async fn new() -> Result { + let sandbox = sandbox().await?; + println!("sandbox initialized"); + + let wrap_near = prepare_wrap_near_contract(&sandbox).await?; + println!("wrap NEAR token account ready on: {}\n", wrap_near.id()); + + let issuer = tokio::spawn(prepare_issuer_account( + sandbox.clone(), + wrap_near.id().clone(), + )); + let nft_owner = tokio::spawn(prepare_nft_owner_account( + sandbox.clone(), + wrap_near.id().clone(), + )); + let vault = tokio::spawn(prepare_vault_contract( + sandbox.clone(), + wrap_near.id().clone(), + )); + let nft = tokio::spawn(prepare_nft_contract(sandbox.clone())); + + let issuer = issuer.await??; + let nft_owner = nft_owner.await??; + let vault = vault.await??; + let nft = nft.await??; + + println!("issuer account: {}", issuer.id()); + println!("NFT owner account: {}", nft_owner.id()); + println!("NFT benefits vault account ready on: {}\n", vault.id()); + + Ok(Environment { + sandbox, + wrap_near, + issuer, + nft_owner, + vault, + nft, + }) + } + + pub async fn issue_nft(&self) -> Result<()> { + let token_metadata = json!({ + "title": "Olympus Mons", + "description": "Tallest mountain in charted solar system", + "media": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Olympus_Mons_alt.jpg/1024px-Olympus_Mons_alt.jpg", + "copies": 1 + }); + let args = json!({ + "token_id": NFT_TOKEN_ID, + "receiver_id": self.issuer.id(), + "token_metadata": token_metadata + }); + let res = self + .nft + .call(NFT_MINT_CALL) + .args_json(args) + .deposit(NFT_MINT_STORAGE_DEPOSIT) + .transact() + .await?; + println!("NFT mint: {}", format_execution_result(&res)); + Ok(()) + } + + pub async fn deposit_to_vault( + &self, // issuer: &Account, + // token_contract_id: &Contract, + // vault: &Contract, + ) -> Result<()> { + let args = json!( + { + "receiver_id": self.vault.id(), + "amount": U128(NEAR), + "msg": NFT_TOKEN_ID + } + ); + + let res = self + .issuer + .call(self.wrap_near.id(), "ft_transfer_call") + .args_json(args) + .deposit(1) + .max_gas() + .transact() + .await?; + + println!("deposit to vault: {}", format_execution_result(&res)); + + Ok(()) + } + + pub async fn balance_of(&self) -> Result { + let args = json!({ + "nft_id": NFT_TOKEN_ID, + }) + .to_string() + .into_bytes(); + let res = self + .sandbox + .view(self.vault.id(), VAULT_BALANCE_OF_CALL, args) + .await + .with_context(|| "failed to call method on contract")?; + let balance = res.json()?; + Ok(balance) + } +} + +async fn prepare_wrap_near_contract(sandbox: &Worker) -> Result { + let id = WRAP_NEAR_TESTNET_ACCOUNT_ID.parse()?; + let contract = match testnet().await { + Ok(testnet) => { + let contract = sandbox.import_contract(&id, &testnet).transact().await?; + println!("wrap NEAR contract imported from testnet"); + contract + } + Err(e) => { + println!("failed to connect to the testnet: {e}"); + println!("deploying local contract"); + let path = format!("{WASMS_LOCATION}/{WRAP_NEAR_WASM}"); + let wasm = read(path).await?; + sandbox.dev_deploy(&wasm).await? + } + }; + + let res = contract.call("new").transact().await?; + println!( + "\nwrapNEAR contract initialization outcome: {}\n", + format_execution_result(&res) + ); + + Ok(contract) +} + +async fn register_account(account: &Account, wrap_near: &AccountId) -> Result<()> { + let args = json!( + { + "account_id": wrap_near, + } + ); + + let res = account + .call(wrap_near, WRAP_NEAR_STORAGE_DEPOSIT_CALL) + .args_json(args) + .deposit(WRAP_NEAR_STORAGE_DEPOSIT) + .transact() + .await?; + println!( + "account storage deposit in wrap near contract outcome: {}", + format_execution_result(&res) + ); + + let res = account + .call(wrap_near, WRAP_NEAR_DEPOSIT_CALL) + .deposit(WRAP_NEAR_DEPOSIT) + .transact() + .await?; + println!( + "account registration in wrap near contract outcome: {}", + format_execution_result(&res) + ); + Ok(()) +} + +async fn prepare_issuer_account(sandbox: Worker, wrap_near: AccountId) -> Result { + let issuer = sandbox.dev_create_account().await?; + + register_account(&issuer, &wrap_near).await?; + + Ok(issuer) +} + +async fn prepare_nft_owner_account( + sandbox: Worker, + wrap_near: AccountId, +) -> Result { + let owner = sandbox.dev_create_account().await?; + + register_account(&owner, &wrap_near).await?; + + Ok(owner) +} + +async fn prepare_vault_contract( + sandbox: Worker, + wrap_near: AccountId, +) -> Result { + let name = env!("CARGO_PKG_NAME").replace('-', "_"); + + let path = format!("{WASMS_LOCATION}/{name}.wasm"); + println!("read WASM contract code from: {path}"); + + let wasm = read(path).await?; + println!("vault WASM code imported"); + + let contract = sandbox.dev_deploy(&wasm).await?; + println!("vault WASM code deployed"); + + register_account(contract.as_account(), &wrap_near).await?; + + Ok(contract) +} + +pub async fn prepare_nft_contract(sandbox: Worker) -> Result { + let path = format!("{WASMS_LOCATION}/{NFT_WASM}"); + + let wasm = read(path).await?; + + let contract = sandbox.dev_deploy(&wasm).await?; + + let args = json!({ + "owner_id": contract.id(), + }); + + let res = contract + .call(NFT_NEW_DEFAULT_META_CALL) + .args_json(args) + .transact() + .await?; + println!( + "NFT contract initialization: {}", + format_execution_result(&res) + ); + + Ok(contract) +} + +pub fn format_execution_result(res: &ExecutionFinalResult) -> String { + format!( + "\ntransaction: {} +receipts: {} +is success: {:#?}", + format_execution_outcome(res.outcome()), + format_receipt_outcomes(res.receipt_outcomes()), + res.is_success() + ) +} + +fn format_receipt_outcomes(outcomes: &[ExecutionOutcome]) -> String { + outcomes + .iter() + .map(|outcome| format_execution_outcome(outcome) + "\n") + .collect() +} + +fn format_execution_outcome(outcome: &ExecutionOutcome) -> String { + format!( + " + executor_id: {} + gas_burnt: {}, + logs: {:#?}, + tokens_burnt: {}", + outcome.executor_id, outcome.gas_burnt, outcome.logs, outcome.tokens_burnt + ) +} diff --git a/src/tests/integration.rs b/src/tests/integration.rs index a20e5c7..197422c 100644 --- a/src/tests/integration.rs +++ b/src/tests/integration.rs @@ -1,196 +1,30 @@ use anyhow::Result; -use near_contract_standards::non_fungible_token::TokenId; -use near_sdk::{collections::UnorderedMap, json_types::U128, serde_json::json}; -use tokio::fs::read; -use workspaces::{ - network::Sandbox, result::ExecutionFinalResult, sandbox, testnet, Account, AccountId, Contract, - Worker, -}; -use crate::{vault::Vault, Contract as VaultsContract}; - -const WASMS_LOCATION: &str = "dist"; -const WRAP_NEAR_WASM: &str = "wrap.wasm"; - -const NEAR: u128 = 10u128.pow(24); - -const WRAP_NEAR_TESTNET_ACCOUNT_ID: &str = "wrap.testnet"; -const WRAP_NEAR_STORAGE_DEPOSIT_CALL: &str = "storage_deposit"; -const WRAP_NEAR_STORAGE_DEPOSIT: u128 = 12_500_000_000_000_000_000_000; -const WRAP_NEAR_DEPOSIT_CALL: &str = "near_deposit"; -const WRAP_NEAR_DEPOSIT: u128 = 10 * NEAR; +use crate::tests::{environment::Environment, NEAR}; #[tokio::test] async fn test_contract() -> Result<()> { - let sandbox = sandbox().await?; - println!("sandbox initialized"); - - let wrap_near = prepare_wrap_near_contract(&sandbox).await?; - println!("wrap NEAR token account ready on: {}\n", wrap_near.id()); - - let issuer = prepare_issuer_account(&sandbox, wrap_near.id()).await?; - println!("issuer account: {}", issuer.id()); - - let nft_owner = prepare_nft_owner_account(&sandbox, wrap_near.id()).await?; - println!("NFT owner account: {}", nft_owner.id()); + let env = Environment::new().await?; - let vault = prepare_vault_contract(&sandbox, wrap_near.id()).await?; - println!("NFT benefits vault account ready on: {}\n", wrap_near.id()); - - deposit_to_vault(&issuer, &wrap_near, &vault).await?; + env.deposit_to_vault().await?; println!("deposit to vault: OK"); - check_vault_state(&nft_owner, &vault).await?; + check_vault_state(&env).await?; println!("check vault state: OK"); Ok(()) } -async fn prepare_issuer_account( - sandbox: &Worker, - wrap_near: &AccountId, -) -> Result { - let issuer = sandbox.dev_create_account().await?; - - register_account(&issuer, wrap_near).await?; - - Ok(issuer) -} - -async fn register_account(account: &Account, wrap_near: &AccountId) -> Result<()> { - let args = json!( - { - "account_id": wrap_near, - } - ); - - let res = account - .call(wrap_near, WRAP_NEAR_STORAGE_DEPOSIT_CALL) - .args_json(args) - .deposit(WRAP_NEAR_STORAGE_DEPOSIT) - .transact() - .await?; - println!( - "account storage deposit in wrap near contract outcome: {}", - format_execution_result(&res) - ); - - let res = account - .call(wrap_near, WRAP_NEAR_DEPOSIT_CALL) - .deposit(WRAP_NEAR_DEPOSIT) - .transact() - .await?; - println!( - "account registration in wrap near contract outcome: {}", - format_execution_result(&res) +async fn check_vault_state(env: &Environment) -> Result<()> { + let balance = env.balance_of().await?; + assert_eq!( + balance + .tokens + .iter() + .find(|t| t.account_id.as_str() == env.wrap_near.id().as_str()) + .expect("wrap near is not registered in the vault") + .amount, + 2 * NEAR ); Ok(()) } - -async fn prepare_nft_owner_account( - sandbox: &Worker, - wrap_near: &AccountId, -) -> Result { - let owner = sandbox.dev_create_account().await?; - - register_account(&owner, wrap_near).await?; - - Ok(owner) -} - -async fn prepare_wrap_near_contract(sandbox: &Worker) -> Result { - let id = WRAP_NEAR_TESTNET_ACCOUNT_ID.parse()?; - let contract = match testnet().await { - Ok(testnet) => { - let contract = sandbox.import_contract(&id, &testnet).transact().await?; - println!("wrap NEAR contract imported from testnet"); - contract - } - Err(e) => { - println!("failed to connect to the testnet: {e}"); - println!("deploying local contract"); - let path = format!("{WASMS_LOCATION}/{WRAP_NEAR_WASM}"); - let wasm = read(path).await?; - sandbox.dev_deploy(&wasm).await? - } - }; - - let res = contract.call("new").transact().await?; - println!( - "wrapNEAR contract initialization outcome: {}\n", - format_execution_result(&res) - ); - - Ok(contract) -} - -async fn prepare_vault_contract( - sandbox: &Worker, - wrap_near: &AccountId, -) -> Result { - let name = env!("CARGO_PKG_NAME").replace('-', "_"); - - let path = format!("{WASMS_LOCATION}/{name}.wasm"); - println!("read WASM contract code from: {path}"); - - let wasm = read(path).await?; - println!("vault WASM code imported"); - - let contract = sandbox.dev_deploy(&wasm).await?; - println!("vault WASM code deployed"); - - register_account(contract.as_account(), wrap_near).await?; - - Ok(contract) -} - -async fn deposit_to_vault( - issuer: &Account, - token_contract_id: &Contract, - vault: &Contract, -) -> Result<()> { - let args = json!( - { - "receiver_id": vault.id(), - "amount": U128(NEAR), - "msg": "" - } - ); - - let res = issuer - .call(token_contract_id.id(), "ft_transfer_call") - .args_json(args) - .deposit(1) - .max_gas() - .transact() - .await?; - - println!("deposit to vault: {}", format_execution_result(&res)); - - Ok(()) -} - -async fn check_vault_state(nft_owner: &Account, vault: &Contract) -> Result<()> { - let state = nft_owner.view(vault.id(), "balance", vec![]).await?; - println!("balance view call logs: {:#?}", state.logs); - - // println!("serialized response len: {}", state.result.len()); - - // let vaults: UnorderedMap = state.borsh()?; - - // println!("vault state: {:#?}", vaults); - todo!() -} - -fn format_execution_result(res: &ExecutionFinalResult) -> String { - format!( - "\ntotal gas burnt: {} - transaction: {:#?} - receipts: {:#?} - is success: {:#?}", - res.total_gas_burnt, - res.outcome(), - res.receipt_outcomes(), - res.is_success() - ) -} diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 6d3bbe6..53a7c30 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -1 +1,27 @@ +mod environment; mod integration; +mod view_balance_of; + +// Precompiled smart contracts locations. +const WASMS_LOCATION: &str = "dist"; +const WRAP_NEAR_WASM: &str = "wrap.wasm"; +const NFT_WASM: &str = "non_fungible_token.wasm"; + +// NEAR is 10^24 yoctoNEAR. +const NEAR: u128 = 10u128.pow(24); + +// Constants related to the wrap NEAR FT contract. +const WRAP_NEAR_TESTNET_ACCOUNT_ID: &str = "wrap.testnet"; +const WRAP_NEAR_STORAGE_DEPOSIT_CALL: &str = "storage_deposit"; +const WRAP_NEAR_STORAGE_DEPOSIT: u128 = 12_500_000_000_000_000_000_000; +const WRAP_NEAR_DEPOSIT_CALL: &str = "near_deposit"; +const WRAP_NEAR_DEPOSIT: u128 = 10 * NEAR; + +// Constants related to the NFT contract. +const NFT_NEW_DEFAULT_META_CALL: &str = "new_default_meta"; +const NFT_MINT_CALL: &str = "nft_mint"; +const NFT_MINT_STORAGE_DEPOSIT: u128 = 8_400_000_000_000_000_000_000; +const NFT_TOKEN_ID: &str = "awesome_test_pic_666"; + +// Constants related to the nft-benefits-vault contract. +const VAULT_BALANCE_OF_CALL: &str = "balance_of"; diff --git a/src/tests/view_balance_of.rs b/src/tests/view_balance_of.rs new file mode 100644 index 0000000..0640ef2 --- /dev/null +++ b/src/tests/view_balance_of.rs @@ -0,0 +1,33 @@ +use anyhow::{Context, Result}; + +use crate::tests::NEAR; + +use super::environment::Environment; + +#[tokio::test] +pub async fn test_view_balance_of() -> Result<()> { + let env = Environment::new().await?; + + env.issue_nft().await?; + + env.deposit_to_vault().await?; + + let balance = env + .balance_of() + .await + .with_context(|| "failed to check balance of")?; + + println!("balance: {balance:#?}"); + + assert_eq!( + balance + .tokens + .iter() + .find(|token| token.account_id.as_str() == env.wrap_near.id().as_str()) + .expect("wrap near is not registered in vault") + .amount, + 2 * NEAR + ); + + Ok(()) +} diff --git a/src/vault.rs b/src/vault.rs index c4bce6b..7648f85 100644 --- a/src/vault.rs +++ b/src/vault.rs @@ -15,7 +15,7 @@ pub struct Vault { impl Vault { pub fn new(key: TokenId) -> Self { - let assets = UnorderedMap::new(b"v"); + let assets = UnorderedMap::new(b"b"); Self { key, assets } } @@ -24,7 +24,7 @@ impl Vault { asset.balance += amount; asset } else { - Asset::new(ft_account_id.clone(), amount) + Asset::new(amount) }; self.assets.insert(&ft_account_id, &asset); } @@ -34,7 +34,7 @@ impl Vault { self.assets.get(&ft_account_id).is_none(), "Asset already exists" ); - let asset = Asset::new(ft_account_id.clone(), initial_balance); + let asset = Asset::new(initial_balance); self.assets.insert(&ft_account_id, &asset); } } diff --git a/src/views.rs b/src/views.rs index b80ee9a..9f31d3a 100644 --- a/src/views.rs +++ b/src/views.rs @@ -1,10 +1,40 @@ -use near_sdk::{borsh, near_bindgen}; +use near_contract_standards::non_fungible_token::TokenId; +use near_sdk::{ + near_bindgen, + serde::{Deserialize, Serialize}, + AccountId, +}; use crate::{Contract, ContractExt}; +#[derive(Debug, Serialize, Deserialize)] +#[serde(crate = "near_sdk::serde")] +pub struct Balance { + pub nft_id: TokenId, + pub tokens: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(crate = "near_sdk::serde")] +pub struct Token { + pub account_id: AccountId, + pub amount: u128, +} + #[near_bindgen] impl Contract { - pub fn balance(&self) -> Vec { - borsh::to_vec(&self.vaults).expect("serialization failed") + pub fn balance_of(&self, nft_id: TokenId) -> Option { + let vault = self.vaults.get(&nft_id)?; + + let tokens: Vec<_> = vault + .assets + .iter() + .map(|(account_id, asset)| Token { + account_id, + amount: asset.balance, + }) + .collect(); + + Some(Balance { nft_id, tokens }) } }