mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 12:51:02 +00:00
Contracts: revert reverted changes from 4266 (#4277)
revert some reverted changes from #4266
This commit is contained in:
@@ -14,8 +14,9 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use super::{Balances, Runtime, RuntimeCall, RuntimeEvent, RuntimeHoldReason};
|
use super::{Balances, Runtime, RuntimeCall, RuntimeEvent};
|
||||||
use frame_support::{derive_impl, parameter_types, traits::Contains};
|
use crate::parachain::RuntimeHoldReason;
|
||||||
|
use frame_support::{derive_impl, parameter_types};
|
||||||
|
|
||||||
parameter_types! {
|
parameter_types! {
|
||||||
pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();
|
pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();
|
||||||
@@ -28,14 +29,5 @@ impl pallet_contracts::Config for Runtime {
|
|||||||
type Currency = Balances;
|
type Currency = Balances;
|
||||||
type Schedule = Schedule;
|
type Schedule = Schedule;
|
||||||
type Time = super::Timestamp;
|
type Time = super::Timestamp;
|
||||||
type CallFilter = CallFilter;
|
|
||||||
type Xcm = pallet_xcm::Pallet<Self>;
|
type Xcm = pallet_xcm::Pallet<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// In this mock, we only allow other contract calls via XCM.
|
|
||||||
pub struct CallFilter;
|
|
||||||
impl Contains<RuntimeCall> for CallFilter {
|
|
||||||
fn contains(call: &RuntimeCall) -> bool {
|
|
||||||
matches!(call, RuntimeCall::Contracts(pallet_contracts::Call::call { .. }))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -22,10 +22,7 @@ use crate::{
|
|||||||
relay_chain, MockNet, ParaA, ParachainBalances, Relay, ALICE, BOB, INITIAL_BALANCE,
|
relay_chain, MockNet, ParaA, ParachainBalances, Relay, ALICE, BOB, INITIAL_BALANCE,
|
||||||
};
|
};
|
||||||
use codec::{Decode, Encode};
|
use codec::{Decode, Encode};
|
||||||
use frame_support::{
|
use frame_support::traits::{fungibles::Mutate, Currency};
|
||||||
assert_err,
|
|
||||||
traits::{fungibles::Mutate, Currency},
|
|
||||||
};
|
|
||||||
use pallet_contracts::{test_utils::builder::*, Code};
|
use pallet_contracts::{test_utils::builder::*, Code};
|
||||||
use pallet_contracts_fixtures::compile_module;
|
use pallet_contracts_fixtures::compile_module;
|
||||||
use pallet_contracts_uapi::ReturnErrorCode;
|
use pallet_contracts_uapi::ReturnErrorCode;
|
||||||
@@ -132,26 +129,6 @@ fn test_xcm_execute_incomplete() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_xcm_execute_filtered_call() {
|
|
||||||
MockNet::reset();
|
|
||||||
|
|
||||||
let contract_addr = instantiate_test_contract("xcm_execute");
|
|
||||||
|
|
||||||
ParaA::execute_with(|| {
|
|
||||||
// `remark` should be rejected, as it is not allowed by our CallFilter.
|
|
||||||
let call = parachain::RuntimeCall::System(frame_system::Call::remark { remark: vec![] });
|
|
||||||
let message: Xcm<parachain::RuntimeCall> = Xcm::builder_unsafe()
|
|
||||||
.transact(OriginKind::Native, Weight::MAX, call.encode())
|
|
||||||
.build();
|
|
||||||
let result = bare_call(contract_addr.clone())
|
|
||||||
.data(VersionedXcm::V4(message).encode())
|
|
||||||
.build()
|
|
||||||
.result;
|
|
||||||
assert_err!(result, frame_system::Error::<parachain::Runtime>::CallFiltered);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_xcm_execute_reentrant_call() {
|
fn test_xcm_execute_reentrant_call() {
|
||||||
MockNet::reset();
|
MockNet::reset();
|
||||||
|
|||||||
@@ -307,6 +307,9 @@ pub mod pallet {
|
|||||||
/// Therefore please make sure to be restrictive about which dispatchables are allowed
|
/// Therefore please make sure to be restrictive about which dispatchables are allowed
|
||||||
/// in order to not introduce a new DoS vector like memory allocation patterns that can
|
/// in order to not introduce a new DoS vector like memory allocation patterns that can
|
||||||
/// be exploited to drive the runtime into a panic.
|
/// be exploited to drive the runtime into a panic.
|
||||||
|
///
|
||||||
|
/// This filter does not apply to XCM transact calls. To impose restrictions on XCM transact
|
||||||
|
/// calls, you must configure them separately within the XCM pallet itself.
|
||||||
#[pallet::no_default_bounds]
|
#[pallet::no_default_bounds]
|
||||||
type CallFilter: Contains<<Self as frame_system::Config>::RuntimeCall>;
|
type CallFilter: Contains<<Self as frame_system::Config>::RuntimeCall>;
|
||||||
|
|
||||||
|
|||||||
@@ -25,12 +25,8 @@ use crate::{
|
|||||||
};
|
};
|
||||||
use codec::{Decode, DecodeLimit, Encode, MaxEncodedLen};
|
use codec::{Decode, DecodeLimit, Encode, MaxEncodedLen};
|
||||||
use frame_support::{
|
use frame_support::{
|
||||||
dispatch::DispatchInfo,
|
dispatch::DispatchInfo, ensure, pallet_prelude::DispatchResultWithPostInfo, parameter_types,
|
||||||
ensure,
|
traits::Get, weights::Weight,
|
||||||
pallet_prelude::{DispatchResult, DispatchResultWithPostInfo},
|
|
||||||
parameter_types,
|
|
||||||
traits::Get,
|
|
||||||
weights::Weight,
|
|
||||||
};
|
};
|
||||||
use pallet_contracts_proc_macro::define_env;
|
use pallet_contracts_proc_macro::define_env;
|
||||||
use pallet_contracts_uapi::{CallFlags, ReturnFlags};
|
use pallet_contracts_uapi::{CallFlags, ReturnFlags};
|
||||||
@@ -41,7 +37,6 @@ use sp_runtime::{
|
|||||||
};
|
};
|
||||||
use sp_std::{fmt, prelude::*};
|
use sp_std::{fmt, prelude::*};
|
||||||
use wasmi::{core::HostError, errors::LinkerError, Linker, Memory, Store};
|
use wasmi::{core::HostError, errors::LinkerError, Linker, Memory, Store};
|
||||||
use xcm::VersionedXcm;
|
|
||||||
|
|
||||||
type CallOf<T> = <T as frame_system::Config>::RuntimeCall;
|
type CallOf<T> = <T as frame_system::Config>::RuntimeCall;
|
||||||
|
|
||||||
@@ -378,29 +373,6 @@ fn already_charged(_: u32) -> Option<RuntimeCosts> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ensure that the XCM program is executable, by checking that it does not contain any [`Transact`]
|
|
||||||
/// instruction with a call that is not allowed by the CallFilter.
|
|
||||||
fn ensure_executable<T: Config>(message: &VersionedXcm<CallOf<T>>) -> DispatchResult {
|
|
||||||
use frame_support::traits::Contains;
|
|
||||||
use xcm::prelude::{Transact, Xcm};
|
|
||||||
|
|
||||||
let mut message: Xcm<CallOf<T>> =
|
|
||||||
message.clone().try_into().map_err(|_| Error::<T>::XCMDecodeFailed)?;
|
|
||||||
|
|
||||||
message.iter_mut().try_for_each(|inst| -> DispatchResult {
|
|
||||||
let Transact { ref mut call, .. } = inst else { return Ok(()) };
|
|
||||||
let call = call.ensure_decoded().map_err(|_| Error::<T>::XCMDecodeFailed)?;
|
|
||||||
|
|
||||||
if !<T as Config>::CallFilter::contains(call) {
|
|
||||||
return Err(frame_system::Error::<T>::CallFiltered.into())
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Can only be used for one call.
|
/// Can only be used for one call.
|
||||||
pub struct Runtime<'a, E: Ext + 'a> {
|
pub struct Runtime<'a, E: Ext + 'a> {
|
||||||
ext: &'a mut E,
|
ext: &'a mut E,
|
||||||
@@ -2117,7 +2089,6 @@ pub mod env {
|
|||||||
ctx.charge_gas(RuntimeCosts::CopyFromContract(msg_len))?;
|
ctx.charge_gas(RuntimeCosts::CopyFromContract(msg_len))?;
|
||||||
let message: VersionedXcm<CallOf<E::T>> =
|
let message: VersionedXcm<CallOf<E::T>> =
|
||||||
ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?;
|
ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?;
|
||||||
ensure_executable::<E::T>(&message)?;
|
|
||||||
|
|
||||||
let execute_weight =
|
let execute_weight =
|
||||||
<<E::T as Config>::Xcm as ExecuteController<_, _>>::WeightInfo::execute();
|
<<E::T as Config>::Xcm as ExecuteController<_, _>>::WeightInfo::execute();
|
||||||
|
|||||||
Reference in New Issue
Block a user