@@ -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} ;
2121use 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+ }
0 commit comments