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

feat: vector input support #597

Merged
merged 103 commits into from
Oct 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
0c7a2c4
add a e2e test as a guideline what needs to be done for the sdk to
segfault-magnet Aug 29, 2022
a14ea07
implemented dynamic data encoding, proceeding to test
segfault-magnet Aug 30, 2022
e22ec68
add tests for vec support in abi encoder
segfault-magnet Aug 30, 2022
e876187
introduce UnresolvedBytes instead of passing tokens deeper
segfault-magnet Aug 30, 2022
b0525db
decoding vec from receipts
segfault-magnet Aug 30, 2022
03442a5
disown receipts. still need to figure out how to handle nested vectors
segfault-magnet Aug 30, 2022
fc33035
(WIP, checkpoint) generic struct generation
digorithm Aug 30, 2022
201533c
add test helpers for working with generics
segfault-magnet Aug 31, 2022
d0c0672
wip
segfault-magnet Aug 31, 2022
d22008e
generics seem to work with structs
segfault-magnet Aug 31, 2022
25f3189
fixing bugs
segfault-magnet Sep 1, 2022
810deb7
implement TryFrom
segfault-magnet Sep 1, 2022
23fc545
fix tests
segfault-magnet Sep 1, 2022
d8f1fbe
enums seem to work. time for fn signature
segfault-magnet Sep 1, 2022
dbb165a
Merge branch 'master' into rodrigo/generics-support
segfault-magnet Sep 4, 2022
8ac0103
sized strings introduced
segfault-magnet Sep 4, 2022
3a302ae
introduce custom Bits256 newtype
segfault-magnet Sep 4, 2022
1da28b8
array is not a vec anymore
segfault-magnet Sep 4, 2022
6e8822d
structs and enums and generics work
segfault-magnet Sep 6, 2022
87105e3
refactoring
segfault-magnet Sep 6, 2022
cedaa40
refactoring #2
segfault-magnet Sep 6, 2022
285d8d7
refactoring #3
segfault-magnet Sep 6, 2022
19bf89f
refactor #4
segfault-magnet Sep 6, 2022
1cb4a6b
all tests passing
segfault-magnet Sep 6, 2022
f0f09b7
remove unused struct
segfault-magnet Sep 6, 2022
5241fa4
new fn selector builder seems to work
segfault-magnet Sep 8, 2022
dc5e4b9
reenable generrics test, it works!
segfault-magnet Sep 8, 2022
435851c
pushing latest so that halil might start adaptation
segfault-magnet Sep 8, 2022
17f77eb
Merge branch 'master' into new-idea-for-generics
segfault-magnet Sep 8, 2022
b3745c5
wip fn selector, waiting on sway team feedback
segfault-magnet Sep 9, 2022
319e1a1
add generic test in harness
segfault-magnet Sep 12, 2022
2f21494
abi decoder error out if given generic paramtype
segfault-magnet Sep 12, 2022
8061b8a
Merge branch 'master' into new-idea-for-generics
segfault-magnet Sep 12, 2022
4a184e3
add tests for sized ascii string
segfault-magnet Sep 12, 2022
75f6a2a
add tests for code_gen common
segfault-magnet Sep 12, 2022
d08fddb
fix trailing comma missing
segfault-magnet Sep 12, 2022
b3ae082
renaming, about to generate tests for fn selector
segfault-magnet Sep 12, 2022
f6aede8
add unit tests for function selector and slight refactor
segfault-magnet Sep 12, 2022
9e16726
documentation
segfault-magnet Sep 12, 2022
7d7c536
remove unused imports
segfault-magnet Sep 12, 2022
8c1888b
bump forc version
segfault-magnet Sep 12, 2022
8b96f41
docs
segfault-magnet Sep 12, 2022
39a42ce
remove unimplemented
segfault-magnet Sep 12, 2022
7ee2d63
Merge branch 'master' into rodrigo/generics-support
segfault-magnet Sep 13, 2022
1ce7780
Merge branch 'rodrigo/generics-support' into vec_support
segfault-magnet Sep 13, 2022
ee162e8
Merge branch 'master' into rodrigo/generics-support
segfault-magnet Sep 13, 2022
5c79f7a
Merge branch 'rodrigo/generics-support' into vec_support
segfault-magnet Sep 13, 2022
9d9600d
add fn selector vector test
segfault-magnet Sep 13, 2022
322c189
inline local variable
segfault-magnet Sep 13, 2022
6d6601b
Merge branch 'rodrigo/generics-support' into vec_support
segfault-magnet Sep 13, 2022
810b6db
typo
segfault-magnet Sep 14, 2022
9146ec0
Merge branch 'master' into vec_support
segfault-magnet Sep 16, 2022
b7d1cca
wip, need to review prs
segfault-magnet Sep 19, 2022
d02185b
before the great idea
segfault-magnet Sep 19, 2022
41f3af2
runtime fn selector resolving is working
segfault-magnet Sep 19, 2022
a9d67bc
wip, meeting with ahmed m
segfault-magnet Sep 19, 2022
4eac7ab
works after refactoring
segfault-magnet Sep 20, 2022
b96bb87
remove generic as paramtype
segfault-magnet Sep 20, 2022
60dc667
fix tests
segfault-magnet Sep 20, 2022
7761dd7
remove json_abi.rs
segfault-magnet Sep 21, 2022
37911f6
nits
segfault-magnet Sep 21, 2022
fc550bb
Merge branch 'master' into param_type_extraction
segfault-magnet Sep 21, 2022
fea5c80
convert ParamType::Struct & ParamType::Enum into enum-structs
segfault-magnet Sep 22, 2022
52771e9
Update packages/fuels-core/src/code_gen/custom_types/utils.rs
segfault-magnet Sep 22, 2022
68a1830
reorder tokenizable after parameterized
segfault-magnet Sep 22, 2022
01d7c70
renaming
segfault-magnet Sep 22, 2022
7ce0d9d
use revert instead of assert
segfault-magnet Sep 22, 2022
54817d3
Merge branch 'param_type_extraction' into vec_support
segfault-magnet Sep 22, 2022
6adf389
Merge branch 'master' into vec_support
segfault-magnet Sep 22, 2022
e7a0283
tests work
segfault-magnet Sep 22, 2022
7701d3b
revert visibility of functions made public for POC reasons
segfault-magnet Sep 24, 2022
8ffb98b
nested vectors seem to work
segfault-magnet Sep 25, 2022
5247b47
finished e2e tests for accepting and returning vecs
segfault-magnet Sep 25, 2022
51497ec
reverse decoding works
segfault-magnet Sep 27, 2022
db625aa
clippy suggestions
segfault-magnet Sep 27, 2022
8131e56
split up sway code into files
segfault-magnet Sep 27, 2022
2dd881c
Merge branch 'master' into vec_support
segfault-magnet Sep 27, 2022
4063d5c
nits and safety improvement
segfault-magnet Sep 27, 2022
22755f7
nits
segfault-magnet Sep 27, 2022
fad4ef5
cleanup and documentation, sdk book to go before PR
segfault-magnet Sep 27, 2022
31f89bf
add vectors entry in sdk book
segfault-magnet Sep 27, 2022
c1a9dce
Update docs/src/types/vectors.md
segfault-magnet Sep 27, 2022
df365f4
merge suggestion
segfault-magnet Sep 27, 2022
bda0667
bump forc version, remove what is already in sway prelude
segfault-magnet Sep 27, 2022
b301cbc
remove braces in sway
segfault-magnet Sep 27, 2022
d8a5bd4
use unwrap() on sway options
segfault-magnet Sep 27, 2022
922e3ef
remove unused deps
segfault-magnet Sep 27, 2022
12b0397
Merge branch 'master' into vec_support
segfault-magnet Sep 28, 2022
2e0d7bc
Update docs/src/types/vectors.md
segfault-magnet Sep 28, 2022
d0e00a9
Update docs/src/types/vectors.md
segfault-magnet Sep 28, 2022
3888603
use CI tested examples in the SDK book
segfault-magnet Sep 29, 2022
abdad05
rewording of nested vecs instructions
segfault-magnet Sep 29, 2022
7cfd54a
adapt to use boilerplate reducing macro
segfault-magnet Sep 29, 2022
bbf7ea0
Update packages/fuels-core/src/abi_encoder.rs
segfault-magnet Sep 29, 2022
ae1851c
add comments
segfault-magnet Sep 29, 2022
90807ba
Merge branch 'master' into vec_support
segfault-magnet Sep 29, 2022
9276181
Merge branch 'vec_support' into segfault-magnet/vec_support
segfault-magnet Sep 29, 2022
5225152
forbid vectors to be used as fn returns
segfault-magnet Sep 29, 2022
8883493
remove support for returning vectors for the time being
segfault-magnet Sep 29, 2022
6e146f1
nits
segfault-magnet Sep 29, 2022
7a080a5
Merge branch 'master' into vec_support
segfault-magnet Oct 3, 2022
60d12e8
Merge branch 'vec_support' into segfault-magnet/vec_support
segfault-magnet Oct 3, 2022
cfccf94
use `is_native_type` in enum gen as well
segfault-magnet Oct 3, 2022
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ env:
RUSTFLAGS: "-D warnings"
FUEL_CORE_VERSION: 0.10.1
RUST_VERSION: 1.61.0
FORC_VERSION: 0.24.4
FORC_VERSION: 0.24.5

jobs:
setup-test-projects:
Expand Down
3 changes: 2 additions & 1 deletion docs/src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
- [Structs and enums](./types/custom_types.md)
- [String](./types/string.md)
- [Bits256](./types/bits256.md)
- [Vectors](./types/vectors.md)
- [API](./getting-started/api.md)
- [Debugging](./debugging/debugging.md)
- [Debugging abigen errors](./debugging/abigen.md)
Expand All @@ -55,7 +56,7 @@
- [Running scripts](./testing/scripts.md)
- [Tweaking the blockchain](./testing/chains.md)
- [Cookbook](./cookbook/cookbook.md)
- [Custom consesuns parameters](./cookbook/custom-chain.md)
- [Custom consensus parameters](./cookbook/custom-chain.md)
- [Deposit and Withdraw](./cookbook/deposit-and-withdraw.md)
- [Transfer all assets](./cookbook/transfer-all-assets.md)
- [Command Line Interfaces](./cli/index.md)
Expand Down
1 change: 0 additions & 1 deletion docs/src/types/custom_types.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ For instance, your Sway contract could look like this:
```Rust
contract;

use std::assert::assert;
use std::hash::sha256;

struct SimpleGeneric<T> {
Expand Down
15 changes: 15 additions & 0 deletions docs/src/types/vectors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Vectors

## Passing in vectors
segfault-magnet marked this conversation as resolved.
Show resolved Hide resolved

You can pass a Rust `std::vec::Vec` into your contract method transparently. The following code calls a Sway function which accepts and then returns a `Vec<SomeStruct<u32>>`.

```rust,ignore
{{#include ../../../packages/fuels/tests/harness.rs:passing_in_vec}}
```

You can use a vector just like you would use any other type -- e.g. a `[Vec<u32>; 2]` or a `SomeStruct<Vec<Bits256>>` etc.

## Returning vectors

This is currently not supported. If you try returning a type that is or contains a vector you will get a compile time error.
12 changes: 7 additions & 5 deletions packages/fuels-contract/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use fuel_gql_client::{
};

use fuels_core::abi_decoder::ABIDecoder;
use fuels_core::abi_encoder::ABIEncoder;
use fuels_core::abi_encoder::{ABIEncoder, UnresolvedBytes};
use fuels_core::parameters::StorageConfiguration;
use fuels_core::tx::{Bytes32, ContractId};
use fuels_core::{
Expand Down Expand Up @@ -131,18 +131,18 @@ impl Contract {
signature: Selector,
args: &[Token],
) -> Result<ContractCallHandler<D>, Error> {
let encoded_args = ABIEncoder::encode(args).unwrap();
let encoded_selector = signature;

let tx_parameters = TxParameters::default();
let call_parameters = CallParameters::default();

let compute_custom_input_offset = Contract::should_compute_custom_input_offset(args);

let unresolved_bytes = ABIEncoder::encode(args)?;
let contract_call = ContractCall {
contract_id,
encoded_selector,
encoded_args,
encoded_args: unresolved_bytes,
call_parameters,
compute_custom_input_offset,
variable_outputs: None,
Expand Down Expand Up @@ -175,6 +175,7 @@ impl Contract {
| Token::Tuple(_)
| Token::Array(_)
| Token::Byte(_)
| Token::Vector(_)
)
})
}
Expand Down Expand Up @@ -357,7 +358,7 @@ impl Contract {
/// Contains all data relevant to a single contract call
pub struct ContractCall {
pub contract_id: Bech32ContractId,
pub encoded_args: Vec<u8>,
pub encoded_args: UnresolvedBytes,
pub encoded_selector: Selector,
pub call_parameters: CallParameters,
pub compute_custom_input_offset: bool,
Expand All @@ -378,7 +379,7 @@ impl ContractCall {

let (encoded_value, index) = match param_type.get_return_location() {
ReturnLocation::ReturnData => {
match receipts.iter().find(|&receipt| receipt.data().is_some()) {
match receipts.iter().find(|&receipt| matches!(receipt, Receipt::ReturnData { data, .. } if !data.is_empty())) {
Some(r) => {
let index = receipts.iter().position(|elt| elt == r).unwrap();
(r.data().unwrap().to_vec(), Some(index))
Expand Down Expand Up @@ -484,6 +485,7 @@ where
Some(ref mut outputs) => outputs.extend(new_message_outputs),
None => self.contract_call.message_outputs = Some(new_message_outputs),
}

self
}

Expand Down
31 changes: 19 additions & 12 deletions packages/fuels-contract/src/script.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,17 +191,19 @@ impl Script {
// one argument, we need to calculate the `call_data_offset`,
// which points to where the data for the custom types start in the
// transaction. If it doesn't take any custom inputs, this isn't necessary.
if call.compute_custom_input_offset {
let encoded_args_start_offset = if call.compute_custom_input_offset {
// Custom inputs are stored after the previously added parameters,
// including custom_input_offset
let custom_input_offset =
segment_offset + AssetId::LEN + 2 * WORD_SIZE + ContractId::LEN + 2 * WORD_SIZE;
let custom_input_offset = custom_input_offset as Word;

script_data.extend(&custom_input_offset.to_be_bytes());
}
script_data.extend(&(custom_input_offset as Word).to_be_bytes());
custom_input_offset
} else {
segment_offset
};

script_data.extend(call.encoded_args.clone());
let bytes = call.encoded_args.resolve(encoded_args_start_offset as u64);
script_data.extend(bytes);

// the data segment that holds the parameters for the next call
// begins at the original offset + the data we added so far
Expand Down Expand Up @@ -397,7 +399,9 @@ impl Script {
mod test {
use super::*;
use fuel_gql_client::client::schema::coin::CoinStatus;
use fuels_core::abi_encoder::ABIEncoder;
use fuels_core::parameters::CallParameters;
use fuels_core::Token;
use fuels_types::bech32::Bech32ContractId;
use fuels_types::param_types::ParamType;
use rand::Rng;
Expand All @@ -423,8 +427,11 @@ mod test {

let selectors = vec![[7u8; 8], [8u8; 8], [9u8; 8]];

// Call 2 has a multiple inputs, compute_custom_input_offset will be true
let args = vec![[10u8; 8].to_vec(), [11u8; 16].to_vec(), [12u8; 8].to_vec()];
// Call 2 has multiple inputs, compute_custom_input_offset will be true

let args = [Token::U8(1), Token::U16(2), Token::U8(3)]
.map(|token| ABIEncoder::encode(&[token]).unwrap())
.to_vec();

let calls: Vec<ContractCall> = (0..NUM_CALLS)
.map(|i| ContractCall {
Expand Down Expand Up @@ -477,11 +484,11 @@ mod test {
// Calls 1 and 3 have their input arguments after the selector
let call_1_arg_offset = param_offsets[0].call_data_offset + ContractId::LEN + SELECTOR_LEN;
let call_1_arg = script_data[call_1_arg_offset..call_1_arg_offset + WORD_SIZE].to_vec();
assert_eq!(call_1_arg, args[0].to_vec());
assert_eq!(call_1_arg, args[0].resolve(0));

let call_3_arg_offset = param_offsets[2].call_data_offset + ContractId::LEN + SELECTOR_LEN;
let call_3_arg = script_data[call_3_arg_offset..call_3_arg_offset + WORD_SIZE].to_vec();
assert_eq!(call_3_arg, args[2]);
assert_eq!(call_3_arg, args[2].resolve(0));

// Call 2 has custom inputs and custom_input_offset
let call_2_arg_offset = param_offsets[1].call_data_offset + ContractId::LEN + SELECTOR_LEN;
Expand All @@ -495,8 +502,8 @@ mod test {
let custom_input_offset =
param_offsets[1].call_data_offset + ContractId::LEN + SELECTOR_LEN + WORD_SIZE;
let custom_input =
script_data[custom_input_offset..custom_input_offset + 2 * WORD_SIZE].to_vec();
assert_eq!(custom_input, args[1]);
script_data[custom_input_offset..custom_input_offset + WORD_SIZE].to_vec();
assert_eq!(custom_input, args[1].resolve(0));
}

#[test]
Expand Down
Loading