Skip to content

Commit

Permalink
Allow assets to be forwarded to contracts on calls (#191)
Browse files Browse the repository at this point in the history
  • Loading branch information
Voxelot authored Mar 29, 2022
1 parent 22b2f1e commit fc8ac81
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 23 deletions.
20 changes: 17 additions & 3 deletions fuels-abigen-macro/tests/harness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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
Expand Down
15 changes: 5 additions & 10 deletions fuels-abigen-macro/tests/test_projects/token-ops/Forc.lock
Original file line number Diff line number Diff line change
@@ -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',
]
4 changes: 2 additions & 2 deletions fuels-abigen-macro/tests/test_projects/token-ops/Forc.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"}
Binary file not shown.
6 changes: 3 additions & 3 deletions fuels-abigen-macro/tests/test_projects/token-ops/src/main.sw
Original file line number Diff line number Diff line change
@@ -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);
Expand Down Expand Up @@ -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()
}
}
}
29 changes: 24 additions & 5 deletions fuels-contract/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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![],
Expand All @@ -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() {
Expand Down

0 comments on commit fc8ac81

Please sign in to comment.