Skip to content

Releases: FuelLabs/fuels-rs

v0.44.0

17 Jul 17:14
2d38d65
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.43.0...v0.44.0

New features and breaking changes

Transaction dependencies estimation for script calls

Similar to the same feature for contract calls. This introduces a breaking change: TxDependencyExtension needs to be in scope to use append_variable_outputs and append_contract.

Support for U256 type

Missing types in the prelude and re-exports

Some types were missing from the main umbrella crate. These were added to it so now you can pull these from fuels. Types like fuel_tx::Output, TxPointer, UtxoId, Nonce, and more.

New LogDecoder getter for script instances

Improved error messages for the transaction builder

Support for configuring the client's RocksDB through the SDK

#[tokio::test]
#[cfg(any(not(feature = "fuel-core-lib"), feature = "rocksdb"))]
async fn create_or_use_rocksdb() -> Result<()> {
    use fuels::prelude::*;
    use std::path::PathBuf;

    // ANCHOR: create_or_use_rocksdb
    let provider_config = Config {
        database_path: PathBuf::from("/tmp/.spider/db"),
        database_type: DbType::RocksDb,
        ..Config::local_node()
    };
    // ANCHOR_END: create_or_use_rocksdb

    launch_custom_provider_and_get_wallets(Default::default(), Some(provider_config), None)
        .await;

    Ok(())
}

v0.41.1

28 Jun 21:41
Compare
Choose a tag to compare

Hotfix to unblock the composability labs team. Adds the predicates configurable feature to the 0.41 version.

v0.43.0

13 Jun 21:11
3138172
Compare
Choose a tag to compare

What's Changed

  • feat: add Into for Address and ContractId fn arguments by @hal3e in #967
  • chore: impl default for identity by @ra0x3 in #977
  • ci: bump forc version by @iqdecay in #988
  • chore!: merge fuels-types and fuels-core by @hal3e in #956
  • refactor: path of WalletUnlocked in fuels::accounts by @Salka1988 in #987
  • chore: re-export more fuel-tx types by @ra0x3 in #969
  • fix: create message type based on data length by @hal3e in #993
  • feat: use SDK type for tx in TransactionResponse by @MujkicA in #960
  • chore: use #[allow(dead_code)] in forc projects by @hal3e in #991
  • chore: set fuel-core to 0.18.2 by @hal3e in #996
  • deps: bump fuel-abi-types to v0.3.0 by @kayagokalp in #990
  • Bump versions to 0.43.0 by @digorithm in #1002

New Contributors

Full Changelog: v0.42.0...v0.43.0

Breaking changes

No more .into() when passing contract IDs or addresses to contract methods

Before:

let response = contract_methods
            .transfer_coins_to_output(1_000_000, contract_id.into(), address.into())
            .append_variable_outputs(1)
            .call()
            .await?;

After:

let response = contract_methods
            .transfer_coins_to_output(1_000_000, contract_id, address)
            .append_variable_outputs(1)
            .call()
            .await?;

v0.42.0

25 May 22:56
5fdea70
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.41.0...v0.42.0

Breaking changes

Types import path changes

  • Use fuels::types::input::Input instead of fuels::tx::input
  • Use fuels::types::coin::Coin instead of fuels::client::schema::coin::Coin and fuels::tx::Output::Coin
  • Use fuels::types::AssetId instead of fuels::client::schema::AssetId and fuels::tx::AssetId
  • Use fuels::tx::UtxoId instead of fuels::client::schema::UtxoId
  • Use fuels::types::coin::CoinStatus instead of fuels::client::schema::coin::CoinStatus
  • Use fuels::types::resource::Resource instead of fuels::client::schema::resource::Resource
  • Use fuels_types::types::Bytes32 instead of fuel_tx::Bytes32

Configurables for predicates

    abigen!(Predicate(
        name = "MyPredicate",
        abi = "packages/fuels/tests/predicates/predicate_configurables/out/debug/predicate_configurables-abi.json"
    ));

    let new_struct = StructWithGeneric {
        field_1: 32u8,
        field_2: 64,
    };
    let new_enum = EnumWithGeneric::VariantTwo;

    let configurables = MyPredicateConfigurables::new()
        .set_STRUCT(new_struct.clone())
        .set_ENUM(new_enum.clone());

    let predicate_data = MyPredicateEncoder::encode_data(8u8, true, new_struct, new_enum);

    let mut predicate: Predicate = Predicate::load_from(
        "tests/predicates/predicate_configurables/out/debug/predicate_configurables.bin",
    )?
    .with_data(predicate_data)
    .with_configurables(configurable);

fuel-core @ 0.18 changes

Note that some of these changes are subject to subsequent changes in future UX improvements.

  • Signing the transaction and predicate id generation requires ChainId(ConsensusParameters).
  • Now, tokens should be transferred to the contract first, and after you can transfer them via SMO or another transfer. So in some tests, we first need to transfer money to the contract.
  • The produce_blocks function is updated and doesn't require TimeParameters.
  • Removed redundant usage of MessageId. Now the identifier of the message is a Nonce.
  • Removed Output::Message. Now you don't need to specify it in the outputs. Because of that SMO opcode doesn't require a message output index.
  • The proof API is updated with a new design: FuelLabs/fuel-core#1046. To prove the block at height X, you need at least a committed X + 1 block.
  • Predicate::set_provider now returns a Result because it can fail if the "new" provider has different consensus parameters than the consensus parameters used previously
  • Predicate can be loaded with a provider using load_from_with_provider and from_code_and_provider. The from_code and load_from remain and use the default ConsensusParameters value.
  • Provider::new now takes a ConsensusParameters argument, so we can avoid changing the API of downstream clients.
  • setup_test_client now returns ConsensusParameters of the client. This was either this or setup_test_provider would have to change, and the former is much less used than the latter.

v0.41.0

14 Apr 16:21
adb4c9b
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.40.0...v0.41.0

Breaking changes

New setup_program_test! macro

The macro setup_contract_test! has been renamed to setup_program_test! and can now generate bindings for scripts and predicates. You can also create a script instance via LoadScript. Example:

    setup_program_test!(
        Wallets("wallet"),
        Abigen(Script(
            name = "MyScript",
            project = "packages/fuels/tests/types/scripts/script_generics"
        )),
        LoadScript(
            name = "script_instance",
            script = "MyScript",
            wallet = "wallet"
        )
    );

The command for generating bindings (Abigen) now requires the program type to be stated. Before: Abigen(name="..., now: Abigen(Contract(name="...".

Read the doc section The setup_program_test! macro for more details.

v0.40.0

12 Apr 17:47
dc65391
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.39.0...v0.40.0

New Features

Add support for Bytes and RawSlice inputs (#904)

This update introduces support for Bytes and RawSlice input types, giving developers more flexibility when working with byte sequences and raw slices. Thanks to @hal3e for this contribution!

Add LogResult struct (#919)

We have added a new LogResult struct to make it easier to work with and process log results from the Fuel Virtual Machine. This new feature will improve the developer experience when working with logs. Kudos to @Salka1988 for this addition!

Improvements

Separate Contract loading and deploying (#899)

This release includes a significant refactor that separates the Contract loading and deploying process. This change aims to improve code readability and maintainability. Great work by @hal3e!

The biggest change for the user is the way to deploy contracts. Previously the user would use deploy directly:

     let contract_id = Contract::deploy(
        "tests/contracts/configurables/out/debug/configurables.bin",
        &wallet,
        DeployConfiguration::default(),
    )
    .await?;

This function did two things: Load and then deploy the contract. Now, it looks like this:

    let contract_id = Contract::load_from(
        "tests/contracts/configurables/out/debug/configurables.bin",
        LoadConfiguration::default(),
    )?
    .deploy(&wallet, TxParameters::default())
    .await?;

This makes it clear what is being done. It makes the LoadConfiguration simpler, and also, now the user can get the contract_id or state_root easily.

    let contract_id = Contract::load_from(
        "tests/contracts/configurables/out/debug/configurables.bin",
        LoadConfiguration::default(),
    )?
    .contract_id();

Bug Fixes

Fix broken doc link (#922)

A broken documentation link has been fixed, ensuring users can now access the relevant information without issues. Thanks to @sarahschwartz for the quick fix!

Fix Parameterize and Tokenizable for wasm enums (#928)

We have resolved an issue where Parameterize and Tokenizable for wasm enums were broken. This fix ensures that these traits now work as intended for wasm enums. Credit goes to @segfault-magnet for identifying and fixing the issue!

Miscellaneous

Address default-features warnings on cargo nightly (chore) (#921)

We've addressed the default-features warnings on cargo nightly builds to keep the project up-to-date and reduce warnings. Special thanks to @segfault-magnet for taking care of this!

We encourage you to update your Fuels-rs library to v0.40 and take advantage of these new features and improvements. Your feedback is invaluable, so please don't hesitate to report any issues or share your thoughts on this release!

v0.39.0

03 Apr 16:45
5c162dd
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.38.1...v0.39.0

New features

Bytes types

The Sway Bytes type is now supported in the SDK.

Pay for fees using predicate

We've recently introduced the Account trait, which encapsulates all the behavior you commonly see in a wallet. Predicates also implement the Account trait now. This means you can use a Predicate the same way you'd use a wallet, when paying for transaction fees. For instance:

// Instead of passing the wallet used to sign the contract's transaction, we can now pass a predicate
let contract_methods = MyContract::new(contract_id, predicate).methods();
let tx_params = TxParameters::new(1000000, 10000, 0);

assert_eq!(predicate.get_asset_balance(&BASE_ASSET_ID).await?, 192);

let response = contract_methods
    .initialize_counter(42) // Build the ABI call
    .tx_params(tx_params)
    .call()
    .await?;

Note that this new feature introduces many breaking changes. Read more here: #815.

v0.38.1

17 Mar 22:21
694f163
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.38.0...v0.38.1

v0.38.0

16 Mar 19:35
358364c
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.37.1...v0.38.0

New features

Message output estimation

The transaction dependencies estimation method that automatically estimates things like contract IDs and variable outputs now also estimates message outputs.

Filtering spendable resources

get_spendable_resources now takes a filter object:

let filter = ResourceFilter {
            from: wallet.address().clone(),
            amount: coin_amount_1,
            excluded_utxos: vec![coin_2_utxo_id],
            excluded_message_ids: vec![message_id],
            ..Default::default()
        };
let resources = provider.get_spendable_resources(filter).await.unwrap();

Retrieving latest block time

The Provider now has a simple way to retrieve the latest block time: latest_block_time:

#[tokio::test]
async fn can_retrieve_latest_block_time() -> Result<()> {
    let provider = given_a_provider().await;
    let since_epoch = 1676039910;

    let latest_timestamp = Utc.timestamp_opt(since_epoch, 0).unwrap();
    let time = TimeParameters {
        start_time: latest_timestamp,
        block_time_interval: Duration::seconds(1),
    };
    provider.produce_blocks(1, Some(time)).await?;

    assert_eq!(
        provider.latest_block_time().await?.unwrap(),
        latest_timestamp
    );

    Ok(())
}

try_from_type_application return type change

try_from_type_application will not panic anymore. Instead, we propagate an InvalidData error. Type::from() is now Type::try_from().

Coins query no longer returns spent coins

Vec as output types for contract methods

The SDK now supports contract methods that return a vector:

Contract deployment configuration object

We've introduced a new builder struct, DeployConfiguration, for contract deployment. If you want to deploy a contract with the default configuration, you can do it like this:

let contract_id = Contract::deploy(
   "tests/contracts/configurables/out/debug/configurables.bin",
    &wallet,
    DeployConfiguration::default(),
)
.await?;

Alternatively, you can set TxParameters, StorageConfiguration, Configurables and Salt like this:

abigen!(Contract(
    name = "MyContract",
    abi = "packages/fuels/tests/contracts/configurables/out/debug/configurables-abi.json"
));

let wallet = launch_provider_and_get_wallet().await;

let tx_parameters = TxParameters::default()
    .set_gas_price(0)
    .set_gas_limit(1_000_000)
    .set_maturity(0);

let key = Bytes32::from([1u8; 32]);
let value = Bytes32::from([2u8; 32]);
let storage_slot = StorageSlot::new(key, value);
let storage_configuration =
    StorageConfiguration::default().set_manual_storage(vec![storage_slot]);

let configurables = MyContractConfigurables::new()
    .set_STR_4("FUEL".try_into()?)
    .set_U8(42u8);

let rng = &mut StdRng::seed_from_u64(2322u64);
let salt: [u8; 32] = rng.gen();

let contract_id = Contract::deploy(
    "tests/contracts/configurables/out/debug/configurables.bin",
    &wallet,
    DeployConfiguration::default()
        .set_tx_parameters(tx_parameters)
        .set_storage_configuration(storage_configuration)
        .set_configurables(configurables)
        .set_salt(salt),
)
.await?;

Type path support and resolution of conflicting types

If you have different types with the same name across multiple files, the previous SDK versions might have had difficulty dealing with them. The teams have been working on fixing this once and for all. The solution is that now you can compile your Sway code with a new flag --json-abi-with-callpaths (which will soon be the default); this will generate the JSON ABI with proper paths (my_mod::MyType instead of just MyType) and the SDK will generate the appropriate Rust code in the appropriate module, solving the conflicting types issue.

v0.37.1

23 Feb 16:07
dbbacc3
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.37.0...v0.37.1