diff --git a/runtime/common/src/precompile/dex.rs b/runtime/common/src/precompile/dex.rs
index 4f827853c..be341e88b 100644
--- a/runtime/common/src/precompile/dex.rs
+++ b/runtime/common/src/precompile/dex.rs
@@ -103,7 +103,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128_tuple(balance_a, balance_b),
+ output: Output::encode_uint_tuple(vec![balance_a, balance_b]),
logs: Default::default(),
})
}
@@ -123,7 +123,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_address(&address),
+ output: Output::encode_address(address),
logs: Default::default(),
})
}
@@ -149,7 +149,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(target),
+ output: Output::encode_uint(target),
logs: Default::default(),
})
}
@@ -175,7 +175,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(supply),
+ output: Output::encode_uint(supply),
logs: Default::default(),
})
}
@@ -207,7 +207,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(value),
+ output: Output::encode_uint(value),
logs: Default::default(),
})
}
@@ -239,7 +239,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(value),
+ output: Output::encode_uint(value),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/evm.rs b/runtime/common/src/precompile/evm.rs
index 3b300c100..d849ff802 100644
--- a/runtime/common/src/precompile/evm.rs
+++ b/runtime/common/src/precompile/evm.rs
@@ -91,7 +91,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u32(output),
+ output: Output::encode_uint(output),
logs: Default::default(),
})
}
@@ -100,7 +100,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(deposit),
+ output: Output::encode_uint(deposit),
logs: Default::default(),
})
}
@@ -118,7 +118,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_address(&maintainer),
+ output: Output::encode_address(maintainer),
logs: Default::default(),
})
}
@@ -127,7 +127,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(deposit),
+ output: Output::encode_uint(deposit),
logs: Default::default(),
})
}
@@ -136,7 +136,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(fee),
+ output: Output::encode_uint(fee),
logs: Default::default(),
})
}
@@ -227,7 +227,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_bool(developer_status),
+ output: Output::encode_bool(developer_status),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/evm_accounts.rs b/runtime/common/src/precompile/evm_accounts.rs
index 0f893764e..b35c3940d 100644
--- a/runtime/common/src/precompile/evm_accounts.rs
+++ b/runtime/common/src/precompile/evm_accounts.rs
@@ -83,7 +83,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_fixed_bytes(output.into().as_ref()),
+ output: Output::encode_fixed_bytes(output.into().as_ref()),
logs: Default::default(),
})
}
@@ -101,7 +101,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_address(&address),
+ output: Output::encode_address(address),
logs: Default::default(),
})
}
@@ -125,7 +125,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_address(&address),
+ output: Output::encode_address(address),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/homa.rs b/runtime/common/src/precompile/homa.rs
index 996eae664..89803fd2b 100644
--- a/runtime/common/src/precompile/homa.rs
+++ b/runtime/common/src/precompile/homa.rs
@@ -145,7 +145,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(rate.into_inner()),
+ output: Output::encode_uint(rate.into_inner()),
logs: Default::default(),
})
}
@@ -154,7 +154,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(rate.into_inner()),
+ output: Output::encode_uint(rate.into_inner()),
logs: Default::default(),
})
}
@@ -164,7 +164,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(rate.into_inner()),
+ output: Output::encode_uint(rate.into_inner()),
logs: Default::default(),
})
}
@@ -174,7 +174,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(rate.into_inner()),
+ output: Output::encode_uint(rate.into_inner()),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/honzon.rs b/runtime/common/src/precompile/honzon.rs
index 3ca6064b3..896ff9cf4 100644
--- a/runtime/common/src/precompile/honzon.rs
+++ b/runtime/common/src/precompile/honzon.rs
@@ -160,7 +160,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128_tuple(collateral, debit),
+ output: Output::encode_uint_tuple(vec![collateral, debit]),
logs: Default::default(),
})
}
@@ -177,7 +177,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(ratio.into_inner()),
+ output: Output::encode_uint(ratio.into_inner()),
logs: Default::default(),
})
}
@@ -195,7 +195,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(ratio.into_inner()),
+ output: Output::encode_uint(ratio.into_inner()),
logs: Default::default(),
})
}
@@ -211,7 +211,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(exchange_rate.into_inner()),
+ output: Output::encode_uint(exchange_rate.into_inner()),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/input.rs b/runtime/common/src/precompile/input.rs
index 916c89480..64666d238 100644
--- a/runtime/common/src/precompile/input.rs
+++ b/runtime/common/src/precompile/input.rs
@@ -17,7 +17,7 @@
// along with this program. If not, see .
use frame_support::ensure;
-use sp_std::{marker::PhantomData, result::Result, vec, vec::Vec};
+use sp_std::{marker::PhantomData, result::Result, vec::Vec};
use crate::WeightToGas;
use ethabi::Token;
@@ -201,68 +201,68 @@ where
}
fn bool_at(&self, index: usize) -> Result {
+ const ONE: U256 = U256([1u64, 0, 0, 0]);
let param = self.u256_at(index)?;
- Ok(!param.is_zero())
+ if param == ONE {
+ Ok(true)
+ } else if param.is_zero() {
+ Ok(false)
+ } else {
+ Err(PrecompileFailure::Revert {
+ exit_status: ExitRevert::Reverted,
+ output: "failed to decode bool".into(),
+ cost: self.target_gas.unwrap_or_default(),
+ })
+ }
}
}
-#[derive(Default, Clone, PartialEq, Debug)]
pub struct Output;
impl Output {
- pub fn encode_bool(&self, b: bool) -> Vec {
- let out = Token::Bool(b);
- ethabi::encode(&[out])
+ pub fn encode_bool(b: bool) -> Vec {
+ ethabi::encode(&[Token::Bool(b)])
}
- pub fn encode_u8(&self, b: u8) -> Vec {
- let out = Token::Uint(U256::from(b));
- ethabi::encode(&[out])
+ pub fn encode_uint(b: T) -> Vec
+ where
+ U256: From,
+ {
+ ethabi::encode(&[Token::Uint(U256::from(b))])
}
- pub fn encode_u32(&self, b: u32) -> Vec {
- let out = Token::Uint(U256::from(b));
- ethabi::encode(&[out])
+ pub fn encode_uint_tuple(b: Vec) -> Vec
+ where
+ U256: From,
+ {
+ ethabi::encode(&[Token::Tuple(b.into_iter().map(U256::from).map(Token::Uint).collect())])
}
- pub fn encode_u128(&self, b: u128) -> Vec {
- let out = Token::Uint(U256::from(b));
- ethabi::encode(&[out])
+ pub fn encode_uint_array(b: Vec) -> Vec
+ where
+ U256: From,
+ {
+ ethabi::encode(&[Token::Array(b.into_iter().map(U256::from).map(Token::Uint).collect())])
}
- pub fn encode_u128_tuple(&self, b: u128, c: u128) -> Vec {
- let out = Token::Tuple(vec![Token::Uint(U256::from(b)), Token::Uint(U256::from(c))]);
- ethabi::encode(&[out])
+ pub fn encode_bytes(b: &[u8]) -> Vec {
+ ethabi::encode(&[Token::Bytes(b.to_vec())])
}
- pub fn encode_u128_array(&self, b: Vec) -> Vec {
- let result: Vec = b.iter().map(|x| Token::Uint(U256::from(*x))).collect();
- let out = Token::FixedArray(result);
- ethabi::encode(&[out])
+ pub fn encode_fixed_bytes(b: &[u8]) -> Vec {
+ ethabi::encode(&[Token::FixedBytes(b.to_vec())])
}
- pub fn encode_address_array(&self, b: Vec) -> Vec {
- let result: Vec = b
- .iter()
- .map(|x| Token::Address(H160::from_slice(x.as_bytes())))
- .collect();
- let out = Token::FixedArray(result);
- ethabi::encode(&[out])
+ pub fn encode_address(b: H160) -> Vec {
+ ethabi::encode(&[Token::Address(b)])
}
- pub fn encode_bytes(&self, b: &[u8]) -> Vec {
- let out = Token::Bytes(b.to_vec());
- ethabi::encode(&[out])
+ pub fn encode_address_tuple(b: Vec) -> Vec {
+ ethabi::encode(&[Token::Tuple(b.into_iter().map(Token::Address).collect())])
}
- pub fn encode_fixed_bytes(&self, b: &[u8]) -> Vec {
- let out = Token::FixedBytes(b.to_vec());
- ethabi::encode(&[out])
- }
-
- pub fn encode_address(&self, b: &H160) -> Vec {
- let out = Token::Address(H160::from_slice(b.as_bytes()));
- ethabi::encode(&[out])
+ pub fn encode_address_array(b: Vec) -> Vec {
+ ethabi::encode(&[Token::Array(b.into_iter().map(Token::Address).collect())])
}
}
@@ -568,6 +568,27 @@ mod tests {
assert_ok!(input.i128_at(6), 0);
}
+ #[test]
+ fn bool_works() {
+ let data = hex_literal::hex! {"
+ 00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000001
+ 0000000000000000000000000000000000000000000000000000000000000002
+ "};
+ let input = TestInput::new(&data[..], Some(10));
+ assert_ok!(input.bool_at(1), false);
+ assert_ok!(input.bool_at(2), true);
+ assert_eq!(
+ input.bool_at(3),
+ Err(PrecompileFailure::Revert {
+ exit_status: ExitRevert::Reverted,
+ output: "failed to decode bool".into(),
+ cost: 10,
+ })
+ );
+ }
+
#[test]
fn decode_int128() {
let items = [
diff --git a/runtime/common/src/precompile/multicurrency.rs b/runtime/common/src/precompile/multicurrency.rs
index f11703d1c..2e4efbc13 100644
--- a/runtime/common/src/precompile/multicurrency.rs
+++ b/runtime/common/src/precompile/multicurrency.rs
@@ -108,7 +108,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_bytes(&name),
+ output: Output::encode_bytes(&name),
logs: Default::default(),
})
}
@@ -124,7 +124,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_bytes(&symbol),
+ output: Output::encode_bytes(&symbol),
logs: Default::default(),
})
}
@@ -140,7 +140,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u8(decimals),
+ output: Output::encode_uint(decimals),
logs: Default::default(),
})
}
@@ -152,7 +152,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(total_issuance),
+ output: Output::encode_uint(total_issuance),
logs: Default::default(),
})
}
@@ -169,7 +169,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(balance),
+ output: Output::encode_uint(balance),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/nft.rs b/runtime/common/src/precompile/nft.rs
index a885d01d1..522df54c9 100644
--- a/runtime/common/src/precompile/nft.rs
+++ b/runtime/common/src/precompile/nft.rs
@@ -92,7 +92,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: 0,
- output: Output::default().encode_u128(balance),
+ output: Output::encode_uint(balance),
logs: Default::default(),
})
}
@@ -112,7 +112,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: 0,
- output: Output::default().encode_address(&owner),
+ output: Output::encode_address(owner),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/oracle.rs b/runtime/common/src/precompile/oracle.rs
index 656eb0d10..6db7016fd 100644
--- a/runtime/common/src/precompile/oracle.rs
+++ b/runtime/common/src/precompile/oracle.rs
@@ -105,7 +105,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(output),
+ output: Output::encode_uint(output),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/schedule.rs b/runtime/common/src/precompile/schedule.rs
index 47e55067d..c787207b5 100644
--- a/runtime/common/src/precompile/schedule.rs
+++ b/runtime/common/src/precompile/schedule.rs
@@ -228,7 +228,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: 0,
- output: Output::default().encode_bytes(&task_id),
+ output: Output::encode_bytes(&task_id),
logs: Default::default(),
})
}
diff --git a/runtime/common/src/precompile/stable_asset.rs b/runtime/common/src/precompile/stable_asset.rs
index b40b84005..a16416738 100644
--- a/runtime/common/src/precompile/stable_asset.rs
+++ b/runtime/common/src/precompile/stable_asset.rs
@@ -102,7 +102,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_address_array(assets),
+ output: Output::encode_address_array(assets),
logs: Default::default(),
})
}
@@ -120,7 +120,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(pool_info.total_supply),
+ output: Output::encode_uint(pool_info.total_supply),
logs: Default::default(),
})
}
@@ -138,7 +138,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(pool_info.precision),
+ output: Output::encode_uint(pool_info.precision),
logs: Default::default(),
})
}
@@ -156,7 +156,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(pool_info.mint_fee),
+ output: Output::encode_uint(pool_info.mint_fee),
logs: Default::default(),
})
}
@@ -174,7 +174,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(pool_info.swap_fee),
+ output: Output::encode_uint(pool_info.swap_fee),
logs: Default::default(),
})
}
@@ -192,7 +192,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128(pool_info.redeem_fee),
+ output: Output::encode_uint(pool_info.redeem_fee),
logs: Default::default(),
})
}
@@ -222,7 +222,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u128_tuple(input, output),
+ output: Output::encode_uint_tuple(vec![input, output]),
logs: Default::default(),
})
}
@@ -251,7 +251,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u8(0u8),
+ output: Output::encode_uint(0u8),
logs: Default::default(),
})
}
@@ -280,7 +280,7 @@ where
Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gas_cost,
- output: Output::default().encode_u8(0u8),
+ output: Output::encode_uint(0u8),
logs: Default::default(),
})
}
@@ -387,12 +387,10 @@ mod tests {
"};
let resp = StableAssetPrecompile::execute(&input, None, &context, false).unwrap();
let expected_output = hex! {"
- 000000000000000000000000
- 000000000000000000010000
- 000000000000000100000000
- 000000000000000000000000
- 000000000001000000000000
- 00000014
+ 00000000000000000000000000000000 00000000000000000000000000000020
+ 00000000000000000000000000000000 00000000000000000000000000000002
+ 000000000000000000000000 0000000000000000000100000000000000000001
+ 000000000000000000000000 0000000000000000000100000000000000000014
"};
assert_eq!(resp.exit_status, ExitSucceed::Returned);
assert_eq!(resp.output, expected_output.to_vec());