From d190a670c95bd7e20b92d4027bbf632b7fbd4b03 Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Mon, 05 Sep 2022 13:05:03 +0000 Subject: [PATCH] feat: Add events for set contract sponsoring. --- --- a/Cargo.lock +++ b/Cargo.lock @@ -5735,6 +5735,7 @@ name = "pallet-evm-contract-helpers" version = "0.2.0" dependencies = [ + "ethereum", "evm-coder", "fp-evm-mapping", "frame-support", --- a/pallets/evm-contract-helpers/Cargo.toml +++ b/pallets/evm-contract-helpers/Cargo.toml @@ -9,6 +9,7 @@ "derive", ] } log = { default-features = false, version = "0.4.14" } +ethereum = { version = "0.12.0", default-features = false } # Substrate frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.27" } --- a/pallets/evm-contract-helpers/src/eth.rs +++ b/pallets/evm-contract-helpers/src/eth.rs @@ -17,7 +17,9 @@ //! Implementation of magic contract use core::marker::PhantomData; -use evm_coder::{abi::AbiWriter, execution::Result, generate_stubgen, solidity_interface, types::*}; +use evm_coder::{ + abi::AbiWriter, execution::Result, generate_stubgen, solidity_interface, types::*, ToLog, +}; use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder, dispatch_to_evm}; use pallet_evm::{ ExitRevert, OnCreate, OnMethodCall, PrecompileResult, PrecompileFailure, PrecompileHandle, @@ -33,6 +35,37 @@ use up_sponsorship::SponsorshipHandler; use sp_std::vec::Vec; +/// Pallet events. +#[derive(ToLog)] +pub enum ContractHelpersEvents { + /// Contract sponsor was set. + ContractSponsorSet { + /// Contract address of the affected collection. + #[indexed] + contract: address, + /// New sponsor address. + #[indexed] + sponsor: address, + }, + + /// New sponsor was confirm. + ContractSponsorshipConfirmed { + /// Contract address of the affected collection. + #[indexed] + contract: address, + /// New sponsor address. + #[indexed] + sponsor: address, + }, + + /// Collection sponsor was removed. + ContractSponsorRemoved { + /// Contract address of the affected collection. + #[indexed] + contract: address, + }, +} + /// See [`ContractHelpersCall`] pub struct ContractHelpers(SubstrateRecorder); impl WithRecorder for ContractHelpers { @@ -46,7 +79,7 @@ } /// @title Magic contract, which allows users to reconfigure other contracts -#[solidity_interface(name = ContractHelpers)] +#[solidity_interface(name = ContractHelpers, events(ContractHelpersEvents))] impl ContractHelpers where T::AccountId: AsRef<[u8; 32]>, @@ -91,7 +124,7 @@ self.recorder().consume_sload()?; self.recorder().consume_sstore()?; - Pallet::::self_sponsored_enable(&T::CrossAccountId::from_eth(caller), contract_address) + Pallet::::force_set_sponsor(&T::CrossAccountId::from_eth(caller), contract_address) .map_err(dispatch_to_evm::)?; Ok(()) --- a/pallets/evm-contract-helpers/src/lib.rs +++ b/pallets/evm-contract-helpers/src/lib.rs @@ -16,7 +16,7 @@ #![doc = include_str!("../README.md")] #![cfg_attr(not(feature = "std"), no_std)] -#![deny(missing_docs)] +#![warn(missing_docs)] use codec::{Decode, Encode, MaxEncodedLen}; pub use pallet::*; @@ -27,18 +27,24 @@ #[frame_support::pallet] pub mod pallet { pub use super::*; + use crate::eth::ContractHelpersEvents; use frame_support::pallet_prelude::*; use pallet_evm_coder_substrate::DispatchResult; use sp_core::H160; - use pallet_evm::account::CrossAccountId; + use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm}; use up_data_structs::SponsorshipState; + use evm_coder::ToLog; #[pallet::config] pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config + pallet_evm::account::Config { + /// Overarching event type. + type Event: IsType<::Event> + From>; + /// Address, under which magic contract will be available type ContractAddress: Get; + /// In case of enabled sponsoring, but no sponsoring rate limit set, /// this value will be used implicitly type DefaultSponsoringRateLimit: Get; @@ -150,6 +156,32 @@ QueryKind = ValueQuery, >; + #[pallet::event] + #[pallet::generate_deposit(pub fn deposit_event)] + pub enum Event { + /// Contract sponsor was set. + ContractSponsorSet( + /// Contract address of the affected collection. + H160, + /// New sponsor address. + T::AccountId, + ), + + /// New sponsor was confirm. + ContractSponsorshipConfirmed( + /// Contract address of the affected collection. + H160, + /// New sponsor address. + T::AccountId, + ), + + /// Collection sponsor was removed. + ContractSponsorRemoved( + /// Contract address of the affected collection. + H160, + ), + } + impl Pallet { /// Get contract owner. pub fn contract_owner(contract: H160) -> H160 { @@ -169,13 +201,25 @@ contract, SponsorshipState::::Unconfirmed(sponsor.clone()), ); + + >::deposit_event(Event::::ContractSponsorSet( + contract, + sponsor.as_sub().clone(), + )); + >::deposit_log( + ContractHelpersEvents::ContractSponsorSet { + contract, + sponsor: *sponsor.as_eth(), + } + .to_log(contract), + ); Ok(()) } - /// Set `contract` as self sponsored. + /// Set sponsor as already confirmed. /// /// `sender` must be owner of contract. - pub fn self_sponsored_enable(sender: &T::CrossAccountId, contract: H160) -> DispatchResult { + pub fn force_set_sponsor(sender: &T::CrossAccountId, contract: H160) -> DispatchResult { Pallet::::ensure_owner(contract, *sender.as_eth())?; Sponsoring::::insert( contract, @@ -192,6 +236,12 @@ pub fn remove_sponsor(sender: &T::CrossAccountId, contract: H160) -> DispatchResult { Pallet::::ensure_owner(contract, *sender.as_eth())?; Sponsoring::::remove(contract); + + >::deposit_event(Event::::ContractSponsorRemoved(contract)); + >::deposit_log( + ContractHelpersEvents::ContractSponsorRemoved { contract }.to_log(contract), + ); + Ok(()) } @@ -202,10 +252,25 @@ match Sponsoring::::get(contract) { SponsorshipState::Unconfirmed(sponsor) => { ensure!(sponsor == *sender, Error::::NoPermission); + let eth_sponsor = *sponsor.as_eth(); + let sub_sponsor = sponsor.as_sub().clone(); Sponsoring::::insert( contract, SponsorshipState::::Confirmed(sponsor), ); + + >::deposit_event(Event::::ContractSponsorshipConfirmed( + contract, + sub_sponsor, + )); + >::deposit_log( + ContractHelpersEvents::ContractSponsorshipConfirmed { + contract, + sponsor: eth_sponsor, + } + .to_log(contract), + ); + Ok(()) } SponsorshipState::Disabled | SponsorshipState::Confirmed(_) => { --- a/runtime/common/config/ethereum.rs +++ b/runtime/common/config/ethereum.rs @@ -112,6 +112,7 @@ } impl pallet_evm_contract_helpers::Config for Runtime { + type Event = Event; type ContractAddress = HelpersContractAddress; type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit; } --- a/runtime/common/config/pallets/app_promotion.rs +++ b/runtime/common/config/pallets/app_promotion.rs @@ -22,7 +22,7 @@ use frame_support::{parameter_types, PalletId}; use sp_arithmetic::Perbill; use up_common::{ - constants::{ UNIQUE, RELAY_DAYS}, + constants::{UNIQUE, RELAY_DAYS}, types::Balance, }; --- a/runtime/common/construct_runtime/mod.rs +++ b/runtime/common/construct_runtime/mod.rs @@ -85,7 +85,7 @@ Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101, EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150, - EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151, + EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage, Event} = 151, EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152, EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153, } -- gitstuff