mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-15 06:45:44 +00:00
28463a12f0
When doing a cross contract call you can supply an optional Weight limit for that call. If one doesn't specify the limit (setting it to 0) the sub call will have all the remaining gas available. If one does specify the limit we subtract that amount eagerly from the Weight meter and fail fast if not enough `Weight` is available. This is quite annoying because setting a fixed limit will set the `gas_required` in the gas estimation according to the specified limit. Even if in that dry-run the actual call didn't consume that whole amount. It effectively discards the more precise measurement it should have from the dry-run. This PR changes the behaviour so that the supplied limit is an actual limit: We do the cross contract call even if the limit is higher than the remaining `Weight`. We then fail and roll back in the cub call in case there is not enough weight. This makes the weight estimation in the dry-run no longer dependent on the weight limit supplied when doing a cross contract call. --------- Co-authored-by: PG Herveou <pgherveou@gmail.com>
54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
//! This fixture calls the account_id with the 2D Weight limit.
|
|
//! It returns the result of the call as output data.
|
|
#![no_std]
|
|
#![no_main]
|
|
|
|
use common::input;
|
|
use uapi::{HostFn, HostFnImpl as api};
|
|
|
|
#[no_mangle]
|
|
#[polkavm_derive::polkavm_export]
|
|
pub extern "C" fn deploy() {}
|
|
|
|
#[no_mangle]
|
|
#[polkavm_derive::polkavm_export]
|
|
pub extern "C" fn call() {
|
|
input!(
|
|
256,
|
|
callee_addr: [u8; 32],
|
|
ref_time: u64,
|
|
proof_size: u64,
|
|
forwarded_input: [u8],
|
|
);
|
|
|
|
#[allow(deprecated)]
|
|
api::call_v2(
|
|
uapi::CallFlags::empty(),
|
|
callee_addr,
|
|
ref_time,
|
|
proof_size,
|
|
None, // No deposit limit.
|
|
&0u64.to_le_bytes(), // value transferred to the contract.
|
|
forwarded_input,
|
|
None,
|
|
)
|
|
.unwrap();
|
|
}
|