1#![feature(prelude_import)]2#[prelude_import]3use std::prelude::rust_2018::*;4#[macro_use]5extern crate std;6pub use pallet::*;7pub use eth::*;8pub mod eth {9 use core::marker::PhantomData;10 use evm_coder::{abi::AbiWriter, execution::Result, generate_stubgen, solidity_interface, types::*};11 use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder};12 use pallet_evm::{ExitReason, ExitRevert, OnCreate, OnMethodCall, PrecompileOutput};13 use sp_core::H160;14 use crate::{15 AllowlistEnabled, Config, Owner, Pallet, SelfSponsoring, SponsorBasket, SponsoringRateLimit,16 };17 use frame_support::traits::Get;18 use up_sponsorship::SponsorshipHandler;19 use sp_std::{convert::TryInto, vec::Vec};20 struct ContractHelpers<T: Config>(SubstrateRecorder<T>);21 impl<T: Config> WithRecorder<T> for ContractHelpers<T> {22 fn recorder(&self) -> &SubstrateRecorder<T> {23 &self.024 }25 fn into_recorder(self) -> SubstrateRecorder<T> {26 self.027 }28 }29 impl<T: Config> ContractHelpers<T> {30 fn contract_owner(&self, contract_address: address) -> Result<address> {31 Ok(<Owner<T>>::get(contract_address))32 }33 fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {34 Ok(<SelfSponsoring<T>>::get(contract_address))35 }36 fn toggle_sponsoring(37 &mut self,38 caller: caller,39 contract_address: address,40 enabled: bool,41 ) -> Result<void> {42 <Pallet<T>>::ensure_owner(contract_address, caller)?;43 <Pallet<T>>::toggle_sponsoring(contract_address, enabled);44 Ok(())45 }46 fn set_sponsoring_rate_limit(47 &mut self,48 caller: caller,49 contract_address: address,50 rate_limit: uint32,51 ) -> Result<void> {52 <Pallet<T>>::ensure_owner(contract_address, caller)?;53 <Pallet<T>>::set_sponsoring_rate_limit(contract_address, rate_limit.into());54 Ok(())55 }56 fn get_sponsoring_rate_limit(&self, contract_address: address) -> Result<uint32> {57 Ok(<SponsoringRateLimit<T>>::get(contract_address)58 .try_into()59 .map_err(|_| "rate limit > u32::MAX")?)60 }61 fn allowed(&self, contract_address: address, user: address) -> Result<bool> {62 Ok(<Pallet<T>>::allowed(contract_address, user, true))63 }64 fn allowlist_enabled(&self, contract_address: address) -> Result<bool> {65 Ok(<AllowlistEnabled<T>>::get(contract_address))66 }67 fn toggle_allowlist(68 &mut self,69 caller: caller,70 contract_address: address,71 enabled: bool,72 ) -> Result<void> {73 <Pallet<T>>::ensure_owner(contract_address, caller)?;74 <Pallet<T>>::toggle_allowlist(contract_address, enabled);75 Ok(())76 }77 fn toggle_allowed(78 &mut self,79 caller: caller,80 contract_address: address,81 user: address,82 allowed: bool,83 ) -> Result<void> {84 <Pallet<T>>::ensure_owner(contract_address, caller)?;85 <Pallet<T>>::toggle_allowed(contract_address, user, allowed);86 Ok(())87 }88 }89 pub enum ContractHelpersCall<T: Config> {90 ERC165Call(::evm_coder::ERC165Call, PhantomData<(T)>),91 ContractOwner {92 contract_address: address,93 },94 SponsoringEnabled {95 contract_address: address,96 },97 ToggleSponsoring {98 contract_address: address,99 enabled: bool,100 },101 SetSponsoringRateLimit {102 contract_address: address,103 rate_limit: uint32,104 },105 GetSponsoringRateLimit {106 contract_address: address,107 },108 Allowed {109 contract_address: address,110 user: address,111 },112 AllowlistEnabled {113 contract_address: address,114 },115 ToggleAllowlist {116 contract_address: address,117 enabled: bool,118 },119 ToggleAllowed {120 contract_address: address,121 user: address,122 allowed: bool,123 },124 }125 #[automatically_derived]126 #[allow(unused_qualifications)]127 impl<T: ::core::fmt::Debug + Config> ::core::fmt::Debug for ContractHelpersCall<T> {128 fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {129 match (&*self,) {130 (&ContractHelpersCall::ERC165Call(ref __self_0, ref __self_1),) => {131 let debug_trait_builder =132 &mut ::core::fmt::Formatter::debug_tuple(f, "ERC165Call");133 let _ = ::core::fmt::DebugTuple::field(debug_trait_builder, &&(*__self_0));134 let _ = ::core::fmt::DebugTuple::field(debug_trait_builder, &&(*__self_1));135 ::core::fmt::DebugTuple::finish(debug_trait_builder)136 }137 (&ContractHelpersCall::ContractOwner {138 contract_address: ref __self_0,139 },) => {140 let debug_trait_builder =141 &mut ::core::fmt::Formatter::debug_struct(f, "ContractOwner");142 let _ = ::core::fmt::DebugStruct::field(143 debug_trait_builder,144 "contract_address",145 &&(*__self_0),146 );147 ::core::fmt::DebugStruct::finish(debug_trait_builder)148 }149 (&ContractHelpersCall::SponsoringEnabled {150 contract_address: ref __self_0,151 },) => {152 let debug_trait_builder =153 &mut ::core::fmt::Formatter::debug_struct(f, "SponsoringEnabled");154 let _ = ::core::fmt::DebugStruct::field(155 debug_trait_builder,156 "contract_address",157 &&(*__self_0),158 );159 ::core::fmt::DebugStruct::finish(debug_trait_builder)160 }161 (&ContractHelpersCall::ToggleSponsoring {162 contract_address: ref __self_0,163 enabled: ref __self_1,164 },) => {165 let debug_trait_builder =166 &mut ::core::fmt::Formatter::debug_struct(f, "ToggleSponsoring");167 let _ = ::core::fmt::DebugStruct::field(168 debug_trait_builder,169 "contract_address",170 &&(*__self_0),171 );172 let _ = ::core::fmt::DebugStruct::field(173 debug_trait_builder,174 "enabled",175 &&(*__self_1),176 );177 ::core::fmt::DebugStruct::finish(debug_trait_builder)178 }179 (&ContractHelpersCall::SetSponsoringRateLimit {180 contract_address: ref __self_0,181 rate_limit: ref __self_1,182 },) => {183 let debug_trait_builder =184 &mut ::core::fmt::Formatter::debug_struct(f, "SetSponsoringRateLimit");185 let _ = ::core::fmt::DebugStruct::field(186 debug_trait_builder,187 "contract_address",188 &&(*__self_0),189 );190 let _ = ::core::fmt::DebugStruct::field(191 debug_trait_builder,192 "rate_limit",193 &&(*__self_1),194 );195 ::core::fmt::DebugStruct::finish(debug_trait_builder)196 }197 (&ContractHelpersCall::GetSponsoringRateLimit {198 contract_address: ref __self_0,199 },) => {200 let debug_trait_builder =201 &mut ::core::fmt::Formatter::debug_struct(f, "GetSponsoringRateLimit");202 let _ = ::core::fmt::DebugStruct::field(203 debug_trait_builder,204 "contract_address",205 &&(*__self_0),206 );207 ::core::fmt::DebugStruct::finish(debug_trait_builder)208 }209 (&ContractHelpersCall::Allowed {210 contract_address: ref __self_0,211 user: ref __self_1,212 },) => {213 let debug_trait_builder =214 &mut ::core::fmt::Formatter::debug_struct(f, "Allowed");215 let _ = ::core::fmt::DebugStruct::field(216 debug_trait_builder,217 "contract_address",218 &&(*__self_0),219 );220 let _ =221 ::core::fmt::DebugStruct::field(debug_trait_builder, "user", &&(*__self_1));222 ::core::fmt::DebugStruct::finish(debug_trait_builder)223 }224 (&ContractHelpersCall::AllowlistEnabled {225 contract_address: ref __self_0,226 },) => {227 let debug_trait_builder =228 &mut ::core::fmt::Formatter::debug_struct(f, "AllowlistEnabled");229 let _ = ::core::fmt::DebugStruct::field(230 debug_trait_builder,231 "contract_address",232 &&(*__self_0),233 );234 ::core::fmt::DebugStruct::finish(debug_trait_builder)235 }236 (&ContractHelpersCall::ToggleAllowlist {237 contract_address: ref __self_0,238 enabled: ref __self_1,239 },) => {240 let debug_trait_builder =241 &mut ::core::fmt::Formatter::debug_struct(f, "ToggleAllowlist");242 let _ = ::core::fmt::DebugStruct::field(243 debug_trait_builder,244 "contract_address",245 &&(*__self_0),246 );247 let _ = ::core::fmt::DebugStruct::field(248 debug_trait_builder,249 "enabled",250 &&(*__self_1),251 );252 ::core::fmt::DebugStruct::finish(debug_trait_builder)253 }254 (&ContractHelpersCall::ToggleAllowed {255 contract_address: ref __self_0,256 user: ref __self_1,257 allowed: ref __self_2,258 },) => {259 let debug_trait_builder =260 &mut ::core::fmt::Formatter::debug_struct(f, "ToggleAllowed");261 let _ = ::core::fmt::DebugStruct::field(262 debug_trait_builder,263 "contract_address",264 &&(*__self_0),265 );266 let _ =267 ::core::fmt::DebugStruct::field(debug_trait_builder, "user", &&(*__self_1));268 let _ = ::core::fmt::DebugStruct::field(269 debug_trait_builder,270 "allowed",271 &&(*__self_2),272 );273 ::core::fmt::DebugStruct::finish(debug_trait_builder)274 }275 }276 }277 }278 impl<T: Config> ContractHelpersCall<T> {279 #[doc = "contractOwner(address)"]280 const CONTRACT_OWNER: u32 = 1364373836u32;281 #[doc = "sponsoringEnabled(address)"]282 const SPONSORING_ENABLED: u32 = 1613225057u32;283 #[doc = "toggleSponsoring(address,bool)"]284 const TOGGLE_SPONSORING: u32 = 4239158662u32;285 #[doc = "setSponsoringRateLimit(address,uint32)"]286 const SET_SPONSORING_RATE_LIMIT: u32 = 2008467720u32;287 #[doc = "getSponsoringRateLimit(address)"]288 const GET_SPONSORING_RATE_LIMIT: u32 = 1628240573u32;289 #[doc = "allowed(address,address)"]290 const ALLOWED: u32 = 1550156133u32;291 #[doc = "allowlistEnabled(address)"]292 const ALLOWLIST_ENABLED: u32 = 3346198380u32;293 #[doc = "toggleAllowlist(address,bool)"]294 const TOGGLE_ALLOWLIST: u32 = 920527093u32;295 #[doc = "toggleAllowed(address,address,bool)"]296 const TOGGLE_ALLOWED: u32 = 1191627804u32;297 pub const fn interface_id() -> u32 {298 let mut interface_id = 0;299 interface_id ^= Self::CONTRACT_OWNER;300 interface_id ^= Self::SPONSORING_ENABLED;301 interface_id ^= Self::TOGGLE_SPONSORING;302 interface_id ^= Self::SET_SPONSORING_RATE_LIMIT;303 interface_id ^= Self::GET_SPONSORING_RATE_LIMIT;304 interface_id ^= Self::ALLOWED;305 interface_id ^= Self::ALLOWLIST_ENABLED;306 interface_id ^= Self::TOGGLE_ALLOWLIST;307 interface_id ^= Self::TOGGLE_ALLOWED;308 interface_id309 }310 pub fn supports_interface(interface_id: u32) -> bool {311 interface_id != 0xffffff312 && (interface_id == ::evm_coder::ERC165Call::INTERFACE_ID313 || interface_id == Self::interface_id())314 }315 pub fn generate_solidity_interface(tc: &evm_coder::solidity::TypeCollector, is_impl: bool) {316 use evm_coder::solidity::*;317 use core::fmt::Write;318 let interface = SolidityInterface {319 name: "ContractHelpers",320 selector: Self::interface_id(),321 is: &["Dummy", "ERC165"],322 functions: (323 SolidityFunction {324 docs: &[],325 selector: "contractOwner(address) 5152b14c",326 name: "contractOwner",327 mutability: SolidityMutability::View,328 args: (<NamedArgument<address>>::new("contractAddress"),),329 result: <UnnamedArgument<address>>::default(),330 },331 SolidityFunction {332 docs: &[],333 selector: "sponsoringEnabled(address) 6027dc61",334 name: "sponsoringEnabled",335 mutability: SolidityMutability::View,336 args: (<NamedArgument<address>>::new("contractAddress"),),337 result: <UnnamedArgument<bool>>::default(),338 },339 SolidityFunction {340 docs: &[],341 selector: "toggleSponsoring(address,bool) fcac6d86",342 name: "toggleSponsoring",343 mutability: SolidityMutability::Mutable,344 args: (345 <NamedArgument<address>>::new("contractAddress"),346 <NamedArgument<bool>>::new("enabled"),347 ),348 result: <UnnamedArgument<void>>::default(),349 },350 SolidityFunction {351 docs: &[],352 selector: "setSponsoringRateLimit(address,uint32) 77b6c908",353 name: "setSponsoringRateLimit",354 mutability: SolidityMutability::Mutable,355 args: (356 <NamedArgument<address>>::new("contractAddress"),357 <NamedArgument<uint32>>::new("rateLimit"),358 ),359 result: <UnnamedArgument<void>>::default(),360 },361 SolidityFunction {362 docs: &[],363 selector: "getSponsoringRateLimit(address) 610cfabd",364 name: "getSponsoringRateLimit",365 mutability: SolidityMutability::View,366 args: (<NamedArgument<address>>::new("contractAddress"),),367 result: <UnnamedArgument<uint32>>::default(),368 },369 SolidityFunction {370 docs: &[],371 selector: "allowed(address,address) 5c658165",372 name: "allowed",373 mutability: SolidityMutability::View,374 args: (375 <NamedArgument<address>>::new("contractAddress"),376 <NamedArgument<address>>::new("user"),377 ),378 result: <UnnamedArgument<bool>>::default(),379 },380 SolidityFunction {381 docs: &[],382 selector: "allowlistEnabled(address) c772ef6c",383 name: "allowlistEnabled",384 mutability: SolidityMutability::View,385 args: (<NamedArgument<address>>::new("contractAddress"),),386 result: <UnnamedArgument<bool>>::default(),387 },388 SolidityFunction {389 docs: &[],390 selector: "toggleAllowlist(address,bool) 36de20f5",391 name: "toggleAllowlist",392 mutability: SolidityMutability::Mutable,393 args: (394 <NamedArgument<address>>::new("contractAddress"),395 <NamedArgument<bool>>::new("enabled"),396 ),397 result: <UnnamedArgument<void>>::default(),398 },399 SolidityFunction {400 docs: &[],401 selector: "toggleAllowed(address,address,bool) 4706cc1c",402 name: "toggleAllowed",403 mutability: SolidityMutability::Mutable,404 args: (405 <NamedArgument<address>>::new("contractAddress"),406 <NamedArgument<address>>::new("user"),407 <NamedArgument<bool>>::new("allowed"),408 ),409 result: <UnnamedArgument<void>>::default(),410 },411 ),412 };413 if is_impl {414 tc . collect ("// Common stubs holder\ncontract Dummy {\n\tuint8 dummy;\n\tstring stub_error = \"this contract is implemented in native\";\n}\ncontract ERC165 is Dummy {\n\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool) {\n\t\trequire(false, stub_error);\n\t\tinterfaceID;\n\t\treturn true;\n\t}\n}\n" . into ()) ;415 } else {416 tc . collect ("// Common stubs holder\ninterface Dummy {\n}\ninterface ERC165 is Dummy {\n\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n" . into ()) ;417 }418 let mut out = string::new();419 if "ContractHelpers".starts_with("Inline") {420 out.push_str("// Inline\n");421 }422 let _ = interface.format(is_impl, &mut out, tc);423 tc.collect(out);424 }425 }426 impl<T: Config> ::evm_coder::Call for ContractHelpersCall<T> {427 fn parse(428 method_id: u32,429 reader: &mut ::evm_coder::abi::AbiReader,430 ) -> ::evm_coder::execution::Result<Option<Self>> {431 use ::evm_coder::abi::AbiRead;432 match method_id {433 ::evm_coder::ERC165Call::INTERFACE_ID => {434 return Ok(435 ::evm_coder::ERC165Call::parse(method_id, reader)?.map(Self::ERC165Call)436 )437 }438 Self::CONTRACT_OWNER => {439 return Ok(Some(Self::ContractOwner {440 contract_address: reader.abi_read()?,441 }))442 }443 Self::SPONSORING_ENABLED => {444 return Ok(Some(Self::SponsoringEnabled {445 contract_address: reader.abi_read()?,446 }))447 }448 Self::TOGGLE_SPONSORING => {449 return Ok(Some(Self::ToggleSponsoring {450 contract_address: reader.abi_read()?,451 enabled: reader.abi_read()?,452 }))453 }454 Self::SET_SPONSORING_RATE_LIMIT => {455 return Ok(Some(Self::SetSponsoringRateLimit {456 contract_address: reader.abi_read()?,457 rate_limit: reader.abi_read()?,458 }))459 }460 Self::GET_SPONSORING_RATE_LIMIT => {461 return Ok(Some(Self::GetSponsoringRateLimit {462 contract_address: reader.abi_read()?,463 }))464 }465 Self::ALLOWED => {466 return Ok(Some(Self::Allowed {467 contract_address: reader.abi_read()?,468 user: reader.abi_read()?,469 }))470 }471 Self::ALLOWLIST_ENABLED => {472 return Ok(Some(Self::AllowlistEnabled {473 contract_address: reader.abi_read()?,474 }))475 }476 Self::TOGGLE_ALLOWLIST => {477 return Ok(Some(Self::ToggleAllowlist {478 contract_address: reader.abi_read()?,479 enabled: reader.abi_read()?,480 }))481 }482 Self::TOGGLE_ALLOWED => {483 return Ok(Some(Self::ToggleAllowed {484 contract_address: reader.abi_read()?,485 user: reader.abi_read()?,486 allowed: reader.abi_read()?,487 }))488 }489 _ => {}490 }491 return Ok(None);492 }493 }494 impl<T: Config> ::evm_coder::Weighted for ContractHelpersCall<T> {495 fn weight(&self) -> ::evm_coder::execution::DispatchInfo {496 type InternalCall = ContractHelpersCall;497 match self {498 InternalCall::ERC165Call(::evm_coder::ERC165Call::SupportsInterface { .. }) => {499 100u64.into()500 }501 InternalCall::ContractOwner { .. } => ().into(),502 InternalCall::SponsoringEnabled { .. } => ().into(),503 InternalCall::ToggleSponsoring { .. } => ().into(),504 InternalCall::SetSponsoringRateLimit { .. } => ().into(),505 InternalCall::GetSponsoringRateLimit { .. } => ().into(),506 InternalCall::Allowed { .. } => ().into(),507 InternalCall::AllowlistEnabled { .. } => ().into(),508 InternalCall::ToggleAllowlist { .. } => ().into(),509 InternalCall::ToggleAllowed { .. } => ().into(),510 }511 }512 }513 impl<T: Config> ::evm_coder::Callable<ContractHelpersCall<T>> for ContractHelpers<T> {514 #[allow(unreachable_code)]515 fn call(516 &mut self,517 c: Msg<ContractHelpersCall>,518 ) -> ::evm_coder::execution::ResultWithPostInfo<::evm_coder::abi::AbiWriter> {519 use ::evm_coder::abi::AbiWrite;520 type InternalCall = ContractHelpersCall;521 match c.call {522 InternalCall::ERC165Call(::evm_coder::ERC165Call::SupportsInterface {523 interface_id,524 }) => {525 let mut writer = ::evm_coder::abi::AbiWriter::default();526 writer.bool(&InternalCall::supports_interface(interface_id));527 return Ok(writer.into());528 }529 _ => {}530 }531 let mut writer = ::evm_coder::abi::AbiWriter::default();532 match c.call {533 InternalCall::ContractOwner { contract_address } => {534 let result = self.contract_owner(contract_address)?;535 (&result).into_result()536 }537 InternalCall::SponsoringEnabled { contract_address } => {538 let result = self.sponsoring_enabled(contract_address)?;539 (&result).into_result()540 }541 InternalCall::ToggleSponsoring {542 contract_address,543 enabled,544 } => {545 let result =546 self.toggle_sponsoring(c.caller.clone(), contract_address, enabled)?;547 (&result).into_result()548 }549 InternalCall::SetSponsoringRateLimit {550 contract_address,551 rate_limit,552 } => {553 let result = self.set_sponsoring_rate_limit(554 c.caller.clone(),555 contract_address,556 rate_limit,557 )?;558 (&result).into_result()559 }560 InternalCall::GetSponsoringRateLimit { contract_address } => {561 let result = self.get_sponsoring_rate_limit(contract_address)?;562 (&result).into_result()563 }564 InternalCall::Allowed {565 contract_address,566 user,567 } => {568 let result = self.allowed(contract_address, user)?;569 (&result).into_result()570 }571 InternalCall::AllowlistEnabled { contract_address } => {572 let result = self.allowlist_enabled(contract_address)?;573 (&result).into_result()574 }575 InternalCall::ToggleAllowlist {576 contract_address,577 enabled,578 } => {579 let result =580 self.toggle_allowlist(c.caller.clone(), contract_address, enabled)?;581 (&result).into_result()582 }583 InternalCall::ToggleAllowed {584 contract_address,585 user,586 allowed,587 } => {588 let result =589 self.toggle_allowed(c.caller.clone(), contract_address, user, allowed)?;590 (&result).into_result()591 }592 _ => ::core::panicking::panic("internal error: entered unreachable code"),593 }594 }595 }596 pub struct HelpersOnMethodCall<T: Config>(PhantomData<*const T>);597 impl<T: Config> OnMethodCall<T> for HelpersOnMethodCall<T> {598 fn is_reserved(contract: &sp_core::H160) -> bool {599 contract == &T::ContractAddress::get()600 }601 fn is_used(contract: &sp_core::H160) -> bool {602 contract == &T::ContractAddress::get()603 }604 fn call(605 source: &sp_core::H160,606 target: &sp_core::H160,607 gas_left: u64,608 input: &[u8],609 value: sp_core::U256,610 ) -> Option<PrecompileOutput> {611 if !<Pallet<T>>::allowed(*target, *source, true) {612 return Some(PrecompileOutput {613 exit_status: ExitReason::Revert(ExitRevert::Reverted),614 cost: 0,615 output: {616 let mut writer = AbiWriter::new_call(147028384u32);617 writer.string("Target contract is allowlisted");618 writer.finish()619 },620 logs: ::alloc::vec::Vec::new(),621 });622 }623 if target != &T::ContractAddress::get() {624 return None;625 }626 let helpers = ContractHelpers::<T>(SubstrateRecorder::<T>::new(*target, gas_left));627 pallet_evm_coder_substrate::call(*source, helpers, value, input)628 }629 fn get_code(contract: &sp_core::H160) -> Option<Vec<u8>> {630 (contract == & T :: ContractAddress :: get ()) . then (| | b"`\xe0`@R`&`\x80\x81\x81R\x90a\x04\xf4`\xa09\x80Qa\x00&\x91`\x01\x91` \x90\x91\x01\x90a\x009V[P4\x80\x15a\x003W`\x00\x80\xfd[Pa\x01\rV[\x82\x80Ta\x00E\x90a\x00\xd2V[\x90`\x00R` `\x00 \x90`\x1f\x01` \x90\x04\x81\x01\x92\x82a\x00gW`\x00\x85Ua\x00\xadV[\x82`\x1f\x10a\x00\x80W\x80Q`\xff\x19\x16\x83\x80\x01\x17\x85Ua\x00\xadV[\x82\x80\x01`\x01\x01\x85U\x82\x15a\x00\xadW\x91\x82\x01[\x82\x81\x11\x15a\x00\xadW\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90a\x00\x92V[Pa\x00\xb9\x92\x91Pa\x00\xbdV[P\x90V[[\x80\x82\x11\x15a\x00\xb9W`\x00\x81U`\x01\x01a\x00\xbeV[`\x01\x81\x81\x1c\x90\x82\x16\x80a\x00\xe6W`\x7f\x82\x16\x91P[` \x82\x10\x81\x14\x15a\x01\x07WcNH{q`\xe0\x1b`\x00R`\"`\x04R`$`\x00\xfd[P\x91\x90PV[a\x03\xd8\x80a\x01\x1c`\x009`\x00\xf3\xfe`\x80`@R4\x80\x15a\x00\x10W`\x00\x80\xfd[P`\x046\x10a\x00\x9eW`\x005`\xe0\x1c\x80c`\'\xdca\x11a\x00fW\x80c`\'\xdca\x14a\x01\"W\x80ca\x0c\xfa\xbd\x14a\x010W\x80cw\xb6\xc9\x08\x14a\x01SW\x80c\xc7r\xefl\x14a\x01\"W\x80c\xfc\xacm\x86\x14a\x00\xcbW`\x00\x80\xfd[\x80c\x01\xff\xc9\xa7\x14a\x00\xa3W\x80c6\xde \xf5\x14a\x00\xcbW\x80cG\x06\xcc\x1c\x14a\x00\xe0W\x80cQR\xb1L\x14a\x00\xeeW\x80c\\e\x81e\x14a\x01\x14W[`\x00\x80\xfd[a\x00\xb6a\x00\xb16`\x04a\x01\xa2V[a\x01aV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xf3[a\x00\xdea\x00\xd96`\x04a\x01\xffV[a\x01\x87V[\x00[a\x00\xdea\x00\xd96`\x04a\x022V[a\x00\xfca\x00\xb16`\x04a\x02uV[`@Q`\x01`\x01`\xa0\x1b\x03\x90\x91\x16\x81R` \x01a\x00\xc2V[a\x00\xb6a\x00\xb16`\x04a\x02\x90V[a\x00\xb6a\x00\xb16`\x04a\x02uV[a\x01>a\x00\xb16`\x04a\x02uV[`@Qc\xff\xff\xff\xff\x90\x91\x16\x81R` \x01a\x00\xc2V[a\x00\xdea\x00\xd96`\x04a\x02\xbaV[`\x00`\x01`@QbF\x1b\xcd`\xe5\x1b\x81R`\x04\x01a\x01~\x91\x90a\x02\xfaV[`@Q\x80\x91\x03\x90\xfd[`\x01`@QbF\x1b\xcd`\xe5\x1b\x81R`\x04\x01a\x01~\x91\x90a\x02\xfaV[`\x00` \x82\x84\x03\x12\x15a\x01\xb4W`\x00\x80\xfd[\x815`\x01`\x01`\xe0\x1b\x03\x19\x81\x16\x81\x14a\x01\xccW`\x00\x80\xfd[\x93\x92PPPV[\x805`\x01`\x01`\xa0\x1b\x03\x81\x16\x81\x14a\x01\xeaW`\x00\x80\xfd[\x91\x90PV[\x805\x80\x15\x15\x81\x14a\x01\xeaW`\x00\x80\xfd[`\x00\x80`@\x83\x85\x03\x12\x15a\x02\x12W`\x00\x80\xfd[a\x02\x1b\x83a\x01\xd3V[\x91Pa\x02)` \x84\x01a\x01\xefV[\x90P\x92P\x92\x90PV[`\x00\x80`\x00``\x84\x86\x03\x12\x15a\x02GW`\x00\x80\xfd[a\x02P\x84a\x01\xd3V[\x92Pa\x02^` \x85\x01a\x01\xd3V[\x91Pa\x02l`@\x85\x01a\x01\xefV[\x90P\x92P\x92P\x92V[`\x00` \x82\x84\x03\x12\x15a\x02\x87W`\x00\x80\xfd[a\x01\xcc\x82a\x01\xd3V[`\x00\x80`@\x83\x85\x03\x12\x15a\x02\xa3W`\x00\x80\xfd[a\x02\xac\x83a\x01\xd3V[\x91Pa\x02)` \x84\x01a\x01\xd3V[`\x00\x80`@\x83\x85\x03\x12\x15a\x02\xcdW`\x00\x80\xfd[a\x02\xd6\x83a\x01\xd3V[\x91P` \x83\x015c\xff\xff\xff\xff\x81\x16\x81\x14a\x02\xefW`\x00\x80\xfd[\x80\x91PP\x92P\x92\x90PV[`\x00` \x80\x83R`\x00\x84T\x81`\x01\x82\x81\x1c\x91P\x80\x83\x16\x80a\x03\x1cW`\x7f\x83\x16\x92P[\x85\x83\x10\x81\x14\x15a\x03:WcNH{q`\xe0\x1b\x85R`\"`\x04R`$\x85\xfd[\x87\x86\x01\x83\x81R` \x01\x81\x80\x15a\x03WW`\x01\x81\x14a\x03hWa\x03\x93V[`\xff\x19\x86\x16\x82R\x87\x82\x01\x96Pa\x03\x93V[`\x00\x8b\x81R` \x90 `\x00[\x86\x81\x10\x15a\x03\x8dW\x81T\x84\x82\x01R\x90\x85\x01\x90\x89\x01a\x03tV[\x83\x01\x97PP[P\x94\x99\x98PPPPPPPPPV\xfe\xa2dipfsX\"\x12 \xde\xe1\xb0gnP\xa0\xbb\xa7\xaf\xbek+\xe6S6\n\xcd?\x0c+\x81\xebEq\x8c\xe3\xab\xaaC6UdsolcC\x00\x08\t\x003this contract is implemented in native" . to_vec ())631 }632 }633 pub struct HelpersOnCreate<T: Config>(PhantomData<*const T>);634 impl<T: Config> OnCreate<T> for HelpersOnCreate<T> {635 fn on_create(owner: H160, contract: H160) {636 <Owner<T>>::insert(contract, owner);637 }638 }639 pub struct HelpersContractSponsoring<T: Config>(PhantomData<*const T>);640 impl<T: Config> SponsorshipHandler<H160, (H160, Vec<u8>)> for HelpersContractSponsoring<T> {641 fn get_sponsor(who: &H160, call: &(H160, Vec<u8>)) -> Option<H160> {642 if <SelfSponsoring<T>>::get(&call.0) && <Pallet<T>>::allowed(call.0, *who, false) {643 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;644 if let Some(last_tx_block) = <SponsorBasket<T>>::get(&call.0, who) {645 let rate_limit = <SponsoringRateLimit<T>>::get(&call.0);646 let limit_time = last_tx_block + rate_limit;647 if block_number > limit_time {648 <SponsorBasket<T>>::insert(&call.0, who, block_number);649 return Some(call.0);650 }651 } else {652 <SponsorBasket<T>>::insert(&call.0, who, block_number);653 return Some(call.0);654 }655 }656 None657 }658 }659}660#[doc = r"661 The module that hosts all the662 [FRAME](https://docs.substrate.io/v3/runtime/frame)663 types needed to add this pallet to a664 runtime.665 "]666pub mod pallet {667 use evm_coder::execution::Result;668 use frame_support::pallet_prelude::*;669 use sp_core::H160;670 #[doc = r"671 Configuration trait of this pallet.672673 Implement this type for a runtime in order to customize this pallet.674 "]675 pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config {676 type ContractAddress: Get<H160>;677 type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;678 }679 #[scale_info(skip_type_params(T), capture_docs = "always")]680 #[doc = r"681 Custom [dispatch errors](https://docs.substrate.io/v3/runtime/events-and-errors)682 of this pallet.683 "]684 pub enum Error<T> {685 #[doc(hidden)]686 #[codec(skip)]687 __Ignore(688 frame_support::sp_std::marker::PhantomData<(T)>,689 frame_support::Never,690 ),691 #[doc = " This method is only executable by owner"]692 NoPermission,693 }694 #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]695 const _: () = {696 impl<T> ::scale_info::TypeInfo for Error<T>697 where698 frame_support::sp_std::marker::PhantomData<(T)>: ::scale_info::TypeInfo + 'static,699 T: 'static,700 {701 type Identity = Self;702 fn type_info() -> ::scale_info::Type {703 :: scale_info :: Type :: builder () . path (:: scale_info :: Path :: new ("Error" , "pallet_evm_contract_helpers::pallet")) . type_params (< [_] > :: into_vec (box [:: scale_info :: TypeParameter :: new ("T" , :: core :: option :: Option :: None)])) . docs_always (& ["\n\t\t\tCustom [dispatch errors](https://docs.substrate.io/v3/runtime/events-and-errors)\n\t\t\tof this pallet.\n\t\t\t"]) . variant (:: scale_info :: build :: Variants :: new () . variant ("NoPermission" , | v | v . index (0usize as :: core :: primitive :: u8) . docs_always (& ["This method is only executable by owner"])))704 }705 };706 };707 #[doc = r"708 The [pallet](https://docs.substrate.io/v3/runtime/frame#pallets) implementing709 the on-chain logic.710 "]711 pub struct Pallet<T>(frame_support::sp_std::marker::PhantomData<(T)>);712 const _: () = {713 impl<T> core::clone::Clone for Pallet<T> {714 fn clone(&self) -> Self {715 Self(core::clone::Clone::clone(&self.0))716 }717 }718 };719 const _: () = {720 impl<T> core::cmp::Eq for Pallet<T> {}721 };722 const _: () = {723 impl<T> core::cmp::PartialEq for Pallet<T> {724 fn eq(&self, other: &Self) -> bool {725 true && self.0 == other.0726 }727 }728 };729 const _: () = {730 impl<T> core::fmt::Debug for Pallet<T> {731 fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {732 fmt.debug_tuple("Pallet").field(&self.0).finish()733 }734 }735 };736 #[allow(type_alias_bounds)]737 pub(super) type Owner<T: Config> = StorageMap<738 _GeneratedPrefixForStorageOwner<T>,739 Twox128,740 H160,741 H160,742 ValueQuery,743 frame_support::traits::GetDefault,744 frame_support::traits::GetDefault,745 >;746 #[allow(type_alias_bounds)]747 pub(super) type SelfSponsoring<T: Config> = StorageMap<748 _GeneratedPrefixForStorageSelfSponsoring<T>,749 Twox128,750 H160,751 bool,752 ValueQuery,753 frame_support::traits::GetDefault,754 frame_support::traits::GetDefault,755 >;756 #[allow(type_alias_bounds)]757 pub(super) type SponsoringRateLimit<T: Config> = StorageMap<758 _GeneratedPrefixForStorageSponsoringRateLimit<T>,759 Twox128,760 H160,761 T::BlockNumber,762 ValueQuery,763 T::DefaultSponsoringRateLimit,764 frame_support::traits::GetDefault,765 >;766 #[allow(type_alias_bounds)]767 pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<768 _GeneratedPrefixForStorageSponsorBasket<T>,769 Twox128,770 H160,771 Twox128,772 H160,773 T::BlockNumber,774 OptionQuery,775 frame_support::traits::GetDefault,776 frame_support::traits::GetDefault,777 >;778 #[allow(type_alias_bounds)]779 pub(super) type AllowlistEnabled<T: Config> = StorageMap<780 _GeneratedPrefixForStorageAllowlistEnabled<T>,781 Twox128,782 H160,783 bool,784 ValueQuery,785 frame_support::traits::GetDefault,786 frame_support::traits::GetDefault,787 >;788 #[allow(type_alias_bounds)]789 pub(super) type Allowlist<T: Config> = StorageDoubleMap<790 _GeneratedPrefixForStorageAllowlist<T>,791 Twox128,792 H160,793 Twox128,794 H160,795 bool,796 ValueQuery,797 frame_support::traits::GetDefault,798 frame_support::traits::GetDefault,799 >;800 impl<T: Config> Pallet<T> {801 pub fn toggle_sponsoring(contract: H160, enabled: bool) {802 <SelfSponsoring<T>>::insert(contract, enabled);803 }804 pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {805 <SponsoringRateLimit<T>>::insert(contract, rate_limit);806 }807 #[doc = " Default is returned if allowlist is disabled"]808 pub fn allowed(contract: H160, user: H160, default: bool) -> bool {809 if !<AllowlistEnabled<T>>::get(contract) {810 return default;811 }812 <Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user813 }814 pub fn toggle_allowlist(contract: H160, enabled: bool) {815 <AllowlistEnabled<T>>::insert(contract, enabled)816 }817 pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {818 <Allowlist<T>>::insert(contract, user, allowed);819 }820 pub fn ensure_owner(contract: H160, user: H160) -> Result<()> {821 {822 if !(<Owner<T>>::get(&contract) == user) {823 {824 return Err("no permission".into());825 };826 }827 };828 Ok(())829 }830 }831 impl<T: Config> Pallet<T> {832 #[doc(hidden)]833 pub fn pallet_constants_metadata(834 ) -> frame_support::sp_std::vec::Vec<frame_support::metadata::PalletConstantMetadata>835 {836 ::alloc::vec::Vec::new()837 }838 }839 impl<T: Config> Pallet<T> {840 pub fn error_metadata() -> Option<frame_support::metadata::PalletErrorMetadata> {841 Some(frame_support::metadata::PalletErrorMetadata {842 ty: frame_support::scale_info::meta_type::<Error<T>>(),843 })844 }845 }846 #[doc = r" Type alias to `Pallet`, to be used by `construct_runtime`."]847 #[doc = r""]848 #[doc = r" Generated by `pallet` attribute macro."]849 #[deprecated(note = "use `Pallet` instead")]850 #[allow(dead_code)]851 pub type Module<T> = Pallet<T>;852 impl<T: Config> frame_support::traits::GetStorageVersion for Pallet<T> {853 fn current_storage_version() -> frame_support::traits::StorageVersion {854 frame_support::traits::StorageVersion::default()855 }856 fn on_chain_storage_version() -> frame_support::traits::StorageVersion {857 frame_support::traits::StorageVersion::get::<Self>()858 }859 }860 impl<T: Config> frame_support::traits::OnGenesis for Pallet<T> {861 fn on_genesis() {862 let storage_version = frame_support::traits::StorageVersion::default();863 storage_version.put::<Self>();864 }865 }866 impl<T: Config> frame_support::traits::PalletInfoAccess for Pallet<T> {867 fn index() -> usize {868 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::index::<869 Self,870 >()871 .expect(872 "Pallet is part of the runtime because pallet `Config` trait is \873 implemented by the runtime",874 )875 }876 fn name() -> &'static str {877 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<878 Self,879 >()880 .expect(881 "Pallet is part of the runtime because pallet `Config` trait is \882 implemented by the runtime",883 )884 }885 fn module_name() -> &'static str {886 < < T as frame_system :: Config > :: PalletInfo as frame_support :: traits :: PalletInfo > :: module_name :: < Self > () . expect ("Pallet is part of the runtime because pallet `Config` trait is \887 implemented by the runtime")888 }889 fn crate_version() -> frame_support::traits::CrateVersion {890 frame_support::traits::CrateVersion {891 major: 0u16,892 minor: 1u8,893 patch: 0u8,894 }895 }896 }897 impl<T: Config> frame_support::traits::StorageInfoTrait for Pallet<T> {898 fn storage_info() -> frame_support::sp_std::vec::Vec<frame_support::traits::StorageInfo> {899 #[allow(unused_mut)]900 let mut res = ::alloc::vec::Vec::new();901 {902 let mut storage_info = < Owner < T > as frame_support :: traits :: PartialStorageInfoTrait > :: partial_storage_info () ;903 res.append(&mut storage_info);904 }905 {906 let mut storage_info = < SelfSponsoring < T > as frame_support :: traits :: PartialStorageInfoTrait > :: partial_storage_info () ;907 res.append(&mut storage_info);908 }909 {910 let mut storage_info = < SponsoringRateLimit < T > as frame_support :: traits :: PartialStorageInfoTrait > :: partial_storage_info () ;911 res.append(&mut storage_info);912 }913 {914 let mut storage_info = < SponsorBasket < T > as frame_support :: traits :: PartialStorageInfoTrait > :: partial_storage_info () ;915 res.append(&mut storage_info);916 }917 {918 let mut storage_info = < AllowlistEnabled < T > as frame_support :: traits :: PartialStorageInfoTrait > :: partial_storage_info () ;919 res.append(&mut storage_info);920 }921 {922 let mut storage_info = < Allowlist < T > as frame_support :: traits :: PartialStorageInfoTrait > :: partial_storage_info () ;923 res.append(&mut storage_info);924 }925 res926 }927 }928 #[doc(hidden)]929 pub mod __substrate_call_check {930 #[doc(hidden)]931 pub use __is_call_part_defined_0 as is_call_part_defined;932 }933 #[doc = r"Contains one variant per dispatchable that can be called by an extrinsic."]934 #[codec(encode_bound())]935 #[codec(decode_bound())]936 #[scale_info(skip_type_params(T), capture_docs = "always")]937 #[allow(non_camel_case_types)]938 pub enum Call<T: Config> {939 #[doc(hidden)]940 #[codec(skip)]941 __Ignore(942 frame_support::sp_std::marker::PhantomData<(T,)>,943 frame_support::Never,944 ),945 }946 const _: () = {947 impl<T: Config> core::fmt::Debug for Call<T> {948 fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {949 match *self {950 Self::__Ignore(ref _0, ref _1) => fmt951 .debug_tuple("Call::__Ignore")952 .field(&_0)953 .field(&_1)954 .finish(),955 }956 }957 }958 };959 const _: () = {960 impl<T: Config> core::clone::Clone for Call<T> {961 fn clone(&self) -> Self {962 match self {963 Self::__Ignore(ref _0, ref _1) => {964 Self::__Ignore(core::clone::Clone::clone(_0), core::clone::Clone::clone(_1))965 }966 }967 }968 }969 };970 const _: () = {971 impl<T: Config> core::cmp::Eq for Call<T> {}972 };973 const _: () = {974 impl<T: Config> core::cmp::PartialEq for Call<T> {975 fn eq(&self, other: &Self) -> bool {976 match (self, other) {977 (Self::__Ignore(_0, _1), Self::__Ignore(_0_other, _1_other)) => {978 true && _0 == _0_other && _1 == _1_other979 }980 }981 }982 }983 };984 const _: () = {985 #[allow(non_camel_case_types)]986 impl<T: Config> ::codec::Encode for Call<T> {}987 impl<T: Config> ::codec::EncodeLike for Call<T> {}988 };989 const _: () = {990 #[allow(non_camel_case_types)]991 impl<T: Config> ::codec::Decode for Call<T> {992 fn decode<__CodecInputEdqy: ::codec::Input>(993 __codec_input_edqy: &mut __CodecInputEdqy,994 ) -> ::core::result::Result<Self, ::codec::Error> {995 match __codec_input_edqy996 .read_byte()997 .map_err(|e| e.chain("Could not decode `Call`, failed to read variant byte"))?998 {999 _ => ::core::result::Result::Err(<_ as ::core::convert::Into<_>>::into(1000 "Could not decode `Call`, variant doesn\'t exist",1001 )),1002 }1003 }1004 }1005 };1006 #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]1007 const _: () = {1008 impl<T: Config> ::scale_info::TypeInfo for Call<T>1009 where1010 frame_support::sp_std::marker::PhantomData<(T,)>: ::scale_info::TypeInfo + 'static,1011 T: Config + 'static,1012 {1013 type Identity = Self;1014 fn type_info() -> ::scale_info::Type {1015 ::scale_info::Type::builder()1016 .path(::scale_info::Path::new(1017 "Call",1018 "pallet_evm_contract_helpers::pallet",1019 ))1020 .type_params(<[_]>::into_vec(box [::scale_info::TypeParameter::new(1021 "T",1022 ::core::option::Option::None,1023 )]))1024 .docs_always(&[1025 "Contains one variant per dispatchable that can be called by an extrinsic.",1026 ])1027 .variant(::scale_info::build::Variants::new())1028 }1029 };1030 };1031 impl<T: Config> Call<T> {}1032 impl<T: Config> frame_support::dispatch::GetDispatchInfo for Call<T> {1033 fn get_dispatch_info(&self) -> frame_support::dispatch::DispatchInfo {1034 match *self {1035 Self::__Ignore(_, _) => {1036 ::core::panicking::panic_fmt(::core::fmt::Arguments::new_v1(1037 &["internal error: entered unreachable code: "],1038 &match (&"__Ignore cannot be used",) {1039 (arg0,) => [::core::fmt::ArgumentV1::new(1040 arg0,1041 ::core::fmt::Display::fmt,1042 )],1043 },1044 ))1045 }1046 }1047 }1048 }1049 impl<T: Config> frame_support::dispatch::GetCallName for Call<T> {1050 fn get_call_name(&self) -> &'static str {1051 match *self {1052 Self::__Ignore(_, _) => {1053 ::core::panicking::panic_fmt(::core::fmt::Arguments::new_v1(1054 &["internal error: entered unreachable code: "],1055 &match (&"__PhantomItem cannot be used.",) {1056 (arg0,) => [::core::fmt::ArgumentV1::new(1057 arg0,1058 ::core::fmt::Display::fmt,1059 )],1060 },1061 ))1062 }1063 }1064 }1065 fn get_call_names() -> &'static [&'static str] {1066 &[]1067 }1068 }1069 impl<T: Config> frame_support::traits::UnfilteredDispatchable for Call<T> {1070 type Origin = frame_system::pallet_prelude::OriginFor<T>;1071 fn dispatch_bypass_filter(1072 self,1073 origin: Self::Origin,1074 ) -> frame_support::dispatch::DispatchResultWithPostInfo {1075 match self {1076 Self::__Ignore(_, _) => {1077 let _ = origin;1078 {1079 {1080 ::core::panicking::panic_fmt(::core::fmt::Arguments::new_v1(1081 &["internal error: entered unreachable code: "],1082 &match (&"__PhantomItem cannot be used.",) {1083 (arg0,) => [::core::fmt::ArgumentV1::new(1084 arg0,1085 ::core::fmt::Display::fmt,1086 )],1087 },1088 ))1089 }1090 };1091 }1092 }1093 }1094 }1095 impl<T: Config> frame_support::dispatch::Callable<T> for Pallet<T> {1096 type Call = Call<T>;1097 }1098 impl<T: Config> Pallet<T> {1099 #[doc(hidden)]1100 pub fn call_functions() -> frame_support::metadata::PalletCallMetadata {1101 frame_support::scale_info::meta_type::<Call<T>>().into()1102 }1103 }1104 impl<T: Config> frame_support::sp_std::fmt::Debug for Error<T> {1105 fn fmt(1106 &self,1107 f: &mut frame_support::sp_std::fmt::Formatter<'_>,1108 ) -> frame_support::sp_std::fmt::Result {1109 f.write_str(self.as_str())1110 }1111 }1112 impl<T: Config> Error<T> {1113 pub fn as_u8(&self) -> u8 {1114 match &self {1115 Self::__Ignore(_, _) => {1116 ::core::panicking::panic_fmt(::core::fmt::Arguments::new_v1(1117 &["internal error: entered unreachable code: "],1118 &match (&"`__Ignore` can never be constructed",) {1119 (arg0,) => [::core::fmt::ArgumentV1::new(1120 arg0,1121 ::core::fmt::Display::fmt,1122 )],1123 },1124 ))1125 }1126 Self::NoPermission => 0usize as u8,1127 }1128 }1129 pub fn as_str(&self) -> &'static str {1130 match &self {1131 Self::__Ignore(_, _) => {1132 ::core::panicking::panic_fmt(::core::fmt::Arguments::new_v1(1133 &["internal error: entered unreachable code: "],1134 &match (&"`__Ignore` can never be constructed",) {1135 (arg0,) => [::core::fmt::ArgumentV1::new(1136 arg0,1137 ::core::fmt::Display::fmt,1138 )],1139 },1140 ))1141 }1142 Self::NoPermission => "NoPermission",1143 }1144 }1145 }1146 impl<T: Config> From<Error<T>> for &'static str {1147 fn from(err: Error<T>) -> &'static str {1148 err.as_str()1149 }1150 }1151 impl<T: Config> From<Error<T>> for frame_support::sp_runtime::DispatchError {1152 fn from(err: Error<T>) -> Self {1153 let index = < < T as frame_system :: Config > :: PalletInfo as frame_support :: traits :: PalletInfo > :: index :: < Pallet < T > > () . expect ("Every active module has an index in the runtime; qed") as u8 ;1154 frame_support::sp_runtime::DispatchError::Module {1155 index,1156 error: err.as_u8(),1157 message: Some(err.as_str()),1158 }1159 }1160 }1161 #[doc(hidden)]1162 pub mod __substrate_event_check {1163 #[doc(hidden)]1164 pub use __is_event_part_defined_1 as is_event_part_defined;1165 }1166 impl<T: Config> Pallet<T> {1167 #[doc(hidden)]1168 pub fn storage_metadata() -> frame_support::metadata::PalletStorageMetadata {1169 frame_support :: metadata :: PalletStorageMetadata { prefix : < < T as frame_system :: Config > :: PalletInfo as frame_support :: traits :: PalletInfo > :: name :: < Pallet < T > > () . expect ("Every active pallet has a name in the runtime; qed") , entries : { # [allow (unused_mut)] let mut entries = :: alloc :: vec :: Vec :: new () ; { < Owner < T > as frame_support :: storage :: StorageEntryMetadataBuilder > :: build_metadata (:: alloc :: vec :: Vec :: new () , & mut entries) ; } { < SelfSponsoring < T > as frame_support :: storage :: StorageEntryMetadataBuilder > :: build_metadata (:: alloc :: vec :: Vec :: new () , & mut entries) ; } { < SponsoringRateLimit < T > as frame_support :: storage :: StorageEntryMetadataBuilder > :: build_metadata (:: alloc :: vec :: Vec :: new () , & mut entries) ; } { < SponsorBasket < T > as frame_support :: storage :: StorageEntryMetadataBuilder > :: build_metadata (:: alloc :: vec :: Vec :: new () , & mut entries) ; } { < AllowlistEnabled < T > as frame_support :: storage :: StorageEntryMetadataBuilder > :: build_metadata (:: alloc :: vec :: Vec :: new () , & mut entries) ; } { < Allowlist < T > as frame_support :: storage :: StorageEntryMetadataBuilder > :: build_metadata (:: alloc :: vec :: Vec :: new () , & mut entries) ; } entries } , }1170 }1171 }1172 pub(super) struct _GeneratedPrefixForStorageOwner<T>(core::marker::PhantomData<(T,)>);1173 impl<T: Config> frame_support::traits::StorageInstance for _GeneratedPrefixForStorageOwner<T> {1174 fn pallet_prefix() -> &'static str {1175 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<1176 Pallet<T>,1177 >()1178 .expect("Every active pallet has a name in the runtime; qed")1179 }1180 const STORAGE_PREFIX: &'static str = "Owner";1181 }1182 pub(super) struct _GeneratedPrefixForStorageSelfSponsoring<T>(core::marker::PhantomData<(T,)>);1183 impl<T: Config> frame_support::traits::StorageInstance1184 for _GeneratedPrefixForStorageSelfSponsoring<T>1185 {1186 fn pallet_prefix() -> &'static str {1187 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<1188 Pallet<T>,1189 >()1190 .expect("Every active pallet has a name in the runtime; qed")1191 }1192 const STORAGE_PREFIX: &'static str = "SelfSponsoring";1193 }1194 pub(super) struct _GeneratedPrefixForStorageSponsoringRateLimit<T>(1195 core::marker::PhantomData<(T,)>,1196 );1197 impl<T: Config> frame_support::traits::StorageInstance1198 for _GeneratedPrefixForStorageSponsoringRateLimit<T>1199 {1200 fn pallet_prefix() -> &'static str {1201 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<1202 Pallet<T>,1203 >()1204 .expect("Every active pallet has a name in the runtime; qed")1205 }1206 const STORAGE_PREFIX: &'static str = "SponsoringRateLimit";1207 }1208 pub(super) struct _GeneratedPrefixForStorageSponsorBasket<T>(core::marker::PhantomData<(T,)>);1209 impl<T: Config> frame_support::traits::StorageInstance1210 for _GeneratedPrefixForStorageSponsorBasket<T>1211 {1212 fn pallet_prefix() -> &'static str {1213 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<1214 Pallet<T>,1215 >()1216 .expect("Every active pallet has a name in the runtime; qed")1217 }1218 const STORAGE_PREFIX: &'static str = "SponsorBasket";1219 }1220 pub(super) struct _GeneratedPrefixForStorageAllowlistEnabled<T>(1221 core::marker::PhantomData<(T,)>,1222 );1223 impl<T: Config> frame_support::traits::StorageInstance1224 for _GeneratedPrefixForStorageAllowlistEnabled<T>1225 {1226 fn pallet_prefix() -> &'static str {1227 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<1228 Pallet<T>,1229 >()1230 .expect("Every active pallet has a name in the runtime; qed")1231 }1232 const STORAGE_PREFIX: &'static str = "AllowlistEnabled";1233 }1234 pub(super) struct _GeneratedPrefixForStorageAllowlist<T>(core::marker::PhantomData<(T,)>);1235 impl<T: Config> frame_support::traits::StorageInstance for _GeneratedPrefixForStorageAllowlist<T> {1236 fn pallet_prefix() -> &'static str {1237 <<T as frame_system::Config>::PalletInfo as frame_support::traits::PalletInfo>::name::<1238 Pallet<T>,1239 >()1240 .expect("Every active pallet has a name in the runtime; qed")1241 }1242 const STORAGE_PREFIX: &'static str = "Allowlist";1243 }1244 #[doc(hidden)]1245 pub mod __substrate_inherent_check {1246 #[doc(hidden)]1247 pub use __is_inherent_part_defined_2 as is_inherent_part_defined;1248 }1249 #[doc = r" Hidden instance generated to be internally used when module is used without"]1250 #[doc = r" instance."]1251 #[doc(hidden)]1252 pub type __InherentHiddenInstance = ();1253 pub(super) trait Store {1254 type Owner;1255 type SelfSponsoring;1256 type SponsoringRateLimit;1257 type SponsorBasket;1258 type AllowlistEnabled;1259 type Allowlist;1260 }1261 impl<T: Config> Store for Pallet<T> {1262 type Owner = Owner<T>;1263 type SelfSponsoring = SelfSponsoring<T>;1264 type SponsoringRateLimit = SponsoringRateLimit<T>;1265 type SponsorBasket = SponsorBasket<T>;1266 type AllowlistEnabled = AllowlistEnabled<T>;1267 type Allowlist = Allowlist<T>;1268 }1269 impl<T: Config> frame_support::traits::Hooks<<T as frame_system::Config>::BlockNumber>1270 for Pallet<T>1271 {1272 }1273 impl<T: Config> frame_support::traits::OnFinalize<<T as frame_system::Config>::BlockNumber>1274 for Pallet<T>1275 {1276 fn on_finalize(n: <T as frame_system::Config>::BlockNumber) {1277 let __within_span__ = {1278 use ::tracing::__macro_support::Callsite as _;1279 static CALLSITE: ::tracing::__macro_support::MacroCallsite = {1280 use ::tracing::__macro_support::MacroCallsite;1281 static META: ::tracing::Metadata<'static> = {1282 ::tracing_core::metadata::Metadata::new(1283 "on_finalize",1284 "pallet_evm_contract_helpers::pallet",1285 ::tracing::Level::TRACE,1286 Some("pallets/evm-contract-helpers/src/lib.rs"),1287 Some(7u32),1288 Some("pallet_evm_contract_helpers::pallet"),1289 ::tracing_core::field::FieldSet::new(1290 &[],1291 ::tracing_core::callsite::Identifier(&CALLSITE),1292 ),1293 ::tracing::metadata::Kind::SPAN,1294 )1295 };1296 MacroCallsite::new(&META)1297 };1298 let mut interest = ::tracing::subscriber::Interest::never();1299 if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL1300 && ::tracing::Level::TRACE <= ::tracing::level_filters::LevelFilter::current()1301 && {1302 interest = CALLSITE.interest();1303 !interest.is_never()1304 }1305 && CALLSITE.is_enabled(interest)1306 {1307 let meta = CALLSITE.metadata();1308 ::tracing::Span::new(meta, &{ meta.fields().value_set(&[]) })1309 } else {1310 let span = CALLSITE.disabled_span();1311 {};1312 span1313 }1314 };1315 let __tracing_guard__ = __within_span__.enter();1316 < Self as frame_support :: traits :: Hooks < < T as frame_system :: Config > :: BlockNumber > > :: on_finalize (n)1317 }1318 }1319 impl<T: Config> frame_support::traits::OnIdle<<T as frame_system::Config>::BlockNumber>1320 for Pallet<T>1321 {1322 fn on_idle(1323 n: <T as frame_system::Config>::BlockNumber,1324 remaining_weight: frame_support::weights::Weight,1325 ) -> frame_support::weights::Weight {1326 < Self as frame_support :: traits :: Hooks < < T as frame_system :: Config > :: BlockNumber > > :: on_idle (n , remaining_weight)1327 }1328 }1329 impl<T: Config> frame_support::traits::OnInitialize<<T as frame_system::Config>::BlockNumber>1330 for Pallet<T>1331 {1332 fn on_initialize(1333 n: <T as frame_system::Config>::BlockNumber,1334 ) -> frame_support::weights::Weight {1335 let __within_span__ = {1336 use ::tracing::__macro_support::Callsite as _;1337 static CALLSITE: ::tracing::__macro_support::MacroCallsite = {1338 use ::tracing::__macro_support::MacroCallsite;1339 static META: ::tracing::Metadata<'static> = {1340 ::tracing_core::metadata::Metadata::new(1341 "on_initialize",1342 "pallet_evm_contract_helpers::pallet",1343 ::tracing::Level::TRACE,1344 Some("pallets/evm-contract-helpers/src/lib.rs"),1345 Some(7u32),1346 Some("pallet_evm_contract_helpers::pallet"),1347 ::tracing_core::field::FieldSet::new(1348 &[],1349 ::tracing_core::callsite::Identifier(&CALLSITE),1350 ),1351 ::tracing::metadata::Kind::SPAN,1352 )1353 };1354 MacroCallsite::new(&META)1355 };1356 let mut interest = ::tracing::subscriber::Interest::never();1357 if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL1358 && ::tracing::Level::TRACE <= ::tracing::level_filters::LevelFilter::current()1359 && {1360 interest = CALLSITE.interest();1361 !interest.is_never()1362 }1363 && CALLSITE.is_enabled(interest)1364 {1365 let meta = CALLSITE.metadata();1366 ::tracing::Span::new(meta, &{ meta.fields().value_set(&[]) })1367 } else {1368 let span = CALLSITE.disabled_span();1369 {};1370 span1371 }1372 };1373 let __tracing_guard__ = __within_span__.enter();1374 < Self as frame_support :: traits :: Hooks < < T as frame_system :: Config > :: BlockNumber > > :: on_initialize (n)1375 }1376 }1377 impl<T: Config> frame_support::traits::OnRuntimeUpgrade for Pallet<T> {1378 fn on_runtime_upgrade() -> frame_support::weights::Weight {1379 let __within_span__ = {1380 use ::tracing::__macro_support::Callsite as _;1381 static CALLSITE: ::tracing::__macro_support::MacroCallsite = {1382 use ::tracing::__macro_support::MacroCallsite;1383 static META: ::tracing::Metadata<'static> = {1384 ::tracing_core::metadata::Metadata::new(1385 "on_runtime_update",1386 "pallet_evm_contract_helpers::pallet",1387 ::tracing::Level::TRACE,1388 Some("pallets/evm-contract-helpers/src/lib.rs"),1389 Some(7u32),1390 Some("pallet_evm_contract_helpers::pallet"),1391 ::tracing_core::field::FieldSet::new(1392 &[],1393 ::tracing_core::callsite::Identifier(&CALLSITE),1394 ),1395 ::tracing::metadata::Kind::SPAN,1396 )1397 };1398 MacroCallsite::new(&META)1399 };1400 let mut interest = ::tracing::subscriber::Interest::never();1401 if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL1402 && ::tracing::Level::TRACE <= ::tracing::level_filters::LevelFilter::current()1403 && {1404 interest = CALLSITE.interest();1405 !interest.is_never()1406 }1407 && CALLSITE.is_enabled(interest)1408 {1409 let meta = CALLSITE.metadata();1410 ::tracing::Span::new(meta, &{ meta.fields().value_set(&[]) })1411 } else {1412 let span = CALLSITE.disabled_span();1413 {};1414 span1415 }1416 };1417 let __tracing_guard__ = __within_span__.enter();1418 let pallet_name = < < T as frame_system :: Config > :: PalletInfo as frame_support :: traits :: PalletInfo > :: name :: < Self > () . unwrap_or ("<unknown pallet name>") ;1419 {1420 let lvl = ::log::Level::Info;1421 if lvl <= ::log::STATIC_MAX_LEVEL && lvl <= ::log::max_level() {1422 ::log::__private_api_log(1423 ::core::fmt::Arguments::new_v1(1424 &["\u{2705} no migration for "],1425 &match (&pallet_name,) {1426 (arg0,) => [::core::fmt::ArgumentV1::new(1427 arg0,1428 ::core::fmt::Display::fmt,1429 )],1430 },1431 ),1432 lvl,1433 &(1434 frame_support::LOG_TARGET,1435 "pallet_evm_contract_helpers::pallet",1436 "pallets/evm-contract-helpers/src/lib.rs",1437 7u32,1438 ),1439 );1440 }1441 };1442 < Self as frame_support :: traits :: Hooks < < T as frame_system :: Config > :: BlockNumber > > :: on_runtime_upgrade ()1443 }1444 }1445 impl<T: Config> frame_support::traits::OffchainWorker<<T as frame_system::Config>::BlockNumber>1446 for Pallet<T>1447 {1448 fn offchain_worker(n: <T as frame_system::Config>::BlockNumber) {1449 < Self as frame_support :: traits :: Hooks < < T as frame_system :: Config > :: BlockNumber > > :: offchain_worker (n)1450 }1451 }1452 impl<T: Config> frame_support::traits::IntegrityTest for Pallet<T> {1453 fn integrity_test() {1454 < Self as frame_support :: traits :: Hooks < < T as frame_system :: Config > :: BlockNumber > > :: integrity_test ()1455 }1456 }1457 #[doc(hidden)]1458 pub mod __substrate_genesis_config_check {1459 #[doc(hidden)]1460 pub use __is_genesis_config_defined_3 as is_genesis_config_defined;1461 #[doc(hidden)]1462 pub use __is_std_enabled_for_genesis_3 as is_std_enabled_for_genesis;1463 }1464 #[doc(hidden)]1465 pub mod __substrate_origin_check {1466 #[doc(hidden)]1467 pub use __is_origin_part_defined_4 as is_origin_part_defined;1468 }1469 #[doc(hidden)]1470 pub mod __substrate_validate_unsigned_check {1471 #[doc(hidden)]1472 pub use __is_validate_unsigned_part_defined_5 as is_validate_unsigned_part_defined;1473 }1474}