Skip to content

Commit 0278079

Browse files
authored
chore(deps): bump fuel-core and fuel-vm deps, add owner TxPolicy (#1697)
has tests for - 1. multiple inputs, different owners, owner policy set, returned 2. multiple inputs, same owner, owner policy unset, returned 3. multiple inputs, different owners, owner policy unset, panics
1 parent 7f397ef commit 0278079

File tree

13 files changed

+273
-37
lines changed

13 files changed

+273
-37
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ env:
1616
CARGO_TERM_COLOR: always
1717
DASEL_VERSION: https://github.com/TomWright/dasel/releases/download/v2.3.6/dasel_linux_amd64
1818
RUSTFLAGS: "-D warnings"
19-
FUEL_CORE_VERSION: 0.46.0
19+
FUEL_CORE_VERSION: 0.47.1
2020
FUEL_CORE_PATCH_BRANCH: ""
2121
FUEL_CORE_PATCH_REVISION: ""
2222
RUST_VERSION: 1.90.0

Cargo.toml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,23 @@ testcontainers = { version = "0.23", default-features = false }
9494
k256 = { version = "0.13", default-features = false }
9595

9696
# Dependencies from the `fuel-core` repository:
97-
fuel-core = { version = "0.46.0", default-features = false, features = [
97+
fuel-core = { version = "0.47.1", default-features = false, features = [
9898
"wasm-executor",
9999
] }
100-
fuel-core-chain-config = { version = "0.46.0", default-features = false }
101-
fuel-core-client = { version = "0.46.0", default-features = false }
102-
fuel-core-poa = { version = "0.46.0", default-features = false }
103-
fuel-core-services = { version = "0.46.0", default-features = false }
104-
fuel-core-types = { version = "0.46.0", default-features = false }
100+
fuel-core-chain-config = { version = "0.47.1", default-features = false }
101+
fuel-core-client = { version = "0.47.1", default-features = false }
102+
fuel-core-poa = { version = "0.47.1", default-features = false }
103+
fuel-core-services = { version = "0.47.1", default-features = false }
104+
fuel-core-types = { version = "0.47.1", default-features = false }
105105

106106
# Dependencies from the `fuel-vm` repository:
107-
fuel-asm = { version = "0.62.0" }
108-
fuel-crypto = { version = "0.62.0" }
109-
fuel-merkle = { version = "0.62.0" }
110-
fuel-storage = { version = "0.62.0" }
111-
fuel-tx = { version = "0.62.0" }
112-
fuel-types = { version = "0.62.0" }
113-
fuel-vm = { version = "0.62.0" }
107+
fuel-asm = { version = "0.65.0" }
108+
fuel-crypto = { version = "0.65.0" }
109+
fuel-merkle = { version = "0.65.0" }
110+
fuel-storage = { version = "0.65.0" }
111+
fuel-tx = { version = "0.65.0" }
112+
fuel-types = { version = "0.65.0" }
113+
fuel-vm = { version = "0.65.0" }
114114

115115
# Workspace projects
116116
fuels = { version = "0.75.1", path = "./packages/fuels", default-features = false }

e2e/tests/providers.rs

Lines changed: 206 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use fuels::{
1515
coin_type::CoinType,
1616
message::Message,
1717
transaction_builders::{BuildableTransaction, ScriptTransactionBuilder},
18-
tx_status::{Success, TxStatus},
18+
tx_status::{Failure, Success, TxStatus},
1919
},
2020
};
2121
use futures::StreamExt;
@@ -955,7 +955,7 @@ async fn can_fetch_mint_transactions() -> Result<()> {
955955
let transactions = provider
956956
.get_transactions(PaginationRequest {
957957
cursor: None,
958-
results: 100,
958+
results: 20,
959959
direction: PageDirection::Forward,
960960
})
961961
.await?
@@ -1203,13 +1203,15 @@ async fn tx_respects_policies() -> Result<()> {
12031203
let expiration = 128;
12041204
let max_fee = 10_000;
12051205
let script_gas_limit = 3000;
1206+
let owner_index = 1;
12061207
let tx_policies = TxPolicies::new(
12071208
Some(tip),
12081209
Some(witness_limit),
12091210
Some(maturity),
12101211
Some(expiration),
12111212
Some(max_fee),
12121213
Some(script_gas_limit),
1214+
Some(owner_index),
12131215
);
12141216

12151217
// advance the block height to ensure the maturity is respected
@@ -1240,6 +1242,7 @@ async fn tx_respects_policies() -> Result<()> {
12401242
assert_eq!(script.witness_limit().unwrap(), witness_limit);
12411243
assert_eq!(script.max_fee().unwrap(), max_fee);
12421244
assert_eq!(script.gas_limit(), script_gas_limit);
1245+
assert_eq!(script.owner().unwrap(), owner_index);
12431246

12441247
Ok(())
12451248
}
@@ -1324,9 +1327,10 @@ async fn tx_with_witness_data() -> Result<()> {
13241327
match status {
13251328
TxStatus::Success(Success { receipts, .. }) => {
13261329
let ret: u64 = receipts
1327-
.into_iter()
1330+
.as_ref()
1331+
.iter()
13281332
.find_map(|receipt| match receipt {
1329-
Receipt::Return { val, .. } => Some(val),
1333+
Receipt::Return { val, .. } => Some(*val),
13301334
_ => None,
13311335
})
13321336
.expect("should have return value");
@@ -1448,3 +1452,201 @@ async fn is_account_query_test() -> Result<()> {
14481452

14491453
Ok(())
14501454
}
1455+
1456+
#[tokio::test]
1457+
async fn script_tx_get_owner_returns_owner_when_policy_set_multiple_inputs() -> Result<()> {
1458+
use fuel_asm::{GMArgs, op};
1459+
1460+
let amount = 1000;
1461+
let num_coins = 50;
1462+
let mut wallets = launch_custom_provider_and_get_wallets(
1463+
WalletsConfig::new(Some(3), Some(num_coins), Some(amount)),
1464+
Some(NodeConfig::default()),
1465+
None,
1466+
)
1467+
.await?;
1468+
let wallet_1 = wallets.pop().unwrap();
1469+
let wallet_2 = wallets.pop().unwrap();
1470+
let wallet_3 = wallets.pop().unwrap();
1471+
let provider = wallet_1.provider().clone();
1472+
1473+
let consensus_parameters = provider.consensus_parameters().await?;
1474+
let inputs_1 = wallet_1
1475+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1476+
.await?;
1477+
let inputs_2 = wallet_2
1478+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1479+
.await?;
1480+
let inputs_3 = wallet_3
1481+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1482+
.await?;
1483+
1484+
let mut inputs = vec![];
1485+
inputs.extend(inputs_1);
1486+
inputs.extend(inputs_2);
1487+
inputs.extend(inputs_3);
1488+
1489+
let tx_policies = TxPolicies::default().with_owner(1);
1490+
let mut tb =
1491+
ScriptTransactionBuilder::prepare_transfer(inputs, vec![], tx_policies).enable_burn(true);
1492+
wallet_1.add_witnesses(&mut tb)?;
1493+
wallet_2.add_witnesses(&mut tb)?;
1494+
wallet_3.add_witnesses(&mut tb)?;
1495+
1496+
let script = vec![
1497+
op::gm_args(0x20, GMArgs::GetOwner),
1498+
op::movi(0x21, 32),
1499+
op::retd(0x20, 0x21),
1500+
]
1501+
.into_iter()
1502+
.collect();
1503+
1504+
tb.script = script;
1505+
1506+
let expected_data = wallet_1.address();
1507+
1508+
let tx = tb.build(&provider).await?;
1509+
1510+
let status = provider.send_transaction_and_await_commit(tx).await?;
1511+
1512+
match status {
1513+
TxStatus::Success(Success { receipts, .. }) => {
1514+
let ret = receipts
1515+
.as_ref()
1516+
.iter()
1517+
.find_map(|receipt| match receipt {
1518+
Receipt::ReturnData { data, .. } if data.is_some() => {
1519+
Some(data.clone().unwrap())
1520+
}
1521+
_ => None,
1522+
})
1523+
.expect("should have return value");
1524+
1525+
assert_eq!(ret, expected_data.as_ref().to_vec().into());
1526+
}
1527+
_ => panic!("expected success status"),
1528+
}
1529+
1530+
Ok(())
1531+
}
1532+
1533+
#[tokio::test]
1534+
async fn script_tx_get_owner_panics_when_policy_unset_multiple_inputs() -> Result<()> {
1535+
use fuel_asm::{GMArgs, op};
1536+
1537+
let amount = 1000;
1538+
let num_coins = 50;
1539+
let mut wallets = launch_custom_provider_and_get_wallets(
1540+
WalletsConfig::new(Some(3), Some(num_coins), Some(amount)),
1541+
Some(NodeConfig::default()),
1542+
None,
1543+
)
1544+
.await?;
1545+
let wallet_1 = wallets.pop().unwrap();
1546+
let wallet_2 = wallets.pop().unwrap();
1547+
let wallet_3 = wallets.pop().unwrap();
1548+
let provider = wallet_1.provider().clone();
1549+
1550+
let consensus_parameters = provider.consensus_parameters().await?;
1551+
let inputs_1 = wallet_1
1552+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1553+
.await?;
1554+
let inputs_2 = wallet_2
1555+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1556+
.await?;
1557+
let inputs_3 = wallet_3
1558+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1559+
.await?;
1560+
1561+
let mut inputs = vec![];
1562+
inputs.extend(inputs_1);
1563+
inputs.extend(inputs_2);
1564+
inputs.extend(inputs_3);
1565+
1566+
let mut tb = ScriptTransactionBuilder::prepare_transfer(inputs, vec![], TxPolicies::default())
1567+
.enable_burn(true);
1568+
wallet_1.add_witnesses(&mut tb)?;
1569+
wallet_2.add_witnesses(&mut tb)?;
1570+
wallet_3.add_witnesses(&mut tb)?;
1571+
1572+
let script = vec![
1573+
op::gm_args(0x20, GMArgs::GetOwner),
1574+
op::movi(0x21, 32),
1575+
op::retd(0x20, 0x21),
1576+
]
1577+
.into_iter()
1578+
.collect();
1579+
1580+
tb.script = script;
1581+
1582+
let tx = tb.build(&provider).await?;
1583+
1584+
let status = provider.send_transaction_and_await_commit(tx).await?;
1585+
1586+
match status {
1587+
TxStatus::Failure(Failure { .. }) => {}
1588+
_ => panic!("expected failure status"),
1589+
}
1590+
1591+
Ok(())
1592+
}
1593+
1594+
#[tokio::test]
1595+
async fn script_tx_get_owner_returns_owner_when_policy_unset_all_inputs_same_owner() -> Result<()> {
1596+
use fuel_asm::{GMArgs, op};
1597+
1598+
let wallet = launch_provider_and_get_wallet().await?;
1599+
let provider = wallet.provider();
1600+
1601+
let receiver = Wallet::random(&mut thread_rng(), provider.clone());
1602+
1603+
let consensus_parameters = provider.consensus_parameters().await?;
1604+
let inputs = wallet
1605+
.get_asset_inputs_for_amount(*consensus_parameters.base_asset_id(), 10000, None)
1606+
.await?;
1607+
let outputs = wallet.get_asset_outputs_for_amount(
1608+
receiver.address(),
1609+
*consensus_parameters.base_asset_id(),
1610+
1,
1611+
);
1612+
1613+
let tx_policies = TxPolicies::default();
1614+
let mut tb = ScriptTransactionBuilder::prepare_transfer(inputs, outputs, tx_policies);
1615+
wallet.add_witnesses(&mut tb)?;
1616+
1617+
let script = vec![
1618+
op::gm_args(0x20, GMArgs::GetOwner),
1619+
op::movi(0x21, 32),
1620+
op::retd(0x20, 0x21),
1621+
]
1622+
.into_iter()
1623+
.collect();
1624+
1625+
tb.script = script;
1626+
1627+
let expected_data = wallet.address();
1628+
1629+
let tx = tb.build(provider).await?;
1630+
1631+
let status = provider.send_transaction_and_await_commit(tx).await?;
1632+
1633+
match status {
1634+
TxStatus::Success(Success { receipts, .. }) => {
1635+
let ret = receipts
1636+
.as_ref()
1637+
.iter()
1638+
.find_map(|receipt| match receipt {
1639+
Receipt::ReturnData { data, .. } if data.is_some() => {
1640+
Some(data.clone().unwrap())
1641+
}
1642+
_ => None,
1643+
})
1644+
.expect("should have return value");
1645+
1646+
assert_eq!(ret, expected_data.as_ref().to_vec().into());
1647+
}
1648+
_ => panic!("expected success status"),
1649+
}
1650+
1651+
Ok(())
1652+
}

e2e/tests/scripts.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ async fn high_level_blob_upload_sets_max_fee_tolerance() -> Result<()> {
530530
let max_fee_of_sent_blob_tx = provider
531531
.get_transactions(PaginationRequest {
532532
cursor: None,
533-
results: 100,
533+
results: 20,
534534
direction: PageDirection::Forward,
535535
})
536536
.await?
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pub const SUPPORTED_FUEL_CORE_VERSION: semver::Version = semver::Version::new(0, 46, 0);
1+
pub const SUPPORTED_FUEL_CORE_VERSION: semver::Version = semver::Version::new(0, 47, 1);

packages/fuels-core/src/codec/logs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ impl<'a, I: Iterator<Item = &'a Receipt>> ExtractLogIdData for I {
280280
data: Some(data),
281281
id,
282282
..
283-
} => Some((LogId(*id, (*rb).to_string()), data.clone())),
283+
} => Some((LogId(*id, (*rb).to_string()), data.to_vec())),
284284
Receipt::Log { ra, rb, id, .. } => {
285285
Some((LogId(*id, (*rb).to_string()), ra.to_be_bytes().to_vec()))
286286
}

packages/fuels-core/src/types/errors.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
pub mod transaction {
2+
#[cfg(feature = "std")]
3+
use std::sync::Arc;
4+
5+
#[cfg(not(feature = "std"))]
6+
use alloc::sync::Arc;
7+
28
#[derive(thiserror::Error, Debug, Clone)]
39
pub enum Reason {
410
#[error("builder: {0}")]
@@ -11,7 +17,7 @@ pub mod transaction {
1117
Failure {
1218
reason: String,
1319
revert_id: Option<u64>,
14-
receipts: Vec<fuel_tx::Receipt>,
20+
receipts: Arc<Vec<fuel_tx::Receipt>>,
1521
},
1622
#[error(": {0}")]
1723
Other(String),

packages/fuels-core/src/types/transaction_builders.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ macro_rules! impl_tx_builder_trait {
355355
policies.set(PolicyType::Maturity, self.tx_policies.maturity());
356356
policies.set(PolicyType::Tip, self.tx_policies.tip());
357357
policies.set(PolicyType::Expiration, self.tx_policies.expiration());
358+
policies.set(PolicyType::Owner, self.tx_policies.owner());
358359

359360
Ok(policies)
360361
}

0 commit comments

Comments
 (0)