Skip to content

Releases: FuelLabs/fuels-rs

v0.48.0

11 Sep 20:51
1113751
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.47.0...v0.48.0

Breaking changes and new features

Predicate gas estimation fix

Recently, we've had an issue with estimating gas in predicates. This release fixes it but introduces some small API changes: calculate_base_amount_with_fee() now returns an Option<64>. We also went from fn fee_checked_from_tx(&self, params: &ConsensusParameters) -> Option<TransactionFee>; to fn fee_checked_from_tx(&self, params: &ConsensusParameters) -> Result<Option<TransactionFee>>;

Storage slots autoload

Automatic Loading of Storage Slots: Storage slots are now autoloaded by default to simplify and optimize the integration process. Should you wish to opt-out, an option is readily available.

When the StorageConfiguration indicates that autoload should be enabled, Contract::load_from will attempt to find the storage slots file within the same directory as the contract binary. This ensures a seamless experience without needing additional configuration in typical setups.

Enhancements related to this feature:

Guided Error Handling: The SDK will generate an error if the storage slots file is missing. In this scenario, you will be given guidance to source the required file or deactivate the autoload feature to help the user.

Priority Configuration: Users can still manually configure storage slots in StorageConfiguration. This manual configuration will precede the default settings autoloaded from the storage slots file.

Bug Fix: Rectified an error exposed by the autoload feature. Previously, the system did not properly account for storage slots during the computation of the heap data offset for predicates. This has now been addressed.

Breaking Changes:

Updated Storage Configuration Interface: As you know, modifications have been made to the storage configuration interface. Please review the documentation to understand these changes and adjust your setups accordingly.

Behavioural Adjustments with Autoloading: Since storage slots are now autoloaded by default, some users may notice differences in system behaviour. Assessing this feature in your context is important to ensure it aligns with your project's requirements.

This is how the usage around storage slots look like:

#[tokio::test]
async fn storage_slots_override() -> Result<()> {
    {
        // ANCHOR: storage_slots_override
        use fuels::{programs::contract::Contract, tx::StorageSlot};
        let slot_override = StorageSlot::new([1; 32].into(), [2; 32].into());
        let storage_config =
            StorageConfiguration::default().add_slot_overrides([slot_override]);

        let load_config =
            LoadConfiguration::default().with_storage_configuration(storage_config);
        let _: Result<Contract> = Contract::load_from("...", load_config);
        // ANCHOR_END: storage_slots_override
    }

    {
        // ANCHOR: storage_slots_disable_autoload
        use fuels::programs::contract::Contract;
        let storage_config = StorageConfiguration::default().with_autoload(false);

        let load_config =
            LoadConfiguration::default().with_storage_configuration(storage_config);
        let _: Result<Contract> = Contract::load_from("...", load_config);
        // ANCHOR_END: storage_slots_disable_autoload
    }

    Ok(())
}

v0.47.0

30 Aug 14:57
bd3345e
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.46.0...v0.47.0

Breaking changes

*_set methods renamed to *_with

Some *_set methods were renamed to *_with to reflect better the ownership model they follow.

For instance, this:

let configuration = LoadConfiguration::default()
    .set_storage_configuration(storage_configuration)
    .set_salt(salt);

// Optional: Configure deployment parameters
let tx_parameters = TxParameters::default()
    .set_gas_price(0)
    .set_gas_limit(1_000_000)
    .set_maturity(0);

Becomes:

let configuration = LoadConfiguration::default()
    .with_storage_configuration(storage_configuration)
    .with_salt(salt);

// Optional: Configure deployment parameters
let tx_parameters = TxParameters::default()
    .with_gas_price(0)
    .with_gas_limit(1_000_000)
    .with_maturity(0);

As well as

  1. set_contract_ids -> with_contract_ids
  2. set_gas_forwarded -> with_gas_forwarded
  3. CallParameters::default().set_amount(deposit_amount).set_asset_id(base_asset_id); -> CallParameters::default().with_amount(deposit_amount).with_asset_id(base_asset_id);
  4. set_consensus_parameters(consensus_parameters); -> with_consensus_parameters(consensus_parameters);

So, when migrating to this version, some things will break, and to fix it is easy: rename these methods with set in them to with, and it should work seamlessly.

String types

Sway's String type is equivalent to the Rust String. This change was impossible before because the String name was already taken for statically-sized strings, now called StringArrays.

This only affects you if you use ParamTypes directly: ParamType::String(len) is now ParamType::StringArray(len) and ParamType::StdString is now ParamType::String.

Sending transactions doesn't return receipts anymore, only the transaction ID

send_transaction(&tx) used to wait for the transaction to be completed and then it would return the receipts. That's not the case anymore; Now, it returns the transactions ID and then you use this ID to query for the receipts:

let receipts = self.try_provider()?.send_transaction(&tx).await?;

Becomes

let tx_id = self.try_provider()?.send_transaction(&tx).await?;
let receipts = provider.get_receipts(&tx_id).await?;

This allows more flexibility to send transactions asynchronously and then grab the receipts if needed.

v0.46.0

15 Aug 19:39
d71c88f
Compare
Choose a tag to compare

What's Changed

  • chore: make get_contract_balances return AssetId and add provider.chain_id() by @MujkicA in #1075
  • chore: bump rust and deps versions by @hal3e in #1084
  • chore: derive Default for SizedAsciiString by @ra0x3 in #1086
  • Bump versions to 0.46.0 by @digorithm in #1087

Full Changelog: v0.45.1...v0.46.0

v0.45.1

14 Aug 14:54
ad6586f
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.45.0...v0.45.1

v0.45.0

09 Aug 21:09
0057ef0
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.44.0...v0.45.0

New features

Support for Sway's dynamic string and string slices type;

Usage example:

let contract_methods = contract_instance.methods();
{
    let resp = contract_methods.return_dynamic_string().call().await?.value;
    assert_eq!(resp, "Hello World");
}
{
    let _resp = contract_methods
        .accepts_dynamic_string(String::from("Hello World"))
        .call()
        .await?;
}

See the documentation for more details.

Automatic macro recompile

This means abigen! and setup_program_test! macros can now detect file changes.

Improve log decoder error

The log decoder error object now has a data field.

Support for fuel-core 0.20

This means support for the upcoming beta-4 release of the network.

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.