Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unified Create and Script logic via ChargeableTransaction #706

Merged
merged 26 commits into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cb9d324
Versioned `GasCosts`
xgreenx Mar 21, 2024
2feab92
Versioned `ConsensusParameters`ю
xgreenx Mar 21, 2024
57c7730
Updated CHANGELOG.md
xgreenx Mar 21, 2024
41a537c
Versioned `FeeParameters`
xgreenx Mar 21, 2024
83721d9
Versioned `PredicateParameters`, `ScriptParameters`, `ContractParamet…
xgreenx Mar 21, 2024
ed2e94b
Versioned `TxParameters`
xgreenx Mar 21, 2024
34aa7dc
Updated CHANGELOG.md
xgreenx Mar 21, 2024
0ca4ddf
Make CI happy
xgreenx Mar 21, 2024
38e515d
Merge branch 'master' into feature/versioning-sub-parameters
xgreenx Mar 21, 2024
5c5b009
Reshuffled fields `Script` and `Create` transactions to unify part us…
xgreenx Mar 22, 2024
5eae221
Updated CHANGELOG.md
xgreenx Mar 22, 2024
bd12db3
Merge branch 'master' into feature/versioning-sub-parameters
xgreenx Mar 22, 2024
a3618cc
Merge branch 'feature/versioning-sub-parameters' into feature/common-…
xgreenx Mar 22, 2024
b57047a
Unified `Create` and `Script` logic via `ChargeableTransaction`
xgreenx Mar 24, 2024
3ebe1d8
Updated CHANGELOG.md
xgreenx Mar 24, 2024
27d18ac
Merge branch 'master' into feature/versioning-sub-parameters
xgreenx Mar 25, 2024
2f2cfdc
Merge branch 'feature/versioning-sub-parameters' into feature/common-…
xgreenx Mar 25, 2024
13592ac
Merge branch 'feature/common-payable-part' into feature/chargeable-tr…
xgreenx Mar 25, 2024
e374ea3
Merge branch 'master' into feature/versioning-sub-parameters
xgreenx Mar 25, 2024
c4cbc5f
Merge branch 'feature/versioning-sub-parameters' into feature/common-…
xgreenx Mar 25, 2024
6db8b16
Merge branch 'feature/common-payable-part' into feature/chargeable-tr…
xgreenx Mar 25, 2024
f9f2f39
Merge branch 'master' into feature/common-payable-part
xgreenx Mar 25, 2024
0fbcb44
Merge branch 'master' into feature/common-payable-part
xgreenx Mar 25, 2024
50502cf
Merge branch 'feature/common-payable-part' into feature/chargeable-tr…
xgreenx Mar 26, 2024
4496d2b
Update fuel-tx/src/transaction/id.rs
xgreenx Mar 26, 2024
f975aab
Merge branch 'master' into feature/chargeable-transaction
xgreenx Mar 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

#### Breaking

- [#706](https://github.com/FuelLabs/fuel-vm/pull/706): Unified `Create` and `Script` logic via `ChargeableTransaction`. The change is breaking because affects JSON serialization and deserialization. Now `Script` and `Create` transactions have `body` fields that include unique transactions.
- [#703](https://github.com/FuelLabs/fuel-vm/pull/703): Reshuffled fields `Script` and `Create` transactions to unify part used by all chargeable transactions. It breaks the serialization and deserialization and requires adoption on the SDK side.
- [#708](https://github.com/FuelLabs/fuel-vm/pull/708): Hidden `Default` params under the "test-helper" feature to avoid accidental use in production code. It is a huge breaking change for any code that has used them before in production, and instead, it should be fetched from the network. In the case of tests simply use the "test-helper" feature in your `[dev-dependencies]` section.
- [#702](https://github.com/FuelLabs/fuel-vm/pull/702): Wrapped `FeeParameters`, `PredicateParameters`, `TxParameters`, `ScriptParameters` and `ContractParameters` into an enum to support versioning.
Expand Down
10 changes: 10 additions & 0 deletions fuel-derive/src/deserialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ fn deserialize_struct(s: &mut synstructure::Structure) -> TokenStream2 {
quote! {}
};

let mut s = s.clone();

let variant: &mut synstructure::VariantInfo = &mut s.variants_mut()[0];
variant.filter(|binding| !should_skip_field_binding(binding));

s.gen_impl(quote! {
gen impl ::fuel_types::canonical::Deserialize for @Self {
fn decode_static<I: ::fuel_types::canonical::Input + ?Sized>(buffer: &mut I) -> ::core::result::Result<Self, ::fuel_types::canonical::Error> {
Expand Down Expand Up @@ -138,6 +143,11 @@ fn deserialize_enum(s: &synstructure::Structure) -> TokenStream2 {
}
};

let mut s = s.clone();
s.variants_mut().iter_mut().for_each(|v| {
v.filter(|binding| !should_skip_field_binding(binding));
});

s.gen_impl(quote! {
gen impl ::fuel_types::canonical::Deserialize for @Self {
fn decode_static<I: ::fuel_types::canonical::Input + ?Sized>(buffer: &mut I) -> ::core::result::Result<Self, ::fuel_types::canonical::Error> {
Expand Down
76 changes: 27 additions & 49 deletions fuel-derive/src/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,28 @@ use crate::attribute::{

fn serialize_struct(s: &synstructure::Structure) -> TokenStream2 {
let attrs = StructAttrs::parse(s);
let mut s = s.clone();

assert_eq!(s.variants().len(), 1, "structs must have one variant");

let variant: &synstructure::VariantInfo = &s.variants()[0];
let variant: &mut synstructure::VariantInfo = &mut s.variants_mut()[0];
variant.filter(|binding| !should_skip_field_binding(binding));

let encode_static = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
});

let encode_dynamic = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
});

let size_static_code = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
});

Expand All @@ -50,12 +41,8 @@ fn serialize_struct(s: &synstructure::Structure) -> TokenStream2 {
let size_static_code = quote! { #initial_size match self { #size_static_code}; size };

let size_dynamic_code = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
});
let size_dynamic_code =
Expand Down Expand Up @@ -104,16 +91,19 @@ fn serialize_struct(s: &synstructure::Structure) -> TokenStream2 {

fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
assert!(!s.variants().is_empty(), "got invalid empty enum");
let mut s = s.clone();
let mut next_discriminant = quote! { { 0u64 } };

s.variants_mut().iter_mut().for_each(|v| {
v.filter(|binding| !should_skip_field_binding(binding));
});

let encode_static = s.variants().iter().map(|v| {
let pat = v.pat();

let encode_static_iter = v.bindings().iter().map(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
});

Expand All @@ -138,12 +128,8 @@ fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
});
let encode_dynamic = s.variants().iter().map(|v| {
let encode_dynamic_iter = v.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
});
quote! {
Expand All @@ -156,12 +142,8 @@ fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
.iter()
.map(|variant| {
variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
})
})
Expand All @@ -177,12 +159,8 @@ fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
.iter()
.map(|variant| {
variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
})
})
Expand Down
24 changes: 16 additions & 8 deletions fuel-tx/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ use crate::{
WitnessLimit,
},
policies::Policies,
transaction::{
CreateBody,
ScriptBody,
},
};
use alloc::{
collections::BTreeMap,
Expand Down Expand Up @@ -116,14 +120,16 @@ pub struct TransactionBuilder<Tx> {
impl TransactionBuilder<Script> {
pub fn script(script: Vec<u8>, script_data: Vec<u8>) -> Self {
let tx = Script {
script_gas_limit: Default::default(),
script,
script_data,
body: ScriptBody {
script_gas_limit: Default::default(),
receipts_root: Default::default(),
script,
script_data,
},
policies: Policies::new().with_max_fee(0),
inputs: Default::default(),
outputs: Default::default(),
witnesses: Default::default(),
receipts_root: Default::default(),
metadata: None,
};
Self::with_tx(tx)
Expand All @@ -139,10 +145,12 @@ impl TransactionBuilder<Create> {
// sort the storage slots before initializing the builder
storage_slots.sort();
let mut tx = Create {
bytecode_length: Default::default(),
bytecode_witness_index: Default::default(),
salt,
storage_slots,
body: CreateBody {
bytecode_length: Default::default(),
bytecode_witness_index: Default::default(),
salt,
storage_slots,
},
policies: Policies::new().with_max_fee(0),
inputs: Default::default(),
outputs: Default::default(),
Expand Down
1 change: 1 addition & 0 deletions fuel-tx/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ pub use transaction::{
};

pub use transaction::{
PrepareSign,
Signable,
UniqueIdentifier,
};
Expand Down
Loading
Loading