difftreelog
refac: rename string -> String
in: master
16 files changed
crates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/solidity_interface.rs
+++ b/crates/evm-coder/procedural/src/solidity_interface.rs
@@ -999,7 +999,7 @@
)*),
};
- let mut out = ::evm_coder::types::string::new();
+ let mut out = ::evm_coder::types::String::new();
if #solidity_name.starts_with("Inline") {
out.push_str("/// @dev inlined interface\n");
}
crates/evm-coder/procedural/src/to_log.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/to_log.rs
+++ b/crates/evm-coder/procedural/src/to_log.rs
@@ -222,7 +222,7 @@
#solidity_functions,
)*),
};
- let mut out = string::new();
+ let mut out = ::evm_coder::types::String::new();
out.push_str("/// @dev inlined interface\n");
let _ = interface.format(is_impl, &mut out, tc);
tc.collect(out);
crates/evm-coder/src/abi/impls.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/impls.rs
+++ b/crates/evm-coder/src/abi/impls.rs
@@ -63,7 +63,7 @@
impl_abi!(u128, uint128, false);
impl_abi!(U256, uint256, false);
impl_abi!(H160, address, false);
-impl_abi!(string, string, true);
+impl_abi!(String, string, true);
impl_abi_writeable!(&str, string);
crates/evm-coder/src/abi/mod.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/mod.rs
+++ b/crates/evm-coder/src/abi/mod.rs
@@ -148,8 +148,8 @@
}
/// Read [`string`] at current position, then advance
- pub fn string(&mut self) -> Result<string> {
- string::from_utf8(self.bytes()?).map_err(|_| Error::Error(ExitError::InvalidRange))
+ pub fn string(&mut self) -> Result<String> {
+ String::from_utf8(self.bytes()?).map_err(|_| Error::Error(ExitError::InvalidRange))
}
/// Read [`u8`] at current position, then advance
crates/evm-coder/src/abi/test.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/test.rs
+++ b/crates/evm-coder/src/abi/test.rs
@@ -138,7 +138,7 @@
#[test]
fn encode_decode_vec_tuple_uint256_string() {
- test_impl::<Vec<(U256, string)>>(
+ test_impl::<Vec<(U256, String)>>(
0xdeadbeef,
vec![
(1.into(), "Test URI 0".to_string()),
@@ -261,7 +261,7 @@
let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();
assert_eq!(call, u32::to_be_bytes(decoded_data.0));
let address = decoder.address().unwrap();
- let data = <Vec<(U256, string)>>::abi_read(&mut decoder).unwrap();
+ let data = <Vec<(U256, String)>>::abi_read(&mut decoder).unwrap();
assert_eq!(data, decoded_data.1);
let mut writer = AbiWriter::new_call(decoded_data.0);
@@ -273,7 +273,7 @@
#[test]
fn encode_decode_vec_tuple_string_bytes() {
- test_impl::<Vec<(string, bytes)>>(
+ test_impl::<Vec<(String, bytes)>>(
0xdeadbeef,
vec![
(
crates/evm-coder/src/lib.rsdiffbeforeafterboth--- a/crates/evm-coder/src/lib.rs
+++ b/crates/evm-coder/src/lib.rs
@@ -136,9 +136,9 @@
pub type Topic = H256;
#[cfg(not(feature = "std"))]
- pub type string = ::alloc::string::String;
+ pub type String = ::alloc::string::String;
#[cfg(feature = "std")]
- pub type string = ::std::string::String;
+ pub type String = ::std::string::String;
#[derive(Default, Debug, PartialEq, Eq, Clone)]
pub struct bytes(pub Vec<u8>);
crates/evm-coder/src/solidity/impls.rsdiffbeforeafterboth--- a/crates/evm-coder/src/solidity/impls.rs
+++ b/crates/evm-coder/src/solidity/impls.rs
@@ -29,7 +29,7 @@
U256 => "uint256" true = "0",
Bytes4 => "bytes4" true = "bytes4(0)",
H160 => "address" true = "0x0000000000000000000000000000000000000000",
- string => "string" false = "\"\"",
+ String => "string" false = "\"\"",
bytes => "bytes" false = "hex\"\"",
bool => "bool" true = "false",
}
@@ -72,10 +72,10 @@
macro_rules! impl_tuples {
($($ident:ident)+) => {
impl<$($ident: SolidityTypeName + 'static),+> SolidityTupleTy for ($($ident,)+) {
- fn fields(tc: &TypeCollector) -> Vec<string> {
+ fn fields(tc: &TypeCollector) -> Vec<String> {
let mut collected = Vec::with_capacity(Self::len());
$({
- let mut out = string::new();
+ let mut out = String::new();
$ident::solidity_name(&mut out, tc).expect("no fmt error");
collected.push(out);
})*;
crates/evm-coder/src/solidity/mod.rsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617//! Implementation detail of [`crate::solidity_interface`] macro code-generation.18//! You should not rely on any public item from this module, as it is only intended to be used19//! by procedural macro, API and output format may be changed at any time.20//!21//! Purpose of this module is to receive solidity contract definition in module-specified22//! format, and then output string, representing interface of this contract in solidity language2324mod traits;25pub use traits::*;26mod impls;2728#[cfg(not(feature = "std"))]29use alloc::{string::String, vec::Vec, collections::BTreeMap, format};30#[cfg(feature = "std")]31use std::collections::BTreeMap;32use core::{33 fmt::{self, Write},34 marker::PhantomData,35 cell::{Cell, RefCell},36 cmp::Reverse,37};38use impl_trait_for_tuples::impl_for_tuples;39use crate::{types::*, custom_signature::SignatureUnit};4041#[derive(Default)]42pub struct TypeCollector {43 /// Code => id44 /// id ordering is required to perform topo-sort on the resulting data45 structs: RefCell<BTreeMap<string, usize>>,46 anonymous: RefCell<BTreeMap<Vec<string>, usize>>,47 // generic: RefCell<BTreeMap<string, usize>>,48 id: Cell<usize>,49}50impl TypeCollector {51 pub fn new() -> Self {52 Self::default()53 }54 pub fn collect(&self, item: string) {55 let id = self.next_id();56 self.structs.borrow_mut().insert(item, id);57 }58 pub fn next_id(&self) -> usize {59 let v = self.id.get();60 self.id.set(v + 1);61 v62 }63 /// Collect typle, deduplicating it by type, and returning generated name64 pub fn collect_tuple<T: SolidityTupleTy>(&self) -> String {65 let names = T::fields(self);66 if let Some(id) = self.anonymous.borrow().get(&names).cloned() {67 return format!("Tuple{}", id);68 }69 let id = self.next_id();70 let mut str = String::new();71 writeln!(str, "/// @dev anonymous struct").unwrap();72 writeln!(str, "struct Tuple{} {{", id).unwrap();73 for (i, name) in names.iter().enumerate() {74 writeln!(str, "\t{} field_{};", name, i).unwrap();75 }76 writeln!(str, "}}").unwrap();77 self.collect(str);78 self.anonymous.borrow_mut().insert(names, id);79 format!("Tuple{}", id)80 }81 pub fn collect_struct<T: SolidityStructTy>(&self) -> String {82 T::generate_solidity_interface(self)83 }84 pub fn collect_enum<T: SolidityEnumTy>(&self) -> String {85 T::generate_solidity_interface(self)86 }87 pub fn finish(self) -> Vec<string> {88 let mut data = self.structs.into_inner().into_iter().collect::<Vec<_>>();89 data.sort_by_key(|(_, id)| Reverse(*id));90 data.into_iter().map(|(code, _)| code).collect()91 }92}93#[derive(Default)]94pub struct UnnamedArgument<T>(PhantomData<*const T>);9596impl<T: SolidityTypeName> SolidityArguments for UnnamedArgument<T> {97 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {98 if !T::is_void() {99 T::solidity_name(writer, tc)?;100 if !T::is_simple() {101 write!(writer, " memory")?;102 }103 Ok(())104 } else {105 Ok(())106 }107 }108 fn solidity_get(&self, _prefix: &str, _writer: &mut impl fmt::Write) -> fmt::Result {109 Ok(())110 }111 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {112 T::solidity_default(writer, tc)113 }114 fn len(&self) -> usize {115 if T::is_void() {116 0117 } else {118 1119 }120 }121}122123pub struct NamedArgument<T>(&'static str, PhantomData<*const T>);124125impl<T> NamedArgument<T> {126 pub fn new(name: &'static str) -> Self {127 Self(name, Default::default())128 }129}130131impl<T: SolidityTypeName> SolidityArguments for NamedArgument<T> {132 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {133 if !T::is_void() {134 T::solidity_name(writer, tc)?;135 if !T::is_simple() {136 write!(writer, " memory")?;137 }138 write!(writer, " {}", self.0)139 } else {140 Ok(())141 }142 }143 fn solidity_get(&self, prefix: &str, writer: &mut impl fmt::Write) -> fmt::Result {144 writeln!(writer, "\t{prefix}\t{};", self.0)145 }146 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {147 T::solidity_default(writer, tc)148 }149 fn len(&self) -> usize {150 if T::is_void() {151 0152 } else {153 1154 }155 }156}157158pub struct SolidityEventArgument<T>(pub bool, &'static str, PhantomData<*const T>);159160impl<T> SolidityEventArgument<T> {161 pub fn new(indexed: bool, name: &'static str) -> Self {162 Self(indexed, name, Default::default())163 }164}165166impl<T: SolidityTypeName> SolidityArguments for SolidityEventArgument<T> {167 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {168 if !T::is_void() {169 T::solidity_name(writer, tc)?;170 if self.0 {171 write!(writer, " indexed")?;172 }173 write!(writer, " {}", self.1)174 } else {175 Ok(())176 }177 }178 fn solidity_get(&self, prefix: &str, writer: &mut impl fmt::Write) -> fmt::Result {179 writeln!(writer, "\t{prefix}\t{};", self.1)180 }181 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {182 T::solidity_default(writer, tc)183 }184 fn len(&self) -> usize {185 if T::is_void() {186 0187 } else {188 1189 }190 }191}192193impl SolidityArguments for () {194 fn solidity_name(&self, _writer: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {195 Ok(())196 }197 fn solidity_get(&self, _prefix: &str, _writer: &mut impl fmt::Write) -> fmt::Result {198 Ok(())199 }200 fn solidity_default(&self, _writer: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {201 Ok(())202 }203 fn len(&self) -> usize {204 0205 }206}207208#[impl_for_tuples(1, 12)]209impl SolidityArguments for Tuple {210 for_tuples!( where #( Tuple: SolidityArguments ),* );211212 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {213 let mut first = true;214 for_tuples!( #(215 if !Tuple.is_empty() {216 if !first {217 write!(writer, ", ")?;218 }219 first = false;220 Tuple.solidity_name(writer, tc)?;221 }222 )* );223 Ok(())224 }225 fn solidity_get(&self, prefix: &str, writer: &mut impl fmt::Write) -> fmt::Result {226 for_tuples!( #(227 Tuple.solidity_get(prefix, writer)?;228 )* );229 Ok(())230 }231 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {232 if self.is_empty() {233 Ok(())234 } else if self.len() == 1 {235 for_tuples!( #(236 Tuple.solidity_default(writer, tc)?;237 )* );238 Ok(())239 } else {240 write!(writer, "(")?;241 let mut first = true;242 for_tuples!( #(243 if !Tuple.is_empty() {244 if !first {245 write!(writer, ", ")?;246 }247 first = false;248 Tuple.solidity_default(writer, tc)?;249 }250 )* );251 write!(writer, ")")?;252 Ok(())253 }254 }255 fn len(&self) -> usize {256 for_tuples!( #( Tuple.len() )+* )257 }258}259260pub enum SolidityMutability {261 Pure,262 View,263 Mutable,264}265pub struct SolidityFunction<A, R> {266 pub docs: &'static [&'static str],267 pub selector: u32,268 pub hide: bool,269 pub custom_signature: SignatureUnit,270 pub name: &'static str,271 pub args: A,272 pub result: R,273 pub mutability: SolidityMutability,274 pub is_payable: bool,275}276impl<A: SolidityArguments, R: SolidityArguments> SolidityFunctions for SolidityFunction<A, R> {277 fn solidity_name(278 &self,279 is_impl: bool,280 writer: &mut impl fmt::Write,281 tc: &TypeCollector,282 ) -> fmt::Result {283 let hide_comment = self.hide.then_some("// ").unwrap_or("");284 for doc in self.docs {285 writeln!(writer, "\t{hide_comment}///{}", doc)?;286 }287 writeln!(288 writer,289 "\t{hide_comment}/// @dev EVM selector for this function is: 0x{:0>8x},",290 self.selector291 )?;292 writeln!(293 writer,294 "\t{hide_comment}/// or in textual repr: {}",295 self.custom_signature.as_str().expect("bad utf-8")296 )?;297 write!(writer, "\t{hide_comment}function {}(", self.name)?;298 self.args.solidity_name(writer, tc)?;299 write!(writer, ")")?;300 if is_impl {301 write!(writer, " public")?;302 } else {303 write!(writer, " external")?;304 }305 match &self.mutability {306 SolidityMutability::Pure => write!(writer, " pure")?,307 SolidityMutability::View => write!(writer, " view")?,308 SolidityMutability::Mutable => {}309 }310 if self.is_payable {311 write!(writer, " payable")?;312 }313 if !self.result.is_empty() {314 write!(writer, " returns (")?;315 self.result.solidity_name(writer, tc)?;316 write!(writer, ")")?;317 }318 if is_impl {319 writeln!(writer, " {{")?;320 writeln!(writer, "\t{hide_comment}\trequire(false, stub_error);")?;321 self.args.solidity_get(hide_comment, writer)?;322 match &self.mutability {323 SolidityMutability::Pure => {}324 SolidityMutability::View => writeln!(writer, "\t{hide_comment}\tdummy;")?,325 SolidityMutability::Mutable => writeln!(writer, "\t{hide_comment}\tdummy = 0;")?,326 }327 if !self.result.is_empty() {328 write!(writer, "\t{hide_comment}\treturn ")?;329 self.result.solidity_default(writer, tc)?;330 writeln!(writer, ";")?;331 }332 writeln!(writer, "\t{hide_comment}}}")?;333 } else {334 writeln!(writer, ";")?;335 }336 if self.hide {337 writeln!(writer, "// FORMATTING: FORCE NEWLINE")?;338 }339 Ok(())340 }341}342343#[impl_for_tuples(0, 48)]344impl SolidityFunctions for Tuple {345 for_tuples!( where #( Tuple: SolidityFunctions ),* );346347 fn solidity_name(348 &self,349 is_impl: bool,350 writer: &mut impl fmt::Write,351 tc: &TypeCollector,352 ) -> fmt::Result {353 let mut first = false;354 for_tuples!( #(355 Tuple.solidity_name(is_impl, writer, tc)?;356 )* );357 Ok(())358 }359}360361pub struct SolidityInterface<F: SolidityFunctions> {362 pub docs: &'static [&'static str],363 pub selector: Bytes4,364 pub name: &'static str,365 pub is: &'static [&'static str],366 pub functions: F,367}368369impl<F: SolidityFunctions> SolidityInterface<F> {370 pub fn format(371 &self,372 is_impl: bool,373 out: &mut impl fmt::Write,374 tc: &TypeCollector,375 ) -> fmt::Result {376 const ZERO_BYTES: [u8; 4] = [0; 4];377 for doc in self.docs {378 writeln!(out, "///{}", doc)?;379 }380 if self.selector != ZERO_BYTES {381 writeln!(382 out,383 "/// @dev the ERC-165 identifier for this interface is 0x{:0>8x}",384 u32::from_be_bytes(self.selector)385 )?;386 }387 if is_impl {388 write!(out, "contract ")?;389 } else {390 write!(out, "interface ")?;391 }392 write!(out, "{}", self.name)?;393 if !self.is.is_empty() {394 write!(out, " is")?;395 for (i, n) in self.is.iter().enumerate() {396 if i != 0 {397 write!(out, ",")?;398 }399 write!(out, " {}", n)?;400 }401 }402 writeln!(out, " {{")?;403 self.functions.solidity_name(is_impl, out, tc)?;404 writeln!(out, "}}")?;405 Ok(())406 }407}408409pub struct SolidityEvent<A> {410 pub name: &'static str,411 pub args: A,412}413414impl<A: SolidityArguments> SolidityFunctions for SolidityEvent<A> {415 fn solidity_name(416 &self,417 _is_impl: bool,418 writer: &mut impl fmt::Write,419 tc: &TypeCollector,420 ) -> fmt::Result {421 write!(writer, "\tevent {}(", self.name)?;422 self.args.solidity_name(writer, tc)?;423 writeln!(writer, ");")424 }425}426427#[impl_for_tuples(0, 48)]428impl SolidityItems for Tuple {429 for_tuples!( where #( Tuple: SolidityItems ),* );430431 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {432 for_tuples!( #(433 Tuple.solidity_name(writer, tc)?;434 )* );435 Ok(())436 }437}438439pub struct SolidityStructField<T> {440 pub docs: &'static [&'static str],441 pub name: &'static str,442 pub ty: PhantomData<*const T>,443}444445impl<T> SolidityItems for SolidityStructField<T>446where447 T: SolidityTypeName,448{449 fn solidity_name(&self, out: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {450 for doc in self.docs {451 writeln!(out, "///{}", doc)?;452 }453 write!(out, "\t")?;454 T::solidity_name(out, tc)?;455 writeln!(out, " {};", self.name)?;456 Ok(())457 }458}459pub struct SolidityStruct<'a, F> {460 pub docs: &'a [&'a str],461 // pub generics:462 pub name: &'a str,463 pub fields: F,464}465impl<F> SolidityStruct<'_, F>466where467 F: SolidityItems,468{469 pub fn format(&self, out: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {470 for doc in self.docs {471 writeln!(out, "///{}", doc)?;472 }473 writeln!(out, "struct {} {{", self.name)?;474 self.fields.solidity_name(out, tc)?;475 writeln!(out, "}}")?;476 Ok(())477 }478}479480pub struct SolidityEnumVariant {481 pub docs: &'static [&'static str],482 pub name: &'static str,483}484impl SolidityItems for SolidityEnumVariant {485 fn solidity_name(&self, out: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {486 for doc in self.docs {487 writeln!(out, "///{}", doc)?;488 }489 write!(out, "\t{}", self.name)?;490 Ok(())491 }492}493pub struct SolidityEnum {494 pub docs: &'static [&'static str],495 pub name: &'static str,496 pub fields: &'static [SolidityEnumVariant],497}498impl SolidityEnum {499 pub fn format(&self, out: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {500 for doc in self.docs {501 writeln!(out, "///{}", doc)?;502 }503 write!(out, "enum {} {{", self.name)?;504 for (i, field) in self.fields.iter().enumerate() {505 if i != 0 {506 write!(out, ",")?;507 }508 writeln!(out)?;509 field.solidity_name(out, tc)?;510 }511 writeln!(out)?;512 writeln!(out, "}}")?;513 Ok(())514 }515}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617//! Implementation detail of [`crate::solidity_interface`] macro code-generation.18//! You should not rely on any public item from this module, as it is only intended to be used19//! by procedural macro, API and output format may be changed at any time.20//!21//! Purpose of this module is to receive solidity contract definition in module-specified22//! format, and then output string, representing interface of this contract in solidity language2324mod traits;25pub use traits::*;26mod impls;2728#[cfg(not(feature = "std"))]29use alloc::{vec::Vec, collections::BTreeMap, format};30#[cfg(feature = "std")]31use std::collections::BTreeMap;32use core::{33 fmt::{self, Write},34 marker::PhantomData,35 cell::{Cell, RefCell},36 cmp::Reverse,37};38use impl_trait_for_tuples::impl_for_tuples;39use crate::{types::*, custom_signature::SignatureUnit};4041#[derive(Default)]42pub struct TypeCollector {43 /// Code => id44 /// id ordering is required to perform topo-sort on the resulting data45 structs: RefCell<BTreeMap<String, usize>>,46 anonymous: RefCell<BTreeMap<Vec<String>, usize>>,47 // generic: RefCell<BTreeMap<String, usize>>,48 id: Cell<usize>,49}50impl TypeCollector {51 pub fn new() -> Self {52 Self::default()53 }54 pub fn collect(&self, item: String) {55 let id = self.next_id();56 self.structs.borrow_mut().insert(item, id);57 }58 pub fn next_id(&self) -> usize {59 let v = self.id.get();60 self.id.set(v + 1);61 v62 }63 /// Collect typle, deduplicating it by type, and returning generated name64 pub fn collect_tuple<T: SolidityTupleTy>(&self) -> String {65 let names = T::fields(self);66 if let Some(id) = self.anonymous.borrow().get(&names).cloned() {67 return format!("Tuple{}", id);68 }69 let id = self.next_id();70 let mut str = String::new();71 writeln!(str, "/// @dev anonymous struct").unwrap();72 writeln!(str, "struct Tuple{} {{", id).unwrap();73 for (i, name) in names.iter().enumerate() {74 writeln!(str, "\t{} field_{};", name, i).unwrap();75 }76 writeln!(str, "}}").unwrap();77 self.collect(str);78 self.anonymous.borrow_mut().insert(names, id);79 format!("Tuple{}", id)80 }81 pub fn collect_struct<T: SolidityStructTy>(&self) -> String {82 T::generate_solidity_interface(self)83 }84 pub fn collect_enum<T: SolidityEnumTy>(&self) -> String {85 T::generate_solidity_interface(self)86 }87 pub fn finish(self) -> Vec<String> {88 let mut data = self.structs.into_inner().into_iter().collect::<Vec<_>>();89 data.sort_by_key(|(_, id)| Reverse(*id));90 data.into_iter().map(|(code, _)| code).collect()91 }92}93#[derive(Default)]94pub struct UnnamedArgument<T>(PhantomData<*const T>);9596impl<T: SolidityTypeName> SolidityArguments for UnnamedArgument<T> {97 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {98 if !T::is_void() {99 T::solidity_name(writer, tc)?;100 if !T::is_simple() {101 write!(writer, " memory")?;102 }103 Ok(())104 } else {105 Ok(())106 }107 }108 fn solidity_get(&self, _prefix: &str, _writer: &mut impl fmt::Write) -> fmt::Result {109 Ok(())110 }111 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {112 T::solidity_default(writer, tc)113 }114 fn len(&self) -> usize {115 if T::is_void() {116 0117 } else {118 1119 }120 }121}122123pub struct NamedArgument<T>(&'static str, PhantomData<*const T>);124125impl<T> NamedArgument<T> {126 pub fn new(name: &'static str) -> Self {127 Self(name, Default::default())128 }129}130131impl<T: SolidityTypeName> SolidityArguments for NamedArgument<T> {132 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {133 if !T::is_void() {134 T::solidity_name(writer, tc)?;135 if !T::is_simple() {136 write!(writer, " memory")?;137 }138 write!(writer, " {}", self.0)139 } else {140 Ok(())141 }142 }143 fn solidity_get(&self, prefix: &str, writer: &mut impl fmt::Write) -> fmt::Result {144 writeln!(writer, "\t{prefix}\t{};", self.0)145 }146 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {147 T::solidity_default(writer, tc)148 }149 fn len(&self) -> usize {150 if T::is_void() {151 0152 } else {153 1154 }155 }156}157158pub struct SolidityEventArgument<T>(pub bool, &'static str, PhantomData<*const T>);159160impl<T> SolidityEventArgument<T> {161 pub fn new(indexed: bool, name: &'static str) -> Self {162 Self(indexed, name, Default::default())163 }164}165166impl<T: SolidityTypeName> SolidityArguments for SolidityEventArgument<T> {167 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {168 if !T::is_void() {169 T::solidity_name(writer, tc)?;170 if self.0 {171 write!(writer, " indexed")?;172 }173 write!(writer, " {}", self.1)174 } else {175 Ok(())176 }177 }178 fn solidity_get(&self, prefix: &str, writer: &mut impl fmt::Write) -> fmt::Result {179 writeln!(writer, "\t{prefix}\t{};", self.1)180 }181 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {182 T::solidity_default(writer, tc)183 }184 fn len(&self) -> usize {185 if T::is_void() {186 0187 } else {188 1189 }190 }191}192193impl SolidityArguments for () {194 fn solidity_name(&self, _writer: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {195 Ok(())196 }197 fn solidity_get(&self, _prefix: &str, _writer: &mut impl fmt::Write) -> fmt::Result {198 Ok(())199 }200 fn solidity_default(&self, _writer: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {201 Ok(())202 }203 fn len(&self) -> usize {204 0205 }206}207208#[impl_for_tuples(1, 12)]209impl SolidityArguments for Tuple {210 for_tuples!( where #( Tuple: SolidityArguments ),* );211212 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {213 let mut first = true;214 for_tuples!( #(215 if !Tuple.is_empty() {216 if !first {217 write!(writer, ", ")?;218 }219 first = false;220 Tuple.solidity_name(writer, tc)?;221 }222 )* );223 Ok(())224 }225 fn solidity_get(&self, prefix: &str, writer: &mut impl fmt::Write) -> fmt::Result {226 for_tuples!( #(227 Tuple.solidity_get(prefix, writer)?;228 )* );229 Ok(())230 }231 fn solidity_default(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {232 if self.is_empty() {233 Ok(())234 } else if self.len() == 1 {235 for_tuples!( #(236 Tuple.solidity_default(writer, tc)?;237 )* );238 Ok(())239 } else {240 write!(writer, "(")?;241 let mut first = true;242 for_tuples!( #(243 if !Tuple.is_empty() {244 if !first {245 write!(writer, ", ")?;246 }247 first = false;248 Tuple.solidity_default(writer, tc)?;249 }250 )* );251 write!(writer, ")")?;252 Ok(())253 }254 }255 fn len(&self) -> usize {256 for_tuples!( #( Tuple.len() )+* )257 }258}259260pub enum SolidityMutability {261 Pure,262 View,263 Mutable,264}265pub struct SolidityFunction<A, R> {266 pub docs: &'static [&'static str],267 pub selector: u32,268 pub hide: bool,269 pub custom_signature: SignatureUnit,270 pub name: &'static str,271 pub args: A,272 pub result: R,273 pub mutability: SolidityMutability,274 pub is_payable: bool,275}276impl<A: SolidityArguments, R: SolidityArguments> SolidityFunctions for SolidityFunction<A, R> {277 fn solidity_name(278 &self,279 is_impl: bool,280 writer: &mut impl fmt::Write,281 tc: &TypeCollector,282 ) -> fmt::Result {283 let hide_comment = self.hide.then_some("// ").unwrap_or("");284 for doc in self.docs {285 writeln!(writer, "\t{hide_comment}///{}", doc)?;286 }287 writeln!(288 writer,289 "\t{hide_comment}/// @dev EVM selector for this function is: 0x{:0>8x},",290 self.selector291 )?;292 writeln!(293 writer,294 "\t{hide_comment}/// or in textual repr: {}",295 self.custom_signature.as_str().expect("bad utf-8")296 )?;297 write!(writer, "\t{hide_comment}function {}(", self.name)?;298 self.args.solidity_name(writer, tc)?;299 write!(writer, ")")?;300 if is_impl {301 write!(writer, " public")?;302 } else {303 write!(writer, " external")?;304 }305 match &self.mutability {306 SolidityMutability::Pure => write!(writer, " pure")?,307 SolidityMutability::View => write!(writer, " view")?,308 SolidityMutability::Mutable => {}309 }310 if self.is_payable {311 write!(writer, " payable")?;312 }313 if !self.result.is_empty() {314 write!(writer, " returns (")?;315 self.result.solidity_name(writer, tc)?;316 write!(writer, ")")?;317 }318 if is_impl {319 writeln!(writer, " {{")?;320 writeln!(writer, "\t{hide_comment}\trequire(false, stub_error);")?;321 self.args.solidity_get(hide_comment, writer)?;322 match &self.mutability {323 SolidityMutability::Pure => {}324 SolidityMutability::View => writeln!(writer, "\t{hide_comment}\tdummy;")?,325 SolidityMutability::Mutable => writeln!(writer, "\t{hide_comment}\tdummy = 0;")?,326 }327 if !self.result.is_empty() {328 write!(writer, "\t{hide_comment}\treturn ")?;329 self.result.solidity_default(writer, tc)?;330 writeln!(writer, ";")?;331 }332 writeln!(writer, "\t{hide_comment}}}")?;333 } else {334 writeln!(writer, ";")?;335 }336 if self.hide {337 writeln!(writer, "// FORMATTING: FORCE NEWLINE")?;338 }339 Ok(())340 }341}342343#[impl_for_tuples(0, 48)]344impl SolidityFunctions for Tuple {345 for_tuples!( where #( Tuple: SolidityFunctions ),* );346347 fn solidity_name(348 &self,349 is_impl: bool,350 writer: &mut impl fmt::Write,351 tc: &TypeCollector,352 ) -> fmt::Result {353 let mut first = false;354 for_tuples!( #(355 Tuple.solidity_name(is_impl, writer, tc)?;356 )* );357 Ok(())358 }359}360361pub struct SolidityInterface<F: SolidityFunctions> {362 pub docs: &'static [&'static str],363 pub selector: Bytes4,364 pub name: &'static str,365 pub is: &'static [&'static str],366 pub functions: F,367}368369impl<F: SolidityFunctions> SolidityInterface<F> {370 pub fn format(371 &self,372 is_impl: bool,373 out: &mut impl fmt::Write,374 tc: &TypeCollector,375 ) -> fmt::Result {376 const ZERO_BYTES: [u8; 4] = [0; 4];377 for doc in self.docs {378 writeln!(out, "///{}", doc)?;379 }380 if self.selector != ZERO_BYTES {381 writeln!(382 out,383 "/// @dev the ERC-165 identifier for this interface is 0x{:0>8x}",384 u32::from_be_bytes(self.selector)385 )?;386 }387 if is_impl {388 write!(out, "contract ")?;389 } else {390 write!(out, "interface ")?;391 }392 write!(out, "{}", self.name)?;393 if !self.is.is_empty() {394 write!(out, " is")?;395 for (i, n) in self.is.iter().enumerate() {396 if i != 0 {397 write!(out, ",")?;398 }399 write!(out, " {}", n)?;400 }401 }402 writeln!(out, " {{")?;403 self.functions.solidity_name(is_impl, out, tc)?;404 writeln!(out, "}}")?;405 Ok(())406 }407}408409pub struct SolidityEvent<A> {410 pub name: &'static str,411 pub args: A,412}413414impl<A: SolidityArguments> SolidityFunctions for SolidityEvent<A> {415 fn solidity_name(416 &self,417 _is_impl: bool,418 writer: &mut impl fmt::Write,419 tc: &TypeCollector,420 ) -> fmt::Result {421 write!(writer, "\tevent {}(", self.name)?;422 self.args.solidity_name(writer, tc)?;423 writeln!(writer, ");")424 }425}426427#[impl_for_tuples(0, 48)]428impl SolidityItems for Tuple {429 for_tuples!( where #( Tuple: SolidityItems ),* );430431 fn solidity_name(&self, writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {432 for_tuples!( #(433 Tuple.solidity_name(writer, tc)?;434 )* );435 Ok(())436 }437}438439pub struct SolidityStructField<T> {440 pub docs: &'static [&'static str],441 pub name: &'static str,442 pub ty: PhantomData<*const T>,443}444445impl<T> SolidityItems for SolidityStructField<T>446where447 T: SolidityTypeName,448{449 fn solidity_name(&self, out: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {450 for doc in self.docs {451 writeln!(out, "///{}", doc)?;452 }453 write!(out, "\t")?;454 T::solidity_name(out, tc)?;455 writeln!(out, " {};", self.name)?;456 Ok(())457 }458}459pub struct SolidityStruct<'a, F> {460 pub docs: &'a [&'a str],461 // pub generics:462 pub name: &'a str,463 pub fields: F,464}465impl<F> SolidityStruct<'_, F>466where467 F: SolidityItems,468{469 pub fn format(&self, out: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {470 for doc in self.docs {471 writeln!(out, "///{}", doc)?;472 }473 writeln!(out, "struct {} {{", self.name)?;474 self.fields.solidity_name(out, tc)?;475 writeln!(out, "}}")?;476 Ok(())477 }478}479480pub struct SolidityEnumVariant {481 pub docs: &'static [&'static str],482 pub name: &'static str,483}484impl SolidityItems for SolidityEnumVariant {485 fn solidity_name(&self, out: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {486 for doc in self.docs {487 writeln!(out, "///{}", doc)?;488 }489 write!(out, "\t{}", self.name)?;490 Ok(())491 }492}493pub struct SolidityEnum {494 pub docs: &'static [&'static str],495 pub name: &'static str,496 pub fields: &'static [SolidityEnumVariant],497}498impl SolidityEnum {499 pub fn format(&self, out: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {500 for doc in self.docs {501 writeln!(out, "///{}", doc)?;502 }503 write!(out, "enum {} {{", self.name)?;504 for (i, field) in self.fields.iter().enumerate() {505 if i != 0 {506 write!(out, ",")?;507 }508 writeln!(out)?;509 field.solidity_name(out, tc)?;510 }511 writeln!(out)?;512 writeln!(out, "}}")?;513 Ok(())514 }515}pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -94,7 +94,7 @@
/// @param value Propery value.
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::set_collection_properties(1))]
- fn set_collection_property(&mut self, caller: caller, key: string, value: bytes) -> Result<()> {
+ fn set_collection_property(&mut self, caller: caller, key: String, value: bytes) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let key = <Vec<u8>>::from(key)
.try_into()
@@ -130,7 +130,7 @@
/// @param key Property key.
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::delete_collection_properties(1))]
- fn delete_collection_property(&mut self, caller: caller, key: string) -> Result<()> {
+ fn delete_collection_property(&mut self, caller: caller, key: String) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let key = <Vec<u8>>::from(key)
.try_into()
@@ -143,7 +143,7 @@
///
/// @param keys Properties keys.
#[weight(<SelfWeightOf<T>>::delete_collection_properties(keys.len() as u32))]
- fn delete_collection_properties(&mut self, caller: caller, keys: Vec<string>) -> Result<()> {
+ fn delete_collection_properties(&mut self, caller: caller, keys: Vec<String>) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let keys = keys
.into_iter()
@@ -164,7 +164,7 @@
///
/// @param key Property key.
/// @return bytes The property corresponding to the key.
- fn collection_property(&self, key: string) -> Result<bytes> {
+ fn collection_property(&self, key: String) -> Result<bytes> {
let key = <Vec<u8>>::from(key)
.try_into()
.map_err(|_| "key too large")?;
@@ -179,7 +179,7 @@
///
/// @param keys Properties keys. Empty keys for all propertyes.
/// @return Vector of properties key/value pairs.
- fn collection_properties(&self, keys: Vec<string>) -> Result<Vec<eth::Property>> {
+ fn collection_properties(&self, keys: Vec<String>) -> Result<Vec<eth::Property>> {
let keys = keys
.into_iter()
.map(|key| {
@@ -616,7 +616,7 @@
/// Returns collection type
///
/// @return `Fungible` or `NFT` or `ReFungible`
- fn unique_collection_type(&self) -> Result<string> {
+ fn unique_collection_type(&self) -> Result<String> {
let mode = match self.collection.mode {
CollectionMode::Fungible(_) => "Fungible",
CollectionMode::NFT => "NFT",
pallets/common/src/eth.rsdiffbeforeafterboth--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -118,7 +118,7 @@
/// Ethereum representation of collection [`PropertyKey`](up_data_structs::PropertyKey) and [`PropertyValue`](up_data_structs::PropertyValue).
#[derive(Debug, Default, AbiCoder)]
pub struct Property {
- key: evm_coder::types::string,
+ key: evm_coder::types::String,
value: evm_coder::types::bytes,
}
@@ -126,7 +126,7 @@
type Error = evm_coder::execution::Error;
fn try_from(from: up_data_structs::Property) -> Result<Self, Self::Error> {
- let key = evm_coder::types::string::from_utf8(from.key.into())
+ let key = evm_coder::types::String::from_utf8(from.key.into())
.map_err(|e| Self::Error::Revert(format!("utf8 conversion error: {}", e)))?;
let value = evm_coder::types::bytes(from.value.to_vec());
Ok(Property { key, value })
@@ -342,7 +342,7 @@
#[derive(Debug, Default, AbiCoder)]
pub struct TokenPropertyPermission {
/// Token property key.
- key: evm_coder::types::string,
+ key: evm_coder::types::String,
/// Token property permissions.
permissions: Vec<PropertyPermission>,
}
@@ -360,7 +360,7 @@
),
) -> Self {
let (key, permission) = value;
- let key = evm_coder::types::string::from_utf8(key.into_inner())
+ let key = evm_coder::types::String::from_utf8(key.into_inner())
.expect("Stored key must be valid");
let permissions = PropertyPermission::into_vec(permission);
Self { key, permissions }
pallets/fungible/src/erc.rsdiffbeforeafterboth--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -59,13 +59,13 @@
#[solidity_interface(name = ERC20, events(ERC20Events))]
impl<T: Config> FungibleHandle<T> {
- fn name(&self) -> Result<string> {
+ fn name(&self) -> Result<String> {
Ok(decode_utf16(self.name.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
- fn symbol(&self) -> Result<string> {
- Ok(string::from_utf8_lossy(&self.token_prefix).into())
+ fn symbol(&self) -> Result<String> {
+ Ok(String::from_utf8_lossy(&self.token_prefix).into())
}
fn total_supply(&self) -> Result<U256> {
self.consume_store_reads(1)?;
@@ -167,10 +167,10 @@
T::AccountId: From<[u8; 32]>,
{
/// @notice A description for the collection.
- fn description(&self) -> Result<string> {
+ fn description(&self) -> Result<String> {
Ok(decode_utf16(self.description.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
#[weight(<SelfWeightOf<T>>::create_item())]
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -64,7 +64,7 @@
fn set_token_property_permission(
&mut self,
caller: caller,
- key: string,
+ key: String,
is_mutable: bool,
collection_admin: bool,
token_owner: bool,
@@ -123,7 +123,7 @@
&mut self,
caller: caller,
token_id: U256,
- key: string,
+ key: String,
value: bytes,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -187,7 +187,7 @@
/// @param key Property key.
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::delete_token_properties(1))]
- fn delete_property(&mut self, token_id: U256, caller: caller, key: string) -> Result<()> {
+ fn delete_property(&mut self, token_id: U256, caller: caller, key: String) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
let key = <Vec<u8>>::from(key)
@@ -211,7 +211,7 @@
&mut self,
token_id: U256,
caller: caller,
- keys: Vec<string>,
+ keys: Vec<String>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -239,7 +239,7 @@
/// @param tokenId ID of the token.
/// @param key Property key.
/// @return Property value bytes
- fn property(&self, token_id: U256, key: string) -> Result<bytes> {
+ fn property(&self, token_id: U256, key: String) -> Result<bytes> {
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
let key = <Vec<u8>>::from(key)
.try_into()
@@ -301,14 +301,14 @@
/// @notice A descriptive name for a collection of NFTs in this contract
/// @dev real implementation of this function lies in `ERC721UniqueExtensions`
#[solidity(hide, rename_selector = "name")]
- fn name_proxy(&self) -> Result<string> {
+ fn name_proxy(&self) -> Result<String> {
self.name()
}
/// @notice An abbreviated name for NFTs in this contract
/// @dev real implementation of this function lies in `ERC721UniqueExtensions`
#[solidity(hide, rename_selector = "symbol")]
- fn symbol_proxy(&self) -> Result<string> {
+ fn symbol_proxy(&self) -> Result<String> {
self.symbol()
}
@@ -322,7 +322,7 @@
///
/// @return token's const_metadata
#[solidity(rename_selector = "tokenURI")]
- fn token_uri(&self, token_id: U256) -> Result<string> {
+ fn token_uri(&self, token_id: U256) -> Result<String> {
let token_id_u32: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
match get_token_property(self, token_id_u32, &key::url()).as_deref() {
@@ -335,7 +335,7 @@
let base_uri =
pallet_common::Pallet::<T>::get_collection_property(self.id, &key::base_uri())
.map(BoundedVec::into_inner)
- .map(string::from_utf8)
+ .map(String::from_utf8)
.transpose()
.map_err(|e| {
Error::Revert(alloc::format!(
@@ -595,7 +595,7 @@
&mut self,
caller: caller,
to: Address,
- token_uri: string,
+ token_uri: String,
) -> Result<U256> {
let token_id: U256 = <TokensMinted<T>>::get(self.id)
.checked_add(1)
@@ -618,7 +618,7 @@
caller: caller,
to: Address,
token_id: U256,
- token_uri: string,
+ token_uri: String,
) -> Result<bool> {
let key = key::url();
let permission = get_token_permission::<T>(self.id, &key)?;
@@ -670,12 +670,12 @@
collection: &CollectionHandle<T>,
token_id: u32,
key: &up_data_structs::PropertyKey,
-) -> Result<string> {
+) -> Result<String> {
collection.consume_store_reads(1)?;
let properties = <TokenProperties<T>>::try_get((collection.id, token_id))
.map_err(|_| Error::Revert("Token properties not found".into()))?;
if let Some(property) = properties.get(key) {
- return Ok(string::from_utf8_lossy(property).into());
+ return Ok(String::from_utf8_lossy(property).into());
}
Err("Property tokenURI not found".into())
@@ -691,7 +691,7 @@
.get(key)
.map(Clone::clone)
.ok_or_else(|| {
- let key = string::from_utf8(key.clone().into_inner()).unwrap_or_default();
+ let key = String::from_utf8(key.clone().into_inner()).unwrap_or_default();
Error::Revert(alloc::format!("No permission for key {}", key))
})?;
Ok(a)
@@ -704,22 +704,22 @@
T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]>,
{
/// @notice A descriptive name for a collection of NFTs in this contract
- fn name(&self) -> Result<string> {
+ fn name(&self) -> Result<String> {
Ok(decode_utf16(self.name.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
/// @notice An abbreviated name for NFTs in this contract
- fn symbol(&self) -> Result<string> {
- Ok(string::from_utf8_lossy(&self.token_prefix).into())
+ fn symbol(&self) -> Result<String> {
+ Ok(String::from_utf8_lossy(&self.token_prefix).into())
}
/// @notice A description for the collection.
- fn description(&self) -> Result<string> {
+ fn description(&self) -> Result<String> {
Ok(decode_utf16(self.description.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
/// Returns the owner (in cross format) of the token.
@@ -736,7 +736,7 @@
/// @param tokenId Id for the token.
/// @param keys Properties keys. Empty keys for all propertyes.
/// @return Vector of properties key/value pairs.
- fn properties(&self, token_id: U256, keys: Vec<string>) -> Result<Vec<eth::Property>> {
+ fn properties(&self, token_id: U256, keys: Vec<String>) -> Result<Vec<eth::Property>> {
let keys = keys
.into_iter()
.map(|key| {
@@ -948,7 +948,7 @@
&mut self,
caller: caller,
to: Address,
- tokens: Vec<(U256, string)>,
+ tokens: Vec<(U256, String)>,
) -> Result<bool> {
let key = key::url();
let caller = T::CrossAccountId::from_eth(caller);
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -67,7 +67,7 @@
fn set_token_property_permission(
&mut self,
caller: caller,
- key: string,
+ key: String,
is_mutable: bool,
collection_admin: bool,
token_owner: bool,
@@ -126,7 +126,7 @@
&mut self,
caller: caller,
token_id: U256,
- key: string,
+ key: String,
value: bytes,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -190,7 +190,7 @@
/// @param key Property key.
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::delete_token_properties(1))]
- fn delete_property(&mut self, token_id: U256, caller: caller, key: string) -> Result<()> {
+ fn delete_property(&mut self, token_id: U256, caller: caller, key: String) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
let key = <Vec<u8>>::from(key)
@@ -214,7 +214,7 @@
&mut self,
token_id: U256,
caller: caller,
- keys: Vec<string>,
+ keys: Vec<String>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -242,7 +242,7 @@
/// @param tokenId ID of the token.
/// @param key Property key.
/// @return Property value bytes
- fn property(&self, token_id: U256, key: string) -> Result<bytes> {
+ fn property(&self, token_id: U256, key: String) -> Result<bytes> {
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
let key = <Vec<u8>>::from(key)
.try_into()
@@ -298,14 +298,14 @@
/// @notice A descriptive name for a collection of NFTs in this contract
/// @dev real implementation of this function lies in `ERC721UniqueExtensions`
#[solidity(hide, rename_selector = "name")]
- fn name_proxy(&self) -> Result<string> {
+ fn name_proxy(&self) -> Result<String> {
self.name()
}
/// @notice An abbreviated name for NFTs in this contract
/// @dev real implementation of this function lies in `ERC721UniqueExtensions`
#[solidity(hide, rename_selector = "symbol")]
- fn symbol_proxy(&self) -> Result<string> {
+ fn symbol_proxy(&self) -> Result<String> {
self.symbol()
}
@@ -319,7 +319,7 @@
///
/// @return token's const_metadata
#[solidity(rename_selector = "tokenURI")]
- fn token_uri(&self, token_id: U256) -> Result<string> {
+ fn token_uri(&self, token_id: U256) -> Result<String> {
let token_id_u32: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
match get_token_property(self, token_id_u32, &key::url()).as_deref() {
@@ -332,7 +332,7 @@
let base_uri =
pallet_common::Pallet::<T>::get_collection_property(self.id, &key::base_uri())
.map(BoundedVec::into_inner)
- .map(string::from_utf8)
+ .map(String::from_utf8)
.transpose()
.map_err(|e| {
Error::Revert(alloc::format!(
@@ -631,7 +631,7 @@
&mut self,
caller: caller,
to: Address,
- token_uri: string,
+ token_uri: String,
) -> Result<U256> {
let token_id: U256 = <TokensMinted<T>>::get(self.id)
.checked_add(1)
@@ -654,7 +654,7 @@
caller: caller,
to: Address,
token_id: U256,
- token_uri: string,
+ token_uri: String,
) -> Result<bool> {
let key = key::url();
let permission = get_token_permission::<T>(self.id, &key)?;
@@ -708,12 +708,12 @@
collection: &CollectionHandle<T>,
token_id: u32,
key: &up_data_structs::PropertyKey,
-) -> Result<string> {
+) -> Result<String> {
collection.consume_store_reads(1)?;
let properties = <TokenProperties<T>>::try_get((collection.id, token_id))
.map_err(|_| Error::Revert("Token properties not found".into()))?;
if let Some(property) = properties.get(key) {
- return Ok(string::from_utf8_lossy(property).into());
+ return Ok(String::from_utf8_lossy(property).into());
}
Err("Property tokenURI not found".into())
@@ -729,7 +729,7 @@
.get(key)
.map(Clone::clone)
.ok_or_else(|| {
- let key = string::from_utf8(key.clone().into_inner()).unwrap_or_default();
+ let key = String::from_utf8(key.clone().into_inner()).unwrap_or_default();
Error::Revert(alloc::format!("No permission for key {}", key))
})?;
Ok(a)
@@ -742,22 +742,22 @@
T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]>,
{
/// @notice A descriptive name for a collection of NFTs in this contract
- fn name(&self) -> Result<string> {
+ fn name(&self) -> Result<String> {
Ok(decode_utf16(self.name.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
/// @notice An abbreviated name for NFTs in this contract
- fn symbol(&self) -> Result<string> {
- Ok(string::from_utf8_lossy(&self.token_prefix).into())
+ fn symbol(&self) -> Result<String> {
+ Ok(String::from_utf8_lossy(&self.token_prefix).into())
}
/// @notice A description for the collection.
- fn description(&self) -> Result<string> {
+ fn description(&self) -> Result<String> {
Ok(decode_utf16(self.description.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
/// Returns the owner (in cross format) of the token.
@@ -774,7 +774,7 @@
/// @param tokenId Id for the token.
/// @param keys Properties keys. Empty keys for all propertyes.
/// @return Vector of properties key/value pairs.
- fn properties(&self, token_id: U256, keys: Vec<string>) -> Result<Vec<eth::Property>> {
+ fn properties(&self, token_id: U256, keys: Vec<String>) -> Result<Vec<eth::Property>> {
let keys = keys
.into_iter()
.map(|key| {
@@ -991,7 +991,7 @@
&mut self,
caller: caller,
to: Address,
- tokens: Vec<(U256, string)>,
+ tokens: Vec<(U256, String)>,
) -> Result<bool> {
let key = key::url();
let caller = T::CrossAccountId::from_eth(caller);
pallets/refungible/src/erc_token.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc_token.rs
+++ b/pallets/refungible/src/erc_token.rs
@@ -92,15 +92,15 @@
#[solidity_interface(name = ERC20, events(ERC20Events))]
impl<T: Config> RefungibleTokenHandle<T> {
/// @return the name of the token.
- fn name(&self) -> Result<string> {
+ fn name(&self) -> Result<String> {
Ok(decode_utf16(self.name.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
- .collect::<string>())
+ .collect::<String>())
}
/// @return the symbol of the token.
- fn symbol(&self) -> Result<string> {
- Ok(string::from_utf8_lossy(&self.token_prefix).into())
+ fn symbol(&self) -> Result<String> {
+ Ok(String::from_utf8_lossy(&self.token_prefix).into())
}
/// @dev Total number of tokens in existence
pallets/unique/src/eth/mod.rsdiffbeforeafterboth--- a/pallets/unique/src/eth/mod.rs
+++ b/pallets/unique/src/eth/mod.rs
@@ -57,9 +57,9 @@
fn convert_data<T: Config>(
caller: caller,
- name: string,
- description: string,
- token_prefix: string,
+ name: String,
+ description: String,
+ token_prefix: String,
) -> Result<(
T::CrossAccountId,
CollectionName,
@@ -89,10 +89,10 @@
fn create_collection_internal<T: Config>(
caller: caller,
value: value,
- name: string,
+ name: String,
collection_mode: CollectionMode,
- description: string,
- token_prefix: string,
+ description: String,
+ token_prefix: String,
) -> Result<Address> {
let (caller, name, description, token_prefix) =
convert_data::<T>(caller, name, description, token_prefix)?;
@@ -151,9 +151,9 @@
&mut self,
caller: caller,
value: value,
- name: string,
- description: string,
- token_prefix: string,
+ name: String,
+ description: String,
+ token_prefix: String,
) -> Result<Address> {
let (caller, name, description, token_prefix) =
convert_data::<T>(caller, name, description, token_prefix)?;
@@ -190,9 +190,9 @@
&mut self,
caller: caller,
value: value,
- name: string,
- description: string,
- token_prefix: string,
+ name: String,
+ description: String,
+ token_prefix: String,
) -> Result<Address> {
create_collection_internal::<T>(
caller,
@@ -210,9 +210,9 @@
&mut self,
caller: caller,
value: value,
- name: string,
- description: string,
- token_prefix: string,
+ name: String,
+ description: String,
+ token_prefix: String,
) -> Result<Address> {
create_collection_internal::<T>(
caller,
@@ -230,10 +230,10 @@
&mut self,
caller: caller,
value: value,
- name: string,
+ name: String,
decimals: u8,
- description: string,
- token_prefix: string,
+ description: String,
+ token_prefix: String,
) -> Result<Address> {
create_collection_internal::<T>(
caller,
@@ -250,7 +250,7 @@
&mut self,
caller: caller,
collection: Address,
- base_uri: string,
+ base_uri: String,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let collection =
runtime/tests/src/tests.rsdiffbeforeafterboth--- a/runtime/tests/src/tests.rs
+++ b/runtime/tests/src/tests.rs
@@ -323,7 +323,7 @@
.map(|d| { d.into() })
.collect()
));
- for (index, data) in items_data.into_iter().enumerate() {
+ for (index, _data) in items_data.into_iter().enumerate() {
let balance = <pallet_refungible::Balance<Test>>::get((
CollectionId(1),
TokenId((index + 1) as u32),