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());