From 3ceb44d78a57e53a9f855c7ebc6e849e384a22ff Mon Sep 17 00:00:00 2001 From: Itzik Grossman Date: Tue, 28 Mar 2023 15:46:38 +0300 Subject: [PATCH 1/2] Add ability to query how much gas was used by the contract --- packages/std/src/imports.rs | 11 +++++++++++ packages/std/src/testing/mock.rs | 4 ++++ packages/std/src/traits.rs | 2 ++ 3 files changed, 17 insertions(+) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 9123b9ef6d..a98383b8de 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -81,6 +81,8 @@ extern "C" { fn secp256k1_sign(messages_ptr: u32, private_key_ptr: u32) -> u64; fn ed25519_sign(messages_ptr: u32, private_key_ptr: u32) -> u64; + + fn check_gas() -> u64; } /// A stateless convenience wrapper around database imports provided by the VM. @@ -407,6 +409,15 @@ impl Api for ExternalApi { error_code => Err(SigningError::unknown_err(error_code)), } } + + fn check_gas(&self) -> StdResult { + let result = unsafe { check_gas() }; + if result != 0 { + return Err(StdError::generic_err("check_gas error")); + } + + Ok(result) + } } /// Takes a pointer to a Region and reads the data into a String. diff --git a/packages/std/src/testing/mock.rs b/packages/std/src/testing/mock.rs index 91f913c8fa..67e4b004b9 100644 --- a/packages/std/src/testing/mock.rs +++ b/packages/std/src/testing/mock.rs @@ -227,6 +227,10 @@ impl Api for MockApi { fn ed25519_sign(&self, message: &[u8], private_key: &[u8]) -> Result, SigningError> { Ok(cosmwasm_crypto::ed25519_sign(message, private_key)?) } + + fn check_gas(&self) -> StdResult { + Ok(0) + } } /// Returns a default enviroment with height, time, chain_id, and contract address diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 158315f9e1..def7615d96 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -212,6 +212,8 @@ pub trait Api { /// - message: Arbitrary message. /// - private key: Raw ED25519 private key (32 bytes) fn ed25519_sign(&self, message: &[u8], private_key: &[u8]) -> Result, SigningError>; + + fn check_gas(&self) -> StdResult; } /// A short-hand alias for the two-level query result (1. accessing the contract, 2. executing query in the contract) From 97122ddc6e1b2a57e2b966f6b0663df95ed5d82b Mon Sep 17 00:00:00 2001 From: Itzik Grossman Date: Wed, 29 Mar 2023 22:01:12 +0300 Subject: [PATCH 2/2] Merge master/gas evaporate --- packages/std/src/imports.rs | 2 +- packages/std/src/traits.rs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index ab97c5dd31..661393397e 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -414,7 +414,7 @@ impl Api for ExternalApi { fn check_gas(&self) -> StdResult { let result = unsafe { check_gas() }; - if result != 0 { + if result == 0 { return Err(StdError::generic_err("check_gas error")); } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 1b2f90d2cb..e97accfd17 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -213,6 +213,9 @@ pub trait Api { /// - private key: Raw ED25519 private key (32 bytes) fn ed25519_sign(&self, message: &[u8], private_key: &[u8]) -> Result, SigningError>; + /// Check Gas. + /// + /// This function will return the amount of gas currently used by the contract. fn check_gas(&self) -> StdResult; /// Gas evaporation.