diff --git a/fuels-abigen-macro/tests/harness.rs b/fuels-abigen-macro/tests/harness.rs index a4e1c5425b..816793a30a 100644 --- a/fuels-abigen-macro/tests/harness.rs +++ b/fuels-abigen-macro/tests/harness.rs @@ -8,7 +8,7 @@ use fuels_core::Token; use fuels_signers::util::test_helpers::{ setup_address_and_coins, setup_test_provider, setup_test_provider_and_wallet, }; -use fuels_signers::{provider::Provider, LocalWallet}; +use fuels_signers::{provider::Provider, LocalWallet, Signer}; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; use sha2::{Digest, Sha256}; @@ -1363,8 +1363,22 @@ async fn test_amount_and_asset_forwarding() { // Trying to forward `amount` of a different asset_id. // Currently, if we use this asset_id in the forwarding, the VM will // return `AssetIdNotFound` if amount is larger than 0. - let asset: [u8; 32] = id.into(); - let call_params = CallParameters::new(None, Some(AssetId::from(asset))); + let asset: [u8; 32] = id.clone().into(); + + // withdraw some tokens to wallet + let c_id = testfuelcoincontract_mod::ContractId { value: id.into() }; + let address = wallet.address(); + let address = testfuelcoincontract_mod::Address { + value: address.into(), + }; + instance + .transfer_coins_to_output(1_000_000, c_id, address) + .append_variable_outputs(1) + .call() + .await + .unwrap(); + + let call_params = CallParameters::new(Some(0), Some(AssetId::from(asset))); let tx_params = TxParameters::new(None, Some(1_000_000), None); let response = instance diff --git a/fuels-abigen-macro/tests/test_projects/token-ops/Forc.lock b/fuels-abigen-macro/tests/test_projects/token-ops/Forc.lock index 2da25050a3..70e651e6e5 100644 --- a/fuels-abigen-macro/tests/test_projects/token-ops/Forc.lock +++ b/fuels-abigen-macro/tests/test_projects/token-ops/Forc.lock @@ -1,21 +1,16 @@ [[package]] name = 'core' -source = 'git+http://github.com/FuelLabs/sway-lib-core?reference=master#30274cf817c1848e28f984c2e8703eb25e7a3a44' -dependencies = [] - -[[package]] -name = 'core' -source = 'git+https://github.com/FuelLabs/sway-lib-core?reference=master#30274cf817c1848e28f984c2e8703eb25e7a3a44' +source = 'git+https://github.com/FuelLabs/sway-lib-core?branch=master#082bc8eb0616586ac0000825bfe6e9d47b0c713f' dependencies = [] [[package]] name = 'std' -source = 'git+http://github.com/FuelLabs/sway-lib-std?reference=master#7b973a638d5220228be616f1f89a249846001549' -dependencies = ['core git+https://github.com/FuelLabs/sway-lib-core?reference=master#30274cf817c1848e28f984c2e8703eb25e7a3a44'] +source = 'git+https://github.com/FuelLabs/sway-lib-std?branch=master#dc036471ced326e41f076700c0501efc1b442455' +dependencies = ['core git+https://github.com/FuelLabs/sway-lib-core?branch=master#082bc8eb0616586ac0000825bfe6e9d47b0c713f'] [[package]] name = 'token-ops' dependencies = [ - 'core git+http://github.com/FuelLabs/sway-lib-core?reference=master#30274cf817c1848e28f984c2e8703eb25e7a3a44', - 'std git+http://github.com/FuelLabs/sway-lib-std?reference=master#7b973a638d5220228be616f1f89a249846001549', + 'core git+https://github.com/FuelLabs/sway-lib-core?branch=master#082bc8eb0616586ac0000825bfe6e9d47b0c713f', + 'std git+https://github.com/FuelLabs/sway-lib-std?branch=master#dc036471ced326e41f076700c0501efc1b442455', ] diff --git a/fuels-abigen-macro/tests/test_projects/token-ops/Forc.toml b/fuels-abigen-macro/tests/test_projects/token-ops/Forc.toml index 7411765faf..3a4df3f849 100644 --- a/fuels-abigen-macro/tests/test_projects/token-ops/Forc.toml +++ b/fuels-abigen-macro/tests/test_projects/token-ops/Forc.toml @@ -5,5 +5,5 @@ license = "Apache-2.0" name = "token-ops" [dependencies] -core = { git = "http://github.com/FuelLabs/sway-lib-core", branch = "master" } -std = { git = "http://github.com/FuelLabs/sway-lib-std" , branch = "master"} +core = { git = "https://github.com/FuelLabs/sway-lib-core", branch = "master" } +std = { git = "https://github.com/FuelLabs/sway-lib-std" , branch = "master"} diff --git a/fuels-abigen-macro/tests/test_projects/token-ops/out/debug/token-ops.bin b/fuels-abigen-macro/tests/test_projects/token-ops/out/debug/token-ops.bin index 47f5aa4823..aee8d3a765 100644 Binary files a/fuels-abigen-macro/tests/test_projects/token-ops/out/debug/token-ops.bin and b/fuels-abigen-macro/tests/test_projects/token-ops/out/debug/token-ops.bin differ diff --git a/fuels-abigen-macro/tests/test_projects/token-ops/src/main.sw b/fuels-abigen-macro/tests/test_projects/token-ops/src/main.sw index 7e1f536142..0be201673c 100644 --- a/fuels-abigen-macro/tests/test_projects/token-ops/src/main.sw +++ b/fuels-abigen-macro/tests/test_projects/token-ops/src/main.sw @@ -1,6 +1,6 @@ contract; -use std::{address::Address, context::balance_of_contract, context::msg_amount, contract_id::ContractId, token::*}; +use std::{address::Address, context::balance_of, context::msg_amount, contract_id::ContractId, token::*}; abi TestFuelCoin { fn mint_coins(mint_amount: u64); @@ -29,10 +29,10 @@ impl TestFuelCoin for Contract { } fn get_balance(target: ContractId, asset_id: ContractId) -> u64 { - balance_of_contract(target, asset_id) + balance_of(target, asset_id) } fn get_msg_amount() -> u64 { msg_amount() } -} +} \ No newline at end of file diff --git a/fuels-contract/src/contract.rs b/fuels-contract/src/contract.rs index d6335361aa..b16e87b985 100644 --- a/fuels-contract/src/contract.rs +++ b/fuels-contract/src/contract.rs @@ -171,17 +171,39 @@ impl Contract { ); inputs.push(self_contract_input); - let spendables = wallet + let mut spendables = wallet .get_spendable_coins(&AssetId::default(), DEFAULT_COIN_AMOUNT as u64) .await .unwrap(); + // add default asset change if any inputs are being spent + if !spendables.is_empty() { + let change_output = Output::change(wallet.address(), 0, AssetId::default()); + outputs.push(change_output); + } + + if call_parameters.asset_id != AssetId::default() { + let alt_spendables = wallet + .get_spendable_coins(&call_parameters.asset_id, call_parameters.amount) + .await + .unwrap(); + + // add alt change if inputs are being spent + if !alt_spendables.is_empty() { + let change_output = Output::change(wallet.address(), 0, call_parameters.asset_id); + outputs.push(change_output); + } + + // add alt coins to inputs + spendables.extend(alt_spendables.into_iter()); + } + for coin in spendables { let input_coin = Input::coin( UtxoId::from(coin.utxo_id), coin.owner.into(), coin.amount.0, - AssetId::default(), + coin.asset_id.into(), 0, 0, vec![], @@ -196,9 +218,6 @@ impl Contract { let self_contract_output = Output::contract(0, Bytes32::zeroed(), Bytes32::zeroed()); outputs.push(self_contract_output); - let change_output = Output::change(wallet.address(), 0, AssetId::default()); - outputs.push(change_output); - // Add external contract IDs to Input/Output pair, if applicable. if let Some(external_contract_ids) = external_contracts { for (idx, external_contract_id) in external_contract_ids.iter().enumerate() {