diff --git a/contracts/digital-cash/Cargo.toml b/contracts/digital-cash/Cargo.toml index 383bdb0b..b190f7bd 100644 --- a/contracts/digital-cash/Cargo.toml +++ b/contracts/digital-cash/Cargo.toml @@ -7,7 +7,9 @@ publish = false [lib] path = "src/digital_cash.rs" + [dependencies.multiversx-sc] -version = "0.41.3" +version = "0.43.3" + [dev-dependencies.multiversx-sc-scenario] -version = "0.41.3" +version = "0.43.3" diff --git a/contracts/digital-cash/meta/Cargo.toml b/contracts/digital-cash/meta/Cargo.toml index 15cc1bd2..4a557f21 100644 --- a/contracts/digital-cash/meta/Cargo.toml +++ b/contracts/digital-cash/meta/Cargo.toml @@ -3,8 +3,9 @@ name = "digital-cash-meta" version = "0.0.0" edition = "2021" publish = false + [dependencies.digital-cash] path = ".." [dependencies.multiversx-sc-meta] -version = "0.41.3" +version = "0.43.3" diff --git a/contracts/digital-cash/scenarios/claim-egld.scen.json b/contracts/digital-cash/scenarios/claim-egld.scen.json index 89459708..085287a1 100644 --- a/contracts/digital-cash/scenarios/claim-egld.scen.json +++ b/contracts/digital-cash/scenarios/claim-egld.scen.json @@ -153,7 +153,7 @@ } }, "str:fee": "10", - "str:collected_fees": "10" + "str:collectedFees": "10" }, "code": "file:../output/digital-cash.wasm" }, @@ -163,7 +163,7 @@ "storage": {} }, "address:acc2": { - "nonce": "6", + "nonce": "7", "balance": "1,000,000", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/scenarios/claim-esdt.scen.json b/contracts/digital-cash/scenarios/claim-esdt.scen.json index 7ced2430..d3010b1e 100644 --- a/contracts/digital-cash/scenarios/claim-esdt.scen.json +++ b/contracts/digital-cash/scenarios/claim-esdt.scen.json @@ -152,7 +152,7 @@ } }, "str:fee": "10", - "str:collected_fees": "10" + "str:collectedFees": "10" }, "code": "file:../output/digital-cash.wasm" }, @@ -165,7 +165,7 @@ "storage": {} }, "address:acc2": { - "nonce": "2", + "nonce": "3", "balance": "999,990", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/scenarios/claim-fees.scen.json b/contracts/digital-cash/scenarios/claim-fees.scen.json index 62565776..0b9c11b9 100644 --- a/contracts/digital-cash/scenarios/claim-fees.scen.json +++ b/contracts/digital-cash/scenarios/claim-fees.scen.json @@ -11,7 +11,7 @@ "tx": { "from": "address:acc2", "to": "sc:the_digital_cash_contract", - "function": "claim_fees", + "function": "claimFees", "gasLimit": "500,000,000", "gasPrice": "0" }, @@ -40,7 +40,7 @@ "tx": { "from": "address:digital_cash_owner_address", "to": "sc:the_digital_cash_contract", - "function": "claim_fees", + "function": "claimFees", "gasLimit": "500,000,000", "gasPrice": "0" }, @@ -97,7 +97,7 @@ "storage": {} }, "address:acc2": { - "nonce": "7", + "nonce": "8", "balance": "1,000,000", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/scenarios/claim-multi-esdt.scen.json b/contracts/digital-cash/scenarios/claim-multi-esdt.scen.json index d2701252..85df0810 100644 --- a/contracts/digital-cash/scenarios/claim-multi-esdt.scen.json +++ b/contracts/digital-cash/scenarios/claim-multi-esdt.scen.json @@ -150,7 +150,7 @@ } }, "str:fee": "10", - "str:collected_fees": "30" + "str:collectedFees": "30" }, "code": "file:../output/digital-cash.wasm" }, @@ -160,7 +160,7 @@ "storage": {} }, "address:acc2": { - "nonce": "6", + "nonce": "7", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50", diff --git a/contracts/digital-cash/scenarios/forward.scen.json b/contracts/digital-cash/scenarios/forward.scen.json index faed1b6a..ad9f4141 100644 --- a/contracts/digital-cash/scenarios/forward.scen.json +++ b/contracts/digital-cash/scenarios/forward.scen.json @@ -36,7 +36,7 @@ "from": "address:acc2", "to": "sc:the_digital_cash_contract", "egldValue": "1,000", - "function": "deposit_fees", + "function": "depositFees", "arguments": [ "0xa40e72cdac3580e7203a4c2565c932f7691c35e624bcfd82718d7f559c88f440" ], @@ -82,7 +82,7 @@ "from": "address:acc2", "to": "sc:the_digital_cash_contract", "egldValue": "1,000", - "function": "deposit_fees", + "function": "depositFees", "arguments": [ "0x8dc17613990e9b7476401a36d112d1a4d31190dec21e7e9a3c933872a27613ee" ], @@ -168,7 +168,7 @@ } }, "str:fee": "10", - "str:collected_fees": "40" + "str:collectedFees": "40" }, "code": "file:../output/digital-cash.wasm" }, @@ -178,7 +178,7 @@ "storage": {} }, "address:acc2": { - "nonce": "7", + "nonce": "8", "balance": "997,000", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/scenarios/fund-egld-and-esdt.scen.json b/contracts/digital-cash/scenarios/fund-egld-and-esdt.scen.json index 77f90d13..7263a472 100644 --- a/contracts/digital-cash/scenarios/fund-egld-and-esdt.scen.json +++ b/contracts/digital-cash/scenarios/fund-egld-and-esdt.scen.json @@ -36,7 +36,7 @@ "from": "address:acc1", "to": "sc:the_digital_cash_contract", "egldValue": "1,000", - "function": "deposit_fees", + "function": "depositFees", "arguments": [ "0xdb474a3a065d3f0c0a62ae680ef6435e48eb482899d2ae30ff7a3a4b0ef19c60" ], @@ -135,7 +135,7 @@ "from": "address:acc2", "to": "sc:the_digital_cash_contract", "egldValue": "1,000", - "function": "deposit_fees", + "function": "depositFees", "arguments": [ "0x487bd4010b50c24a02018345fe5171edf4182e6294325382c75ef4c4409f01bd" ], @@ -248,6 +248,34 @@ { "step": "scCall", "id": "fund-fail-2", + "tx": { + "from": "address:acc2", + "to": "sc:the_digital_cash_contract", + "esdtValue": [ + { + "tokenIdentifier": "str:CASHTOKEN-123456", + "value": "10" + } + ], + "function": "fund", + "arguments": [ + "0x487bd4010b50c24a02018345fe5171edf4182e6294325382c75ef4c4409f01bd", + "u64:100" + ], + "gasLimit": "100,000,000", + "gasPrice": "0" + }, + "expect": { + "out": [], + "status": "4", + "message": "str:key already used", + "gas": "*", + "refund": "*" + } + }, + { + "step": "scCall", + "id": "fund-fail-3", "tx": { "from": "address:acc3", "to": "sc:the_digital_cash_contract", @@ -276,7 +304,7 @@ "expect": { "out": [], "status": "4", - "message": "str:key already used", + "message": "str:invalid depositor", "gas": "*", "refund": "*" } @@ -288,7 +316,7 @@ "from": "address:acc3", "to": "sc:the_digital_cash_contract", "egldValue": "1,000", - "function": "deposit_fees", + "function": "depositFees", "arguments": [ "0x885532043a061e0c779e4064b85193f72cffd22c5bcc208c209128e60f21bf0d" ], @@ -396,7 +424,7 @@ "storage": {} }, "address:acc2": { - "nonce": "2", + "nonce": "3", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/scenarios/withdraw-egld.scen.json b/contracts/digital-cash/scenarios/withdraw-egld.scen.json index 09cc07d0..e89119fb 100644 --- a/contracts/digital-cash/scenarios/withdraw-egld.scen.json +++ b/contracts/digital-cash/scenarios/withdraw-egld.scen.json @@ -83,7 +83,7 @@ "storage": {} }, "address:acc2": { - "nonce": "2", + "nonce": "3", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50" @@ -206,7 +206,7 @@ "storage": {} }, "address:acc2": { - "nonce": "2", + "nonce": "3", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/scenarios/withdraw-esdt.scen.json b/contracts/digital-cash/scenarios/withdraw-esdt.scen.json index f6cd263b..77a8fbe9 100644 --- a/contracts/digital-cash/scenarios/withdraw-esdt.scen.json +++ b/contracts/digital-cash/scenarios/withdraw-esdt.scen.json @@ -83,7 +83,7 @@ "storage": {} }, "address:acc2": { - "nonce": "3", + "nonce": "4", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50" @@ -205,7 +205,7 @@ "storage": {} }, "address:acc2": { - "nonce": "5", + "nonce": "6", "balance": "1,000,000", "esdt": { "str:CASHTOKEN-123456": "100" diff --git a/contracts/digital-cash/scenarios/withdraw-multi-esdt.scen.json b/contracts/digital-cash/scenarios/withdraw-multi-esdt.scen.json index f9194207..7f1a96e2 100644 --- a/contracts/digital-cash/scenarios/withdraw-multi-esdt.scen.json +++ b/contracts/digital-cash/scenarios/withdraw-multi-esdt.scen.json @@ -83,7 +83,7 @@ "storage": {} }, "address:acc2": { - "nonce": "3", + "nonce": "4", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50" @@ -203,7 +203,7 @@ "storage": {} }, "address:acc2": { - "nonce": "5", + "nonce": "6", "balance": "999,000", "esdt": { "str:CASHTOKEN-123456": "50" diff --git a/contracts/digital-cash/src/deposit_info.rs b/contracts/digital-cash/src/deposit_info.rs index db352424..b156275a 100644 --- a/contracts/digital-cash/src/deposit_info.rs +++ b/contracts/digital-cash/src/deposit_info.rs @@ -1,8 +1,4 @@ -use multiversx_sc::{ - api::ManagedTypeApi, - types::{BigUint, EsdtTokenPayment, ManagedAddress, ManagedVec}, -}; - +multiversx_sc::imports!(); multiversx_sc::derive_imports!(); #[derive(NestedEncode, NestedDecode, TopEncode, TopDecode, TypeAbi)] @@ -20,7 +16,12 @@ where M: ManagedTypeApi, { pub fn get_num_tokens(&self) -> usize { - (self.egld_funds != BigUint::zero()) as usize + self.esdt_funds.len() + let mut amount = self.esdt_funds.len(); + if self.egld_funds > 0 { + amount += 1; + } + + amount } } diff --git a/contracts/digital-cash/src/digital_cash.rs b/contracts/digital-cash/src/digital_cash.rs index ea4a8dae..aee3e173 100644 --- a/contracts/digital-cash/src/digital_cash.rs +++ b/contracts/digital-cash/src/digital_cash.rs @@ -11,6 +11,11 @@ use deposit_info::{DepositInfo, Fee}; pub const SECONDS_PER_ROUND: u64 = 6; pub use multiversx_sc::api::{ED25519_KEY_BYTE_LEN, ED25519_SIGNATURE_BYTE_LEN}; +static NON_EXISTENT_KEY_ERR_MSG: &[u8] = b"non-existent key"; +static FEES_NOT_COVERED_ERR_MSG: &[u8] = b"fees not covered"; +static CANNOT_DEPOSIT_FUNDS_ERR_MSG: &[u8] = + b"cannot deposit funds without covering the fee cost first"; + #[multiversx_sc::contract] pub trait DigitalCash { #[init] @@ -18,30 +23,33 @@ pub trait DigitalCash { self.fee().set(fee); } - //endpoints + // endpoints #[endpoint] #[payable("*")] fn fund(&self, address: ManagedAddress, valability: u64) { - require!(!self.deposit(&address).is_empty(), "fees not covered"); + let deposit_mapper = self.deposit(&address); + require!(!deposit_mapper.is_empty(), FEES_NOT_COVERED_ERR_MSG); + let depositor = deposit_mapper.get().depositor_address; + require!( + self.blockchain().get_caller() == depositor, + "invalid depositor" + ); - let esdt_payment = self.call_value().all_esdt_transfers().clone_value(); let egld_payment = self.call_value().egld_value().clone_value(); - - let num_tokens = (egld_payment != BigUint::zero()) as usize + esdt_payment.len(); - + let esdt_payment = self.call_value().all_esdt_transfers().clone_value(); + let num_tokens = self.get_num_token_transfers(&egld_payment, &esdt_payment); require!(num_tokens > 0, "amount must be greater than 0"); let fee = self.fee().get(); - - self.deposit(&address).update(|deposit| { + deposit_mapper.update(|deposit| { require!( - deposit.egld_funds == BigUint::zero() && deposit.esdt_funds.is_empty(), + deposit.egld_funds == 0 && deposit.esdt_funds.is_empty(), "key already used" ); require!( fee * num_tokens as u64 <= deposit.fees.value, - "cannot deposit funds without covering the fee cost first" + CANNOT_DEPOSIT_FUNDS_ERR_MSG ); deposit.fees.num_token_to_transfer += num_tokens; @@ -54,19 +62,18 @@ pub trait DigitalCash { #[endpoint] fn withdraw(&self, address: ManagedAddress) { - require!(!self.deposit(&address).is_empty(), "non-existent key"); + let deposit_mapper = self.deposit(&address); + require!(!deposit_mapper.is_empty(), NON_EXISTENT_KEY_ERR_MSG); let block_round = self.blockchain().get_block_round(); - - let deposit = self.deposit(&address).get(); - + let deposit = deposit_mapper.take(); require!( deposit.expiration_round < block_round, "withdrawal has not been available yet" ); let egld_funds = deposit.egld_funds + deposit.fees.value; - if egld_funds != BigUint::zero() { + if egld_funds > 0 { self.send() .direct_egld(&deposit.depositor_address, &egld_funds); } @@ -75,8 +82,6 @@ pub trait DigitalCash { self.send() .direct_multi(&deposit.depositor_address, &deposit.esdt_funds); } - - self.deposit(&address).clear(); } #[endpoint] @@ -85,93 +90,74 @@ pub trait DigitalCash { address: ManagedAddress, signature: ManagedByteArray, ) { - require!(!self.deposit(&address).is_empty(), "non-existent key"); + let deposit_mapper = self.deposit(&address); + require!(!deposit_mapper.is_empty(), NON_EXISTENT_KEY_ERR_MSG); let caller_address = self.blockchain().get_caller(); self.require_signature(&address, &caller_address, signature); let block_round = self.blockchain().get_block_round(); - let fee = self.fee().get(); + let mut deposit = deposit_mapper.take(); + require!(deposit.expiration_round >= block_round, "deposit expired"); - self.deposit(&address).update(|deposit| { - require!(deposit.expiration_round >= block_round, "deposit expired"); - let num_tokens_transfered = &deposit.get_num_tokens(); - let fee_cost = fee * *num_tokens_transfered as u64; - - deposit.fees.num_token_to_transfer -= num_tokens_transfered; - deposit.fees.value -= &fee_cost; - - self.collected_fees() - .update(|collected_fees| *collected_fees += fee_cost); - - if deposit.egld_funds != BigUint::zero() { - self.send() - .direct_egld(&caller_address, &deposit.egld_funds); - } - - if !deposit.esdt_funds.is_empty() { - self.send() - .direct_multi(&caller_address, &deposit.esdt_funds); - } + let num_tokens_transfered = deposit.get_num_tokens(); + let fee_cost = fee * num_tokens_transfered as u64; + deposit.fees.value -= &fee_cost; - if deposit.fees.value > 0 { - self.send() - .direct_egld(&deposit.depositor_address, &deposit.fees.value); - } - }); + self.collected_fees() + .update(|collected_fees| *collected_fees += fee_cost); - self.deposit(&address).clear(); + if deposit.egld_funds > 0 { + self.send() + .direct_egld(&caller_address, &deposit.egld_funds); + } + if !deposit.esdt_funds.is_empty() { + self.send() + .direct_multi(&caller_address, &deposit.esdt_funds); + } + if deposit.fees.value > 0 { + self.send() + .direct_egld(&deposit.depositor_address, &deposit.fees.value); + } } - #[endpoint] + #[endpoint(claimFees)] #[only_owner] fn claim_fees(&self) { - let caller_address = self.blockchain().get_caller(); - let fees = self.collected_fees().get(); + let fees = self.collected_fees().take(); + if fees == 0 { + return; + } + let caller_address = self.blockchain().get_caller(); self.send().direct_egld(&caller_address, &fees); - self.collected_fees().clear(); - } - - fn require_signature( - &self, - address: &ManagedAddress, - caller_address: &ManagedAddress, - signature: ManagedByteArray, - ) { - let addr = address.as_managed_buffer(); - let message = caller_address.as_managed_buffer(); - require!( - self.crypto() - .verify_ed25519(addr, message, signature.as_managed_buffer()), - "invalid signature" - ); } - #[endpoint] + #[endpoint(depositFees)] #[payable("EGLD")] fn deposit_fees(&self, address: ManagedAddress) { let payment = self.call_value().egld_value().clone_value(); let caller_address = self.blockchain().get_caller(); + let deposit_mapper = self.deposit(&address); + if !deposit_mapper.is_empty() { + deposit_mapper.update(|deposit| deposit.fees.value += payment); - if self.deposit(&address).is_empty() { - let new_deposit = DepositInfo { - depositor_address: caller_address, - esdt_funds: ManagedVec::new(), - egld_funds: BigUint::zero(), - valability: 0, - expiration_round: 0, - fees: Fee { - num_token_to_transfer: 0, - value: payment, - }, - }; - self.deposit(&address).set(new_deposit) - } else { - self.deposit(&address) - .update(|deposit| deposit.fees.value += payment); + return; } + + let new_deposit = DepositInfo { + depositor_address: caller_address, + esdt_funds: ManagedVec::new(), + egld_funds: BigUint::zero(), + valability: 0, + expiration_round: 0, + fees: Fee { + num_token_to_transfer: 0, + value: payment, + }, + }; + deposit_mapper.set(new_deposit); } #[endpoint] @@ -181,18 +167,16 @@ pub trait DigitalCash { forward_address: ManagedAddress, signature: ManagedByteArray, ) { - require!( - !self.deposit(&forward_address).is_empty(), - "cannot deposit funds without covering the fee cost first" - ); + let deposit_mapper = self.deposit(&forward_address); + require!(!deposit_mapper.is_empty(), CANNOT_DEPOSIT_FUNDS_ERR_MSG); let caller_address = self.blockchain().get_caller(); let fee = self.fee().get(); self.require_signature(&address, &caller_address, signature); - let mut forwarded_deposit = self.deposit(&address).get(); + let mut forwarded_deposit = self.deposit(&address).take(); let num_tokens = forwarded_deposit.get_num_tokens(); - self.deposit(&forward_address).update(|deposit| { + deposit_mapper.update(|deposit| { require!( deposit.egld_funds == BigUint::zero() && deposit.esdt_funds.is_empty(), "key already used" @@ -210,7 +194,6 @@ pub trait DigitalCash { }); let forward_fee = &fee * num_tokens as u64; - forwarded_deposit.fees.value -= &forward_fee; self.collected_fees() @@ -222,47 +205,67 @@ pub trait DigitalCash { &forwarded_deposit.fees.value, ); } - - self.deposit(&address).clear(); } - //views + // views - #[view(amount)] + #[view(getAmount)] fn get_amount( &self, address: ManagedAddress, token: EgldOrEsdtTokenIdentifier, nonce: u64, ) -> BigUint { - require!(!self.deposit(&address).is_empty(), "non-existent key"); - - let mut amount = BigUint::zero(); + let deposit_mapper = self.deposit(&address); + require!(!deposit_mapper.is_empty(), NON_EXISTENT_KEY_ERR_MSG); - require!(!self.deposit(&address).is_empty(), "non-existent key"); - - let deposit = self.deposit(&address).get(); + let deposit = deposit_mapper.get(); if token.is_egld() { - amount = deposit.egld_funds; - } else { - for esdt in deposit.esdt_funds.into_iter() { - if esdt.token_identifier == token && esdt.token_nonce == nonce { - amount = esdt.amount; - } + return deposit.egld_funds; + } + + for esdt in deposit.esdt_funds.into_iter() { + if esdt.token_identifier == token && esdt.token_nonce == nonce { + return esdt.amount; } } - amount + BigUint::zero() } - //private functions + // private functions fn get_expiration_round(&self, valability: u64) -> u64 { let valability_rounds = valability / SECONDS_PER_ROUND; self.blockchain().get_block_round() + valability_rounds } - //storage + fn get_num_token_transfers( + &self, + egld_value: &BigUint, + esdt_transfers: &ManagedVec, + ) -> usize { + let mut amount = esdt_transfers.len(); + if egld_value > &0 { + amount += 1; + } + + amount + } + + fn require_signature( + &self, + address: &ManagedAddress, + caller_address: &ManagedAddress, + signature: ManagedByteArray, + ) { + let addr = address.as_managed_buffer(); + let message = caller_address.as_managed_buffer(); + self.crypto() + .verify_ed25519(addr, message, signature.as_managed_buffer()); + } + + // storage #[view] #[storage_mapper("deposit")] @@ -271,6 +274,6 @@ pub trait DigitalCash { #[storage_mapper("fee")] fn fee(&self) -> SingleValueMapper; - #[storage_mapper("collected_fees")] + #[storage_mapper("collectedFees")] fn collected_fees(&self) -> SingleValueMapper; } diff --git a/contracts/digital-cash/tests/digital_cash_scenario_go_test.rs b/contracts/digital-cash/tests/digital_cash_scenario_go_test.rs index 9f78e742..e2d4d112 100644 --- a/contracts/digital-cash/tests/digital_cash_scenario_go_test.rs +++ b/contracts/digital-cash/tests/digital_cash_scenario_go_test.rs @@ -1,39 +1,55 @@ +use multiversx_sc_scenario::*; + +fn world() -> ScenarioWorld { + ScenarioWorld::vm_go() +} + #[test] fn claim_egld_go() { - multiversx_sc_scenario::run_go("scenarios/claim-egld.scen.json"); + world().run("scenarios/claim-egld.scen.json"); } #[test] fn claim_esdt_go() { - multiversx_sc_scenario::run_go("scenarios/claim-esdt.scen.json"); + world().run("scenarios/claim-esdt.scen.json"); } #[test] fn claim_fees_go() { - multiversx_sc_scenario::run_go("scenarios/claim-fees.scen.json"); + world().run("scenarios/claim-fees.scen.json"); +} + +#[test] +fn claim_multi_esdt_go() { + world().run("scenarios/claim-multi-esdt.scen.json"); +} + +#[test] +fn forward_go() { + world().run("scenarios/forward.scen.json"); } #[test] fn fund_egld_and_esdt_go() { - multiversx_sc_scenario::run_go("scenarios/fund-egld-and-esdt.scen.json"); + world().run("scenarios/fund-egld-and-esdt.scen.json"); } #[test] fn set_accounts_go() { - multiversx_sc_scenario::run_go("scenarios/set-accounts.scen.json"); + world().run("scenarios/set-accounts.scen.json"); } #[test] fn withdraw_egld_go() { - multiversx_sc_scenario::run_go("scenarios/withdraw-egld.scen.json"); + world().run("scenarios/withdraw-egld.scen.json"); } #[test] fn withdraw_esdt_go() { - multiversx_sc_scenario::run_go("scenarios/withdraw-esdt.scen.json"); + world().run("scenarios/withdraw-esdt.scen.json"); } #[test] -fn forward_go() { - multiversx_sc_scenario::run_go("scenarios/forward.scen.json"); +fn withdraw_multi_esdt_go() { + world().run("scenarios/withdraw-multi-esdt.scen.json"); } diff --git a/contracts/digital-cash/tests/digital_cash_scenario_rs_test.rs b/contracts/digital-cash/tests/digital_cash_scenario_rs_test.rs index 32b9e6ce..bc20caac 100644 --- a/contracts/digital-cash/tests/digital_cash_scenario_rs_test.rs +++ b/contracts/digital-cash/tests/digital_cash_scenario_rs_test.rs @@ -2,7 +2,7 @@ use multiversx_sc_scenario::*; fn world() -> ScenarioWorld { let mut blockchain = ScenarioWorld::new(); - blockchain.set_current_dir_from_workspace("contracts/digital-cash"); + blockchain.set_current_dir_from_workspace("contracts/examples/digital-cash"); blockchain.register_contract( "file:output/digital-cash.wasm", @@ -13,40 +13,50 @@ fn world() -> ScenarioWorld { #[test] fn claim_egld_rs() { - multiversx_sc_scenario::run_rs("scenarios/claim-egld.scen.json", world()); + world().run("scenarios/claim-egld.scen.json"); } #[test] fn claim_esdt_rs() { - multiversx_sc_scenario::run_rs("scenarios/claim-esdt.scen.json", world()); + world().run("scenarios/claim-esdt.scen.json"); } #[test] fn claim_fees_rs() { - multiversx_sc_scenario::run_rs("scenarios/claim-fees.scen.json", world()); + world().run("scenarios/claim-fees.scen.json"); +} + +#[test] +fn claim_multi_esdt_rs() { + world().run("scenarios/claim-multi-esdt.scen.json"); +} + +#[test] +fn forward_rs() { + world().run("scenarios/forward.scen.json"); } #[test] fn fund_egld_and_esdt_rs() { - multiversx_sc_scenario::run_rs("scenarios/fund-egld-and-esdt.scen.json", world()); + world().run("scenarios/fund-egld-and-esdt.scen.json"); } #[test] fn set_accounts_rs() { - multiversx_sc_scenario::run_rs("scenarios/set-accounts.scen.json", world()); + world().run("scenarios/set-accounts.scen.json"); } #[test] fn withdraw_egld_rs() { - multiversx_sc_scenario::run_rs("scenarios/withdraw-egld.scen.json", world()); + world().run("scenarios/withdraw-egld.scen.json"); } #[test] fn withdraw_esdt_rs() { - multiversx_sc_scenario::run_rs("scenarios/withdraw-esdt.scen.json", world()); + world().run("scenarios/withdraw-esdt.scen.json"); } #[test] -fn forward_rs() { - multiversx_sc_scenario::run_rs("scenarios/forward.scen.json", world()); +fn withdraw_multi_esdt_rs() { + world().run("scenarios/withdraw-multi-esdt.scen.json"); } diff --git a/contracts/digital-cash/wasm/Cargo.lock b/contracts/digital-cash/wasm/Cargo.lock index 2929b7de..30d389f9 100644 --- a/contracts/digital-cash/wasm/Cargo.lock +++ b/contracts/digital-cash/wasm/Cargo.lock @@ -81,9 +81,7 @@ checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] name = "multiversx-sc" -version = "0.41.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfbe80ec68fedf299dd65469f8999cf3c0f884ffa497122428f08303bcb8b884" +version = "0.43.3" dependencies = [ "bitflags", "hashbrown", @@ -95,9 +93,7 @@ dependencies = [ [[package]] name = "multiversx-sc-codec" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d70ea458247d263b7e9fdfb207530b6a530546247139c162450e515c013a18" +version = "0.18.1" dependencies = [ "arrayvec", "multiversx-sc-codec-derive", @@ -105,9 +101,7 @@ dependencies = [ [[package]] name = "multiversx-sc-codec-derive" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad6920f80fda67fc60fd51aaa9f83ec7e069470f60a068c81205f9da5d05a30" +version = "0.18.1" dependencies = [ "hex", "proc-macro2", @@ -117,9 +111,7 @@ dependencies = [ [[package]] name = "multiversx-sc-derive" -version = "0.41.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2b87d817f2176bf1830bef938884f24267516c334a377e71a96bc18ebb09c1" +version = "0.43.3" dependencies = [ "hex", "proc-macro2", @@ -130,9 +122,7 @@ dependencies = [ [[package]] name = "multiversx-sc-wasm-adapter" -version = "0.41.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "932327626de71eeb1dbe86b863cc70cc532f8ceba8e73a059410f6aa56b22a77" +version = "0.43.3" dependencies = [ "multiversx-sc", ] @@ -148,9 +138,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] @@ -163,18 +153,18 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -191,9 +181,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "syn" @@ -208,9 +198,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "version_check" diff --git a/contracts/digital-cash/wasm/Cargo.toml b/contracts/digital-cash/wasm/Cargo.toml index 3507968c..70623e78 100644 --- a/contracts/digital-cash/wasm/Cargo.toml +++ b/contracts/digital-cash/wasm/Cargo.toml @@ -12,14 +12,16 @@ crate-type = ["cdylib"] members = ["."] [dev-dependencies] + [profile.release] codegen-units = 1 opt-level = "z" lto = true debug = false panic = "abort" + [dependencies.digital-cash] path = ".." [dependencies.multiversx-sc-wasm-adapter] -version = "0.41.3" +version = "0.43.3" diff --git a/contracts/digital-cash/wasm/src/lib.rs b/contracts/digital-cash/wasm/src/lib.rs index 7e096e68..854d3310 100644 --- a/contracts/digital-cash/wasm/src/lib.rs +++ b/contracts/digital-cash/wasm/src/lib.rs @@ -10,6 +10,9 @@ // Total number of exported functions: 10 #![no_std] + +// Configuration that works with rustc < 1.73.0. +// TODO: Recommended rustc version: 1.73.0 or newer. #![feature(lang_items)] multiversx_sc_wasm_adapter::allocator!(); @@ -18,15 +21,16 @@ multiversx_sc_wasm_adapter::panic_handler!(); multiversx_sc_wasm_adapter::endpoints! { digital_cash ( - fund - withdraw - claim - claim_fees - deposit_fees - forward - amount - deposit + init => init + fund => fund + withdraw => withdraw + claim => claim + claimFees => claim_fees + depositFees => deposit_fees + forward => forward + getAmount => get_amount + deposit => deposit ) } -multiversx_sc_wasm_adapter::empty_callback! {} +multiversx_sc_wasm_adapter::async_callback_empty! {}