difftreelog
Merge pull request #825 from UniqueNetwork/feature/evm_coder_types_refactor
in: master
Feature/evm_coder_types_refactor
39 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2330,7 +2330,6 @@
"hex",
"hex-literal",
"impl-trait-for-tuples",
- "pallet-evm",
"primitive-types 0.12.1",
"sha3-const",
"similar-asserts",
crates/evm-coder/Cargo.tomldiffbeforeafterboth--- a/crates/evm-coder/Cargo.toml
+++ b/crates/evm-coder/Cargo.toml
@@ -19,8 +19,6 @@
# We have tuple-heavy code in solidity.rs
impl-trait-for-tuples = "0.2.2"
-pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" }
-
[dev-dependencies]
# We want to assert some large binary blobs equality in tests
hex = "0.4.3"
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
@@ -347,14 +347,14 @@
fn is_value(&self) -> bool {
if let Ok(ident) = self.plain() {
- return ident == "value";
+ return ident == "Value";
}
false
}
fn is_caller(&self) -> bool {
if let Ok(ident) = self.plain() {
- return ident == "caller";
+ return ident == "Caller";
}
false
}
@@ -610,7 +610,7 @@
let custom_signature = self.expand_custom_signature();
quote! {
const #screaming_name_signature: ::evm_coder::custom_signature::SignatureUnit = #custom_signature;
- const #screaming_name: ::evm_coder::types::bytes4 = {
+ const #screaming_name: ::evm_coder::types::Bytes4 = {
let mut sum = ::evm_coder::sha3_const::Keccak256::new();
let mut pos = 0;
while pos < Self::#screaming_name_signature.len {
@@ -974,7 +974,7 @@
#consts
)*
/// Return this call ERC165 selector
- pub const fn interface_id() -> ::evm_coder::types::bytes4 {
+ pub const fn interface_id() -> ::evm_coder::types::Bytes4 {
let mut interface_id = 0;
#(#interface_id)*
#(#inline_interface_id)*
@@ -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");
}
@@ -1019,7 +1019,7 @@
}
}
impl #gen_ref ::evm_coder::Call for #call_name #gen_ref {
- fn parse(method_id: ::evm_coder::types::bytes4, reader: &mut ::evm_coder::abi::AbiReader) -> ::evm_coder::execution::Result<Option<Self>> {
+ fn parse(method_id: ::evm_coder::types::Bytes4, reader: &mut ::evm_coder::abi::AbiReader) -> ::evm_coder::execution::Result<Option<Self>> {
use ::evm_coder::abi::AbiRead;
match method_id {
::evm_coder::ERC165Call::INTERFACE_ID => return Ok(
@@ -1041,7 +1041,7 @@
#gen_where
{
/// Is this contract implements specified ERC165 selector
- pub fn supports_interface(this: &#name, interface_id: ::evm_coder::types::bytes4) -> bool {
+ pub fn supports_interface(this: &#name, interface_id: ::evm_coder::types::Bytes4) -> bool {
interface_id != u32::to_be_bytes(0xffffff) && (
interface_id == ::evm_coder::ERC165Call::INTERFACE_ID ||
interface_id == Self::interface_id()
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
@@ -137,7 +137,7 @@
Self::#name {#(
#fields,
)*} => {
- topics.push(topic::from(Self::#name_screaming));
+ topics.push(::evm_coder::types::Topic::from(Self::#name_screaming));
#(
topics.push(#indexed.to_topic());
)*
@@ -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);
@@ -231,7 +231,7 @@
#[automatically_derived]
impl ::evm_coder::events::ToLog for #name {
- fn to_log(&self, contract: address) -> ::ethereum::Log {
+ fn to_log(&self, contract: Address) -> ::ethereum::Log {
use ::evm_coder::events::ToTopic;
use ::evm_coder::abi::AbiWrite;
let mut writer = ::evm_coder::abi::AbiWriter::new();
crates/evm-coder/src/abi/impls.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/impls.rs
+++ b/crates/evm-coder/src/abi/impls.rs
@@ -63,27 +63,27 @@
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);
-impl_abi_type!(bytes, bytes, true);
+impl_abi_type!(Bytes, bytes, true);
-impl AbiRead for bytes {
- fn abi_read(reader: &mut AbiReader) -> Result<bytes> {
- Ok(bytes(reader.bytes()?))
+impl AbiRead for Bytes {
+ fn abi_read(reader: &mut AbiReader) -> Result<Bytes> {
+ Ok(Bytes(reader.bytes()?))
}
}
-impl AbiWrite for bytes {
+impl AbiWrite for Bytes {
fn abi_write(&self, writer: &mut AbiWriter) {
writer.bytes(self.0.as_slice())
}
}
-impl_abi_type!(bytes4, bytes4, false);
-impl AbiRead for bytes4 {
- fn abi_read(reader: &mut AbiReader) -> Result<bytes4> {
+impl_abi_type!(Bytes4, bytes4, false);
+impl AbiRead for Bytes4 {
+ fn abi_read(reader: &mut AbiReader) -> Result<Bytes4> {
reader.bytes4()
}
}
crates/evm-coder/src/abi/mod.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/mod.rs
+++ b/crates/evm-coder/src/abi/mod.rs
@@ -54,7 +54,7 @@
}
}
/// Start reading RLP buffer, parsing first 4 bytes as selector
- pub fn new_call(buf: &'i [u8]) -> Result<(bytes4, Self)> {
+ pub fn new_call(buf: &'i [u8]) -> Result<(Bytes4, Self)> {
if buf.len() < 4 {
return Err(Error::Error(ExitError::OutOfOffset));
}
@@ -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
@@ -39,22 +39,22 @@
#[test]
fn encode_decode_uint8() {
- test_impl_uint!(uint8);
+ test_impl_uint!(u8);
}
#[test]
fn encode_decode_uint32() {
- test_impl_uint!(uint32);
+ test_impl_uint!(u32);
}
#[test]
fn encode_decode_uint128() {
- test_impl_uint!(uint128);
+ test_impl_uint!(u128);
}
#[test]
fn encode_decode_uint256() {
- test_impl::<uint256>(
+ test_impl::<U256>(
0xdeadbeef,
U256([255, 0, 0, 0]),
&hex!(
@@ -101,7 +101,7 @@
#[test]
fn encode_decode_vec_tuple_address_uint256() {
- test_impl::<Vec<(address, uint256)>>(
+ test_impl::<Vec<(Address, U256)>>(
0x1ACF2D55,
vec![
(
@@ -138,7 +138,7 @@
#[test]
fn encode_decode_vec_tuple_uint256_string() {
- test_impl::<Vec<(uint256, 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<(uint256, 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,12 +273,12 @@
#[test]
fn encode_decode_vec_tuple_string_bytes() {
- test_impl::<Vec<(string, bytes)>>(
+ test_impl::<Vec<(String, Bytes)>>(
0xdeadbeef,
vec![
(
"Test URI 0".to_string(),
- bytes(vec![
+ Bytes(vec![
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
@@ -287,14 +287,14 @@
),
(
"Test URI 1".to_string(),
- bytes(vec![
+ Bytes(vec![
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
]),
),
- ("Test URI 2".to_string(), bytes(vec![0x33, 0x33])),
+ ("Test URI 2".to_string(), Bytes(vec![0x33, 0x33])),
],
&hex!(
"
@@ -337,10 +337,10 @@
// #[ignore = "reason"]
fn encode_decode_tuple0_tuple1_uint8_tuple1_string_bytes_tuple1_uint8_bytes() {
let int = 0xff;
- let by = bytes(vec![0x11, 0x22, 0x33]);
+ let by = Bytes(vec![0x11, 0x22, 0x33]);
let string = "some string".to_string();
- test_impl::<((u8,), (String, bytes), (u8, bytes))>(
+ test_impl::<((u8,), (String, Bytes), (u8, Bytes))>(
0xdeadbeef,
((int,), (string.clone(), by.clone()), (int, by)),
&hex!(
@@ -485,9 +485,9 @@
#[test]
fn encode_decode_tuple0_tuple1_string_bytes() {
- test_impl::<((String, bytes),)>(
+ test_impl::<((String, Bytes),)>(
0xdeadbeef,
- (("some string".to_string(), bytes(vec![1, 2, 3])),),
+ (("some string".to_string(), Bytes(vec![1, 2, 3])),),
&hex!(
"
deadbeef
crates/evm-coder/src/events.rsdiffbeforeafterboth--- a/crates/evm-coder/src/events.rs
+++ b/crates/evm-coder/src/events.rs
@@ -15,7 +15,7 @@
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
use ethereum::Log;
-use primitive_types::{H160, H256};
+use primitive_types::{H160, H256, U256};
use crate::types::*;
@@ -45,7 +45,7 @@
}
}
-impl ToTopic for uint256 {
+impl ToTopic for U256 {
fn to_topic(&self) -> H256 {
let mut out = [0u8; 32];
self.to_big_endian(&mut out);
@@ -53,7 +53,7 @@
}
}
-impl ToTopic for address {
+impl ToTopic for Address {
fn to_topic(&self) -> H256 {
let mut out = [0u8; 32];
out[12..32].copy_from_slice(&self.0);
@@ -61,7 +61,7 @@
}
}
-impl ToTopic for uint32 {
+impl ToTopic for u32 {
fn to_topic(&self) -> H256 {
let mut out = [0u8; 32];
out[28..32].copy_from_slice(&self.to_be_bytes());
crates/evm-coder/src/lib.rsdiffbeforeafterboth--- a/crates/evm-coder/src/lib.rs
+++ b/crates/evm-coder/src/lib.rs
@@ -131,33 +131,23 @@
use alloc::{vec::Vec};
use primitive_types::{U256, H160, H256};
- pub type address = H160;
- pub type uint8 = u8;
- pub type uint16 = u16;
- pub type uint32 = u32;
- pub type uint64 = u64;
- pub type uint128 = u128;
- pub type uint256 = U256;
- pub type bytes4 = [u8; 4];
- pub type topic = H256;
+ pub type Address = H160;
+ pub type Bytes4 = [u8; 4];
+ 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>);
-
- /// Solidity doesn't have `void` type, however we have special implementation
- /// for empty tuple return type
- pub type void = ();
+ pub struct Bytes(pub Vec<u8>);
//#region Special types
/// Makes function payable
- pub type value = U256;
+ pub type Value = U256;
/// Makes function caller-sensitive
- pub type caller = address;
+ pub type Caller = Address;
//#endregion
/// Ethereum typed call message, similar to solidity
@@ -172,20 +162,20 @@
pub value: U256,
}
- impl From<Vec<u8>> for bytes {
+ impl From<Vec<u8>> for Bytes {
fn from(src: Vec<u8>) -> Self {
Self(src)
}
}
#[allow(clippy::from_over_into)]
- impl Into<Vec<u8>> for bytes {
+ impl Into<Vec<u8>> for Bytes {
fn into(self) -> Vec<u8> {
self.0
}
}
- impl bytes {
+ impl Bytes {
#[must_use]
pub fn len(&self) -> usize {
self.0.len()
@@ -201,7 +191,7 @@
/// Parseable EVM call, this trait should be implemented with [`solidity_interface`] macro
pub trait Call: Sized {
/// Parse call buffer into typed call enum
- fn parse(selector: types::bytes4, input: &mut AbiReader) -> execution::Result<Option<Self>>;
+ fn parse(selector: types::Bytes4, input: &mut AbiReader) -> execution::Result<Option<Self>>;
}
/// Intended to be used as `#[weight]` output type
@@ -237,22 +227,22 @@
/// implements specified interface
SupportsInterface {
/// Requested interface
- interface_id: types::bytes4,
+ interface_id: types::Bytes4,
},
}
impl ERC165Call {
/// ERC165 selector is provided by standard
- pub const INTERFACE_ID: types::bytes4 = u32::to_be_bytes(0x01ffc9a7);
+ pub const INTERFACE_ID: types::Bytes4 = u32::to_be_bytes(0x01ffc9a7);
}
impl Call for ERC165Call {
- fn parse(selector: types::bytes4, input: &mut AbiReader) -> execution::Result<Option<Self>> {
+ fn parse(selector: types::Bytes4, input: &mut AbiReader) -> execution::Result<Option<Self>> {
if selector != Self::INTERFACE_ID {
return Ok(None);
}
Ok(Some(Self::SupportsInterface {
- interface_id: types::bytes4::abi_read(input)?,
+ interface_id: types::Bytes4::abi_read(input)?,
}))
}
}
crates/evm-coder/src/solidity/impls.rsdiffbeforeafterboth--- a/crates/evm-coder/src/solidity/impls.rs
+++ b/crates/evm-coder/src/solidity/impls.rs
@@ -27,14 +27,14 @@
u64 => "uint64" true = "0",
u128 => "uint128" true = "0",
U256 => "uint256" true = "0",
- bytes4 => "bytes4" true = "bytes4(0)",
+ Bytes4 => "bytes4" true = "bytes4(0)",
H160 => "address" true = "0x0000000000000000000000000000000000000000",
- string => "string" false = "\"\"",
- bytes => "bytes" false = "hex\"\"",
+ String => "string" false = "\"\"",
+ Bytes => "bytes" false = "hex\"\"",
bool => "bool" true = "false",
}
-impl SolidityTypeName for void {
+impl SolidityTypeName for () {
fn solidity_name(_writer: &mut impl fmt::Write, _tc: &TypeCollector) -> fmt::Result {
Ok(())
}
@@ -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.rsdiffbeforeafterboth--- a/crates/evm-coder/src/solidity/mod.rs
+++ b/crates/evm-coder/src/solidity/mod.rs
@@ -26,7 +26,7 @@
mod impls;
#[cfg(not(feature = "std"))]
-use alloc::{string::String, vec::Vec, collections::BTreeMap, format};
+use alloc::{vec::Vec, collections::BTreeMap, format};
#[cfg(feature = "std")]
use std::collections::BTreeMap;
use core::{
@@ -42,16 +42,16 @@
pub struct TypeCollector {
/// Code => id
/// id ordering is required to perform topo-sort on the resulting data
- structs: RefCell<BTreeMap<string, usize>>,
- anonymous: RefCell<BTreeMap<Vec<string>, usize>>,
- // generic: RefCell<BTreeMap<string, usize>>,
+ structs: RefCell<BTreeMap<String, usize>>,
+ anonymous: RefCell<BTreeMap<Vec<String>, usize>>,
+ // generic: RefCell<BTreeMap<String, usize>>,
id: Cell<usize>,
}
impl TypeCollector {
pub fn new() -> Self {
Self::default()
}
- pub fn collect(&self, item: string) {
+ pub fn collect(&self, item: String) {
let id = self.next_id();
self.structs.borrow_mut().insert(item, id);
}
@@ -84,7 +84,7 @@
pub fn collect_enum<T: SolidityEnumTy>(&self) -> String {
T::generate_solidity_interface(self)
}
- pub fn finish(self) -> Vec<string> {
+ pub fn finish(self) -> Vec<String> {
let mut data = self.structs.into_inner().into_iter().collect::<Vec<_>>();
data.sort_by_key(|(_, id)| Reverse(*id));
data.into_iter().map(|(code, _)| code).collect()
@@ -360,7 +360,7 @@
pub struct SolidityInterface<F: SolidityFunctions> {
pub docs: &'static [&'static str],
- pub selector: bytes4,
+ pub selector: Bytes4,
pub name: &'static str,
pub is: &'static [&'static str],
pub functions: F,
crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/abi_derive_generation.rs
+++ b/crates/evm-coder/tests/abi_derive_generation.rs
@@ -1,6 +1,6 @@
mod test_struct {
use evm_coder_procedural::AbiCoder;
- use evm_coder::types::bytes;
+ use evm_coder::types::Bytes;
#[test]
fn empty_struct() {
@@ -27,13 +27,13 @@
#[derive(AbiCoder, PartialEq, Debug)]
struct TypeStruct2DynamicParam {
_a: String,
- _b: bytes,
+ _b: Bytes,
}
#[derive(AbiCoder, PartialEq, Debug)]
struct TypeStruct2MixedParam {
_a: u8,
- _b: bytes,
+ _b: Bytes,
}
#[derive(AbiCoder, PartialEq, Debug)]
@@ -236,10 +236,10 @@
struct TupleStruct2SimpleParam(u8, u32);
#[derive(AbiCoder, PartialEq, Debug)]
- struct TupleStruct2DynamicParam(String, bytes);
+ struct TupleStruct2DynamicParam(String, Bytes);
#[derive(AbiCoder, PartialEq, Debug)]
- struct TupleStruct2MixedParam(u8, bytes);
+ struct TupleStruct2MixedParam(u8, Bytes);
#[derive(AbiCoder, PartialEq, Debug)]
struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);
@@ -562,8 +562,8 @@
#[test]
fn codec_struct_2_dynamic() {
let _a: String = "some string".into();
- let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);
- test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(
+ let _b: Bytes = Bytes(vec![0x11, 0x22, 0x33]);
+ test_impl::<(String, Bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(
(_a.clone(), _b.clone()),
TupleStruct2DynamicParam(_a.clone(), _b.clone()),
TypeStruct2DynamicParam { _a, _b },
@@ -573,8 +573,8 @@
#[test]
fn codec_struct_2_mixed() {
let _a: u8 = 0xff;
- let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);
- test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(
+ let _b: Bytes = Bytes(vec![0x11, 0x22, 0x33]);
+ test_impl::<(u8, Bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(
(_a.clone(), _b.clone()),
TupleStruct2MixedParam(_a.clone(), _b.clone()),
TypeStruct2MixedParam { _a, _b },
@@ -605,9 +605,9 @@
#[test]
fn codec_struct_2_derived_dynamic() {
let _a = "some string".to_string();
- let _b = bytes(vec![0x11, 0x22, 0x33]);
+ let _b = Bytes(vec![0x11, 0x22, 0x33]);
test_impl::<
- ((String,), (String, bytes)),
+ ((String,), (String, Bytes)),
TupleStruct2DerivedDynamicParam,
TypeStruct2DerivedDynamicParam,
>(
@@ -626,10 +626,10 @@
#[test]
fn codec_struct_3_derived_mixed() {
let int = 0xff;
- let by = bytes(vec![0x11, 0x22, 0x33]);
+ let by = Bytes(vec![0x11, 0x22, 0x33]);
let string = "some string".to_string();
test_impl::<
- ((u8,), (String, bytes), (u8, bytes)),
+ ((u8,), (String, Bytes), (u8, Bytes)),
TupleStruct3DerivedMixedParam,
TypeStruct3DerivedMixedParam,
>(
crates/evm-coder/tests/conditional_is.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/conditional_is.rs
+++ b/crates/evm-coder/tests/conditional_is.rs
@@ -4,14 +4,14 @@
#[solidity_interface(name = A)]
impl Contract {
- fn method_a() -> Result<void> {
+ fn method_a() -> Result<()> {
Ok(())
}
}
#[solidity_interface(name = B)]
impl Contract {
- fn method_b() -> Result<void> {
+ fn method_b() -> Result<()> {
Ok(())
}
}
crates/evm-coder/tests/generics.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/generics.rs
+++ b/crates/evm-coder/tests/generics.rs
@@ -16,19 +16,20 @@
use std::marker::PhantomData;
use evm_coder::{execution::Result, generate_stubgen, solidity_interface, types::*};
+use primitive_types::U256;
pub struct Generic<T>(PhantomData<T>);
#[solidity_interface(name = GenericIs)]
impl<T> Generic<T> {
- fn test_1(&self) -> Result<uint256> {
+ fn test_1(&self) -> Result<U256> {
unreachable!()
}
}
#[solidity_interface(name = Generic, is(GenericIs))]
impl<T: Into<u32>> Generic<T> {
- fn test_2(&self) -> Result<uint256> {
+ fn test_2(&self) -> Result<U256> {
unreachable!()
}
}
@@ -40,7 +41,7 @@
where
T: core::fmt::Debug,
{
- fn test_3(&self) -> Result<uint256> {
+ fn test_3(&self) -> Result<U256> {
unreachable!()
}
}
crates/evm-coder/tests/log.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/log.rs
+++ b/crates/evm-coder/tests/log.rs
@@ -17,19 +17,20 @@
#![allow(dead_code)]
use evm_coder::{ToLog, types::*};
+use primitive_types::U256;
#[derive(ToLog)]
enum ERC721Log {
Transfer {
#[indexed]
- from: address,
+ from: Address,
#[indexed]
- to: address,
- value: uint256,
+ to: Address,
+ value: U256,
},
Eee {
#[indexed]
- aaa: address,
- bbb: uint256,
+ aaa: Address,
+ bbb: U256,
},
}
crates/evm-coder/tests/random.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/random.rs
+++ b/crates/evm-coder/tests/random.rs
@@ -19,19 +19,20 @@
use evm_coder::{
abi::AbiType, ToLog, execution::Result, solidity_interface, types::*, solidity, weight,
};
+use primitive_types::U256;
pub struct Impls;
#[solidity_interface(name = OurInterface)]
impl Impls {
- fn fn_a(&self, _input: uint256) -> Result<bool> {
+ fn fn_a(&self, _input: U256) -> Result<bool> {
unreachable!()
}
}
#[solidity_interface(name = OurInterface1)]
impl Impls {
- fn fn_b(&self, _input: uint128) -> Result<uint32> {
+ fn fn_b(&self, _input: u128) -> Result<u32> {
unreachable!()
}
}
@@ -39,12 +40,12 @@
#[derive(ToLog)]
enum OurEvents {
Event1 {
- field1: uint32,
+ field1: u32,
},
Event2 {
- field1: uint32,
+ field1: u32,
#[indexed]
- field2: uint32,
+ field2: u32,
},
}
@@ -56,27 +57,27 @@
)]
impl Impls {
#[solidity(rename_selector = "fnK")]
- fn fn_c(&self, _input: uint32) -> Result<uint8> {
+ fn fn_c(&self, _input: u32) -> Result<u8> {
unreachable!()
}
- fn fn_d(&self, _value: uint32) -> Result<uint32> {
+ fn fn_d(&self, _value: u32) -> Result<u32> {
unreachable!()
}
- fn caller_sensitive(&self, _caller: caller) -> Result<uint8> {
+ fn caller_sensitive(&self, _caller: Caller) -> Result<u8> {
unreachable!()
}
- fn payable(&mut self, _value: value) -> Result<uint8> {
+ fn payable(&mut self, _value: Value) -> Result<u8> {
unreachable!()
}
#[weight(*_weight)]
- fn with_weight(&self, _weight: uint64) -> Result<void> {
+ fn with_weight(&self, _weight: u64) -> Result<()> {
unreachable!()
}
/// Doccoment example
- fn with_doc(&self) -> Result<void> {
+ fn with_doc(&self) -> Result<()> {
unreachable!()
}
}
crates/evm-coder/tests/solidity_generation.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/solidity_generation.rs
+++ b/crates/evm-coder/tests/solidity_generation.rs
@@ -15,34 +15,35 @@
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
use evm_coder::{abi::AbiType, execution::Result, generate_stubgen, solidity_interface, types::*};
+use primitive_types::U256;
pub struct ERC20;
#[solidity_interface(name = ERC20)]
impl ERC20 {
- fn decimals(&self) -> Result<uint8> {
+ fn decimals(&self) -> Result<u8> {
unreachable!()
}
/// Get balance of specified owner
- fn balance_of(&self, _owner: address) -> Result<uint256> {
+ fn balance_of(&self, _owner: Address) -> Result<U256> {
unreachable!()
}
- fn transfer(&mut self, _caller: caller, _to: address, _value: uint256) -> Result<bool> {
+ fn transfer(&mut self, _caller: Caller, _to: Address, _value: U256) -> Result<bool> {
unreachable!()
}
fn transfer_from(
&mut self,
- _caller: caller,
- _from: address,
- _to: address,
- _value: uint256,
+ _caller: Caller,
+ _from: Address,
+ _to: Address,
+ _value: U256,
) -> Result<bool> {
unreachable!()
}
- fn approve(&mut self, _caller: caller, _spender: address, _value: uint256) -> Result<bool> {
+ fn approve(&mut self, _caller: Caller, _spender: Address, _value: U256) -> Result<bool> {
unreachable!()
}
- fn allowance(&self, _owner: address, _spender: address) -> Result<uint256> {
+ fn allowance(&self, _owner: Address, _spender: Address) -> Result<U256> {
unreachable!()
}
}
pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -26,6 +26,7 @@
};
use pallet_evm_coder_substrate::dispatch_to_evm;
use sp_std::{vec, vec::Vec};
+use sp_core::U256;
use up_data_structs::{
AccessMode, CollectionMode, CollectionPermissions, OwnerRestrictedSet, Property,
SponsoringRateLimit, SponsorshipState,
@@ -42,32 +43,32 @@
CollectionCreated {
/// Collection owner.
#[indexed]
- owner: address,
+ owner: Address,
/// Collection ID.
#[indexed]
- collection_id: address,
+ collection_id: Address,
},
/// The collection has been destroyed.
CollectionDestroyed {
/// Collection ID.
#[indexed]
- collection_id: address,
+ collection_id: Address,
},
/// The collection has been changed.
CollectionChanged {
/// Collection ID.
#[indexed]
- collection_id: address,
+ collection_id: Address,
},
/// The token has been changed.
TokenChanged {
/// Collection ID.
#[indexed]
- collection_id: address,
+ collection_id: Address,
/// Token ID.
- token_id: uint256,
+ token_id: U256,
},
}
@@ -93,12 +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<void> {
+ 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()
@@ -115,9 +111,9 @@
#[weight(<SelfWeightOf<T>>::set_collection_properties(properties.len() as u32))]
fn set_collection_properties(
&mut self,
- caller: caller,
+ caller: Caller,
properties: Vec<eth::Property>,
- ) -> Result<void> {
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let properties = properties
@@ -134,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()
@@ -147,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()
@@ -168,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")?;
@@ -176,14 +172,14 @@
let props = CollectionProperties::<T>::get(self.id);
let prop = props.get(&key).ok_or("key not found")?;
- Ok(bytes(prop.to_vec()))
+ Ok(Bytes(prop.to_vec()))
}
/// Get collection properties.
///
/// @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| {
@@ -212,7 +208,7 @@
///
/// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
#[solidity(hide)]
- fn set_collection_sponsor(&mut self, caller: caller, sponsor: address) -> Result<void> {
+ fn set_collection_sponsor(&mut self, caller: Caller, sponsor: Address) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -229,9 +225,9 @@
/// @param sponsor Cross account address of the sponsor from whose account funds will be debited for operations with the contract.
fn set_collection_sponsor_cross(
&mut self,
- caller: caller,
+ caller: Caller,
sponsor: eth::CrossAddress,
- ) -> Result<void> {
+ ) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -252,7 +248,7 @@
/// Collection sponsorship confirmation.
///
/// @dev After setting the sponsor for the collection, it must be confirmed with this function.
- fn confirm_collection_sponsorship(&mut self, caller: caller) -> Result<void> {
+ fn confirm_collection_sponsorship(&mut self, caller: Caller) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -261,7 +257,7 @@
}
/// Remove collection sponsor.
- fn remove_collection_sponsor(&mut self, caller: caller) -> Result<void> {
+ fn remove_collection_sponsor(&mut self, caller: Caller) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
let caller = T::CrossAccountId::from_eth(caller);
self.remove_sponsor(&caller).map_err(dispatch_to_evm::<T>)
@@ -343,11 +339,7 @@
/// @dev Throws error if limit not found.
/// @param limit Some limit.
#[solidity(rename_selector = "setCollectionLimit")]
- fn set_collection_limit(
- &mut self,
- caller: caller,
- limit: eth::CollectionLimit,
- ) -> Result<void> {
+ fn set_collection_limit(&mut self, caller: Caller, limit: eth::CollectionLimit) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
if !limit.has_value() {
@@ -359,7 +351,7 @@
}
/// Get contract address.
- fn contract_address(&self) -> Result<address> {
+ fn contract_address(&self) -> Result<Address> {
Ok(crate::eth::collection_id_to_address(self.id))
}
@@ -367,9 +359,9 @@
/// @param newAdmin Cross account administrator address.
fn add_collection_admin_cross(
&mut self,
- caller: caller,
+ caller: Caller,
new_admin: eth::CrossAddress,
- ) -> Result<void> {
+ ) -> Result<()> {
self.consume_store_reads_and_writes(2, 2)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -382,9 +374,9 @@
/// @param admin Cross account administrator address.
fn remove_collection_admin_cross(
&mut self,
- caller: caller,
+ caller: Caller,
admin: eth::CrossAddress,
- ) -> Result<void> {
+ ) -> Result<()> {
self.consume_store_reads_and_writes(2, 2)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -396,7 +388,7 @@
/// Add collection admin.
/// @param newAdmin Address of the added administrator.
#[solidity(hide)]
- fn add_collection_admin(&mut self, caller: caller, new_admin: address) -> Result<void> {
+ fn add_collection_admin(&mut self, caller: Caller, new_admin: Address) -> Result<()> {
self.consume_store_reads_and_writes(2, 2)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -409,7 +401,7 @@
///
/// @param admin Address of the removed administrator.
#[solidity(hide)]
- fn remove_collection_admin(&mut self, caller: caller, admin: address) -> Result<void> {
+ fn remove_collection_admin(&mut self, caller: Caller, admin: Address) -> Result<()> {
self.consume_store_reads_and_writes(2, 2)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -422,7 +414,7 @@
///
/// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
#[solidity(rename_selector = "setCollectionNesting")]
- fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result<void> {
+ fn set_nesting_bool(&mut self, caller: Caller, enable: bool) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -443,10 +435,10 @@
#[solidity(rename_selector = "setCollectionNesting")]
fn set_nesting(
&mut self,
- caller: caller,
+ caller: Caller,
enable: bool,
- collections: Vec<address>,
- ) -> Result<void> {
+ collections: Vec<Address>,
+ ) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
if collections.is_empty() {
@@ -511,18 +503,12 @@
}
/// Set the collection access method.
/// @param mode Access mode
- /// 0 for Normal
- /// 1 for AllowList
- fn set_collection_access(&mut self, caller: caller, mode: uint8) -> Result<void> {
+ fn set_collection_access(&mut self, caller: Caller, mode: eth::AccessMode) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
let caller = T::CrossAccountId::from_eth(caller);
let permissions = CollectionPermissions {
- access: Some(match mode {
- 0 => AccessMode::Normal,
- 1 => AccessMode::AllowList,
- _ => return Err("not supported access mode".into()),
- }),
+ access: Some(mode.into()),
..Default::default()
};
<Pallet<T>>::update_permissions(&caller, self, permissions).map_err(dispatch_to_evm::<T>)
@@ -540,7 +526,7 @@
///
/// @param user Address of a trusted user.
#[solidity(hide)]
- fn add_to_collection_allow_list(&mut self, caller: caller, user: address) -> Result<void> {
+ fn add_to_collection_allow_list(&mut self, caller: Caller, user: Address) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -554,9 +540,9 @@
/// @param user User cross account address.
fn add_to_collection_allow_list_cross(
&mut self,
- caller: caller,
+ caller: Caller,
user: eth::CrossAddress,
- ) -> Result<void> {
+ ) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -569,7 +555,7 @@
///
/// @param user Address of a removed user.
#[solidity(hide)]
- fn remove_from_collection_allow_list(&mut self, caller: caller, user: address) -> Result<void> {
+ fn remove_from_collection_allow_list(&mut self, caller: Caller, user: Address) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -583,9 +569,9 @@
/// @param user User cross account address.
fn remove_from_collection_allow_list_cross(
&mut self,
- caller: caller,
+ caller: Caller,
user: eth::CrossAddress,
- ) -> Result<void> {
+ ) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -597,7 +583,7 @@
/// Switch permission for minting.
///
/// @param mode Enable if "true".
- fn set_collection_mint_mode(&mut self, caller: caller, mode: bool) -> Result<void> {
+ fn set_collection_mint_mode(&mut self, caller: Caller, mode: bool) -> Result<()> {
self.consume_store_reads_and_writes(1, 1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -613,7 +599,7 @@
/// @param user account to verify
/// @return "true" if account is the owner or admin
#[solidity(hide, rename_selector = "isOwnerOrAdmin")]
- fn is_owner_or_admin_eth(&self, user: address) -> Result<bool> {
+ fn is_owner_or_admin_eth(&self, user: Address) -> Result<bool> {
let user = T::CrossAccountId::from_eth(user);
Ok(self.is_owner_or_admin(&user))
}
@@ -630,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",
@@ -654,7 +640,7 @@
/// @dev Owner can be changed only by current owner
/// @param newOwner new owner account
#[solidity(hide, rename_selector = "changeCollectionOwner")]
- fn set_owner(&mut self, caller: caller, new_owner: address) -> Result<void> {
+ fn set_owner(&mut self, caller: Caller, new_owner: Address) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
@@ -680,9 +666,9 @@
/// @param newOwner new owner cross account
fn change_collection_owner_cross(
&mut self,
- caller: caller,
+ caller: Caller,
new_owner: eth::CrossAddress,
- ) -> Result<void> {
+ ) -> Result<()> {
self.consume_store_writes(1)?;
let caller = T::CrossAccountId::from_eth(caller);
pallets/common/src/eth.rsdiffbeforeafterboth--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -18,12 +18,9 @@
use alloc::format;
use sp_std::{vec, vec::Vec};
-use evm_coder::{
- AbiCoder,
- types::{uint256, address},
-};
+use evm_coder::{AbiCoder, types::Address};
pub use pallet_evm::{Config, account::CrossAccountId};
-use sp_core::H160;
+use sp_core::{H160, U256};
use up_data_structs::CollectionId;
// 0x17c4e6453Cc49AAAaEACA894e6D9683e00000001 - collection 1
@@ -33,7 +30,7 @@
];
/// Maps the ethereum address of the collection in substrate.
-pub fn map_eth_to_id(eth: &H160) -> Option<CollectionId> {
+pub fn map_eth_to_id(eth: &Address) -> Option<CollectionId> {
if eth[0..16] != ETH_COLLECTION_PREFIX {
return None;
}
@@ -43,7 +40,7 @@
}
/// Maps the substrate collection id in ethereum.
-pub fn collection_id_to_address(id: CollectionId) -> H160 {
+pub fn collection_id_to_address(id: CollectionId) -> Address {
let mut out = [0; 20];
out[0..16].copy_from_slice(Ð_COLLECTION_PREFIX);
out[16..20].copy_from_slice(&u32::to_be_bytes(id.0));
@@ -51,12 +48,12 @@
}
/// Check if the ethereum address is a collection.
-pub fn is_collection(address: &H160) -> bool {
+pub fn is_collection(address: &Address) -> bool {
address[0..16] == ETH_COLLECTION_PREFIX
}
-/// Convert `uint256` to `CrossAccountId`.
-pub fn convert_uint256_to_cross_account<T: Config>(from: uint256) -> T::CrossAccountId
+/// Convert `U256` to `CrossAccountId`.
+pub fn convert_uint256_to_cross_account<T: Config>(from: U256) -> T::CrossAccountId
where
T::AccountId: From<[u8; 32]>,
{
@@ -69,8 +66,8 @@
/// Cross account struct
#[derive(Debug, Default, AbiCoder)]
pub struct CrossAddress {
- pub(crate) eth: address,
- pub(crate) sub: uint256,
+ pub(crate) eth: Address,
+ pub(crate) sub: U256,
}
impl CrossAddress {
@@ -97,7 +94,7 @@
{
Self {
eth: Default::default(),
- sub: uint256::from_big_endian(account_id.as_ref()),
+ sub: U256::from_big_endian(account_id.as_ref()),
}
}
/// Converts [`CrossAddress`] to `CrossAccountId`.
@@ -121,17 +118,17 @@
/// 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,
- value: evm_coder::types::bytes,
+ key: evm_coder::types::String,
+ value: evm_coder::types::Bytes,
}
impl TryFrom<up_data_structs::Property> for Property {
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());
+ let value = evm_coder::types::Bytes(from.value.to_vec());
Ok(Property { key, value })
}
}
@@ -187,7 +184,7 @@
#[derive(Debug, Default, AbiCoder)]
pub struct CollectionLimit {
field: CollectionLimitField,
- value: Option<uint256>,
+ value: Option<U256>,
}
impl CollectionLimit {
@@ -345,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>,
}
@@ -363,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 }
@@ -393,12 +390,12 @@
#[derive(Debug, Default, AbiCoder)]
pub struct CollectionNesting {
token_owner: bool,
- ids: Vec<uint256>,
+ ids: Vec<U256>,
}
impl CollectionNesting {
/// Create [`CollectionNesting`].
- pub fn new(token_owner: bool, ids: Vec<uint256>) -> Self {
+ pub fn new(token_owner: bool, ids: Vec<U256>) -> Self {
Self { token_owner, ids }
}
}
@@ -416,3 +413,32 @@
Self { field, value }
}
}
+
+/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).
+#[derive(AbiCoder, Copy, Clone, Default, Debug)]
+#[repr(u8)]
+pub enum AccessMode {
+ /// Access grant for owner and admins. Used as default.
+ #[default]
+ Normal,
+ /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.
+ AllowList,
+}
+
+impl From<up_data_structs::AccessMode> for AccessMode {
+ fn from(value: up_data_structs::AccessMode) -> Self {
+ match value {
+ up_data_structs::AccessMode::Normal => AccessMode::Normal,
+ up_data_structs::AccessMode::AllowList => AccessMode::AllowList,
+ }
+ }
+}
+
+impl Into<up_data_structs::AccessMode> for AccessMode {
+ fn into(self) -> up_data_structs::AccessMode {
+ match self {
+ AccessMode::Normal => up_data_structs::AccessMode::Normal,
+ AccessMode::AllowList => up_data_structs::AccessMode::AllowList,
+ }
+ }
+}
pallets/evm-coder-substrate/src/lib.rsdiffbeforeafterboth--- a/pallets/evm-coder-substrate/src/lib.rs
+++ b/pallets/evm-coder-substrate/src/lib.rs
@@ -41,7 +41,7 @@
use evm_coder::{
abi::{AbiReader, AbiWrite, AbiWriter},
execution,
- types::{Msg, value},
+ types::{Msg, Value},
};
pub use pallet::*;
@@ -256,7 +256,7 @@
>(
caller: H160,
e: &mut E,
- value: value,
+ value: Value,
input: &[u8],
) -> execution::Result<Option<AbiWriter>> {
let (selector, mut reader) = AbiReader::new_call(input)?;
pallets/evm-contract-helpers/src/eth.rsdiffbeforeafterboth--- a/pallets/evm-contract-helpers/src/eth.rs
+++ b/pallets/evm-contract-helpers/src/eth.rs
@@ -49,25 +49,25 @@
ContractSponsorSet {
/// Contract address of the affected collection.
#[indexed]
- contract_address: address,
+ contract_address: Address,
/// New sponsor address.
- sponsor: address,
+ sponsor: Address,
},
/// New sponsor was confirm.
ContractSponsorshipConfirmed {
/// Contract address of the affected collection.
#[indexed]
- contract_address: address,
+ contract_address: Address,
/// New sponsor address.
- sponsor: address,
+ sponsor: Address,
},
/// Collection sponsor was removed.
ContractSponsorRemoved {
/// Contract address of the affected collection.
#[indexed]
- contract_address: address,
+ contract_address: Address,
},
}
@@ -96,7 +96,7 @@
/// @dev Returns zero address if contract does not exists
/// @param contractAddress Contract to get owner of
/// @return address Owner of contract
- fn contract_owner(&self, contract_address: address) -> Result<address> {
+ fn contract_owner(&self, contract_address: Address) -> Result<Address> {
Ok(<Owner<T>>::get(contract_address))
}
@@ -105,10 +105,10 @@
/// @param sponsor User address who set as pending sponsor.
fn set_sponsor(
&mut self,
- caller: caller,
- contract_address: address,
- sponsor: address,
- ) -> Result<void> {
+ caller: Caller,
+ contract_address: Address,
+ sponsor: Address,
+ ) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -125,7 +125,7 @@
/// Set contract as self sponsored.
///
/// @param contractAddress Contract for which a self sponsoring is being enabled.
- fn self_sponsored_enable(&mut self, caller: caller, contract_address: address) -> Result<void> {
+ fn self_sponsored_enable(&mut self, caller: Caller, contract_address: Address) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -146,7 +146,7 @@
/// Remove sponsor.
///
/// @param contractAddress Contract for which a sponsorship is being removed.
- fn remove_sponsor(&mut self, caller: caller, contract_address: address) -> Result<void> {
+ fn remove_sponsor(&mut self, caller: Caller, contract_address: Address) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -161,7 +161,7 @@
/// @dev Caller must be same that set via [`setSponsor`].
///
/// @param contractAddress Сontract for which need to confirm sponsorship.
- fn confirm_sponsorship(&mut self, caller: caller, contract_address: address) -> Result<void> {
+ fn confirm_sponsorship(&mut self, caller: Caller, contract_address: Address) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -175,7 +175,7 @@
///
/// @param contractAddress The contract for which a sponsor is requested.
/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
- fn sponsor(&self, contract_address: address) -> Result<Option<eth::CrossAddress>> {
+ fn sponsor(&self, contract_address: Address) -> Result<Option<eth::CrossAddress>> {
Ok(match Pallet::<T>::get_sponsor(contract_address) {
Some(ref value) => Some(eth::CrossAddress::from_sub_cross_account::<T>(value)),
None => None,
@@ -186,7 +186,7 @@
///
/// @param contractAddress The contract for which the presence of a confirmed sponsor is checked.
/// @return **true** if contract has confirmed sponsor.
- fn has_sponsor(&self, contract_address: address) -> Result<bool> {
+ fn has_sponsor(&self, contract_address: Address) -> Result<bool> {
Ok(Pallet::<T>::get_sponsor(contract_address).is_some())
}
@@ -194,23 +194,23 @@
///
/// @param contractAddress The contract for which the presence of a pending sponsor is checked.
/// @return **true** if contract has pending sponsor.
- fn has_pending_sponsor(&self, contract_address: address) -> Result<bool> {
+ fn has_pending_sponsor(&self, contract_address: Address) -> Result<bool> {
Ok(match Sponsoring::<T>::get(contract_address) {
SponsorshipState::Disabled | SponsorshipState::Confirmed(_) => false,
SponsorshipState::Unconfirmed(_) => true,
})
}
- fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {
+ fn sponsoring_enabled(&self, contract_address: Address) -> Result<bool> {
Ok(<Pallet<T>>::sponsoring_mode(contract_address) != SponsoringModeT::Disabled)
}
fn set_sponsoring_mode(
&mut self,
- caller: caller,
- contract_address: address,
+ caller: Caller,
+ contract_address: Address,
mode: SponsoringModeT,
- ) -> Result<void> {
+ ) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -223,7 +223,7 @@
/// Get current contract sponsoring rate limit
/// @param contractAddress Contract to get sponsoring rate limit of
/// @return uint32 Amount of blocks between two sponsored transactions
- fn sponsoring_rate_limit(&self, contract_address: address) -> Result<uint32> {
+ fn sponsoring_rate_limit(&self, contract_address: Address) -> Result<u32> {
self.recorder().consume_sload()?;
Ok(<SponsoringRateLimit<T>>::get(contract_address)
@@ -239,10 +239,10 @@
/// @dev Only contract owner can change this setting
fn set_sponsoring_rate_limit(
&mut self,
- caller: caller,
- contract_address: address,
- rate_limit: uint32,
- ) -> Result<void> {
+ caller: Caller,
+ contract_address: Address,
+ rate_limit: u32,
+ ) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -259,10 +259,10 @@
/// @dev Only contract owner can change this setting
fn set_sponsoring_fee_limit(
&mut self,
- caller: caller,
- contract_address: address,
- fee_limit: uint256,
- ) -> Result<void> {
+ caller: Caller,
+ contract_address: Address,
+ fee_limit: U256,
+ ) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -276,7 +276,7 @@
/// @param contractAddress Contract to get sponsoring fee limit of
/// @return uint256 Maximum amount of fee that could be spent by single
/// transaction
- fn sponsoring_fee_limit(&self, contract_address: address) -> Result<uint256> {
+ fn sponsoring_fee_limit(&self, contract_address: Address) -> Result<U256> {
self.recorder().consume_sload()?;
Ok(get_sponsoring_fee_limit::<T>(contract_address))
@@ -287,7 +287,7 @@
/// @param contractAddress Contract to check allowlist of
/// @param user User to check
/// @return bool Is specified users exists in contract allowlist
- fn allowed(&self, contract_address: address, user: address) -> Result<bool> {
+ fn allowed(&self, contract_address: Address, user: Address) -> Result<bool> {
self.0.consume_sload()?;
Ok(<Pallet<T>>::allowed(contract_address, user))
}
@@ -300,11 +300,11 @@
/// @dev Only contract owner can change this setting
fn toggle_allowed(
&mut self,
- caller: caller,
- contract_address: address,
- user: address,
+ caller: Caller,
+ contract_address: Address,
+ user: Address,
is_allowed: bool,
- ) -> Result<void> {
+ ) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -320,7 +320,7 @@
/// in case of allowlist access enabled, only users from allowlist may call this contract
/// @param contractAddress Contract to get allowlist access of
/// @return bool Is specified contract has allowlist access enabled
- fn allowlist_enabled(&self, contract_address: address) -> Result<bool> {
+ fn allowlist_enabled(&self, contract_address: Address) -> Result<bool> {
Ok(<AllowlistEnabled<T>>::get(contract_address))
}
@@ -329,10 +329,10 @@
/// @param enabled Should allowlist access to be enabled?
fn toggle_allowlist(
&mut self,
- caller: caller,
- contract_address: address,
+ caller: Caller,
+ contract_address: Address,
enabled: bool,
- ) -> Result<void> {
+ ) -> Result<()> {
self.recorder().consume_sload()?;
self.recorder().consume_sstore()?;
@@ -441,7 +441,7 @@
}
}
-fn get_sponsoring_fee_limit<T: Config>(contract_address: address) -> uint256 {
+fn get_sponsoring_fee_limit<T: Config>(contract_address: Address) -> U256 {
<SponsoringFeeLimit<T>>::get(contract_address)
.get(&0xffffffff)
.cloned()
pallets/fungible/src/erc.rsdiffbeforeafterboth--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -32,7 +32,7 @@
use pallet_evm::{account::CrossAccountId, PrecompileHandle};
use pallet_evm_coder_substrate::{call, dispatch_to_evm};
use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};
-use sp_core::Get;
+use sp_core::{U256, Get};
use crate::{
Allowance, Balance, Config, FungibleHandle, Pallet, SelfWeightOf, TotalSupply,
@@ -43,50 +43,50 @@
pub enum ERC20Events {
Transfer {
#[indexed]
- from: address,
+ from: Address,
#[indexed]
- to: address,
- value: uint256,
+ to: Address,
+ value: U256,
},
Approval {
#[indexed]
- owner: address,
+ owner: Address,
#[indexed]
- spender: address,
- value: uint256,
+ spender: Address,
+ value: U256,
},
}
#[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<uint256> {
+ fn total_supply(&self) -> Result<U256> {
self.consume_store_reads(1)?;
Ok(<TotalSupply<T>>::get(self.id).into())
}
- fn decimals(&self) -> Result<uint8> {
+ fn decimals(&self) -> Result<u8> {
Ok(if let CollectionMode::Fungible(decimals) = &self.mode {
*decimals
} else {
unreachable!()
})
}
- fn balance_of(&self, owner: address) -> Result<uint256> {
+ fn balance_of(&self, owner: Address) -> Result<U256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let balance = <Balance<T>>::get((self.id, owner));
Ok(balance.into())
}
#[weight(<SelfWeightOf<T>>::transfer())]
- fn transfer(&mut self, caller: caller, to: address, amount: uint256) -> Result<bool> {
+ fn transfer(&mut self, caller: Caller, to: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -101,10 +101,10 @@
#[weight(<SelfWeightOf<T>>::transfer_from())]
fn transfer_from(
&mut self,
- caller: caller,
- from: address,
- to: address,
- amount: uint256,
+ caller: Caller,
+ from: Address,
+ to: Address,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
@@ -119,7 +119,7 @@
Ok(true)
}
#[weight(<SelfWeightOf<T>>::approve())]
- fn approve(&mut self, caller: caller, spender: address, amount: uint256) -> Result<bool> {
+ fn approve(&mut self, caller: Caller, spender: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let spender = T::CrossAccountId::from_eth(spender);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -128,7 +128,7 @@
.map_err(dispatch_to_evm::<T>)?;
Ok(true)
}
- fn allowance(&self, owner: address, spender: address) -> Result<uint256> {
+ fn allowance(&self, owner: Address, spender: Address) -> Result<U256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let spender = T::CrossAccountId::from_eth(spender);
@@ -137,7 +137,7 @@
}
/// @notice Returns collection helper contract address
- fn collection_helper_address(&self) -> Result<address> {
+ fn collection_helper_address(&self) -> Result<Address> {
Ok(T::ContractAddress::get())
}
}
@@ -148,7 +148,7 @@
/// @param to account that will receive minted tokens
/// @param amount amount of tokens to mint
#[weight(<SelfWeightOf<T>>::create_item())]
- fn mint(&mut self, caller: caller, to: address, amount: uint256) -> Result<bool> {
+ fn mint(&mut self, caller: Caller, to: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -167,18 +167,18 @@
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())]
fn mint_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = to.into_sub_cross_account::<T>()?;
@@ -194,9 +194,9 @@
#[weight(<SelfWeightOf<T>>::approve())]
fn approve_cross(
&mut self,
- caller: caller,
+ caller: Caller,
spender: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let spender = spender.into_sub_cross_account::<T>()?;
@@ -214,7 +214,7 @@
/// @param amount The amount that will be burnt.
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::burn_from())]
- fn burn_from(&mut self, caller: caller, from: address, amount: uint256) -> Result<bool> {
+ fn burn_from(&mut self, caller: Caller, from: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -235,9 +235,9 @@
#[weight(<SelfWeightOf<T>>::burn_from())]
fn burn_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
@@ -254,7 +254,7 @@
/// Mint tokens for multiple accounts.
/// @param amounts array of pairs of account address and amount
#[weight(<SelfWeightOf<T>>::create_multiple_items_ex(amounts.len() as u32))]
- fn mint_bulk(&mut self, caller: caller, amounts: Vec<(address, uint256)>) -> Result<bool> {
+ fn mint_bulk(&mut self, caller: Caller, amounts: Vec<(Address, U256)>) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let budget = self
.recorder
@@ -277,9 +277,9 @@
#[weight(<SelfWeightOf<T>>::transfer())]
fn transfer_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = to.into_sub_cross_account::<T>()?;
@@ -295,10 +295,10 @@
#[weight(<SelfWeightOf<T>>::transfer_from())]
fn transfer_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: pallet_common::eth::CrossAddress,
to: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
pallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -274,11 +274,9 @@
/// Set the collection access method.
/// @param mode Access mode
- /// 0 for Normal
- /// 1 for AllowList
/// @dev EVM selector for this function is: 0x41835d4c,
/// or in textual repr: setCollectionAccess(uint8)
- function setCollectionAccess(uint8 mode) public {
+ function setCollectionAccess(AccessMode mode) public {
require(false, stub_error);
mode;
dummy = 0;
@@ -443,6 +441,14 @@
uint256 sub;
}
+/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).
+enum AccessMode {
+ /// Access grant for owner and admins. Used as default.
+ Normal,
+ /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.
+ AllowList
+}
+
/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
struct CollectionNestingPermission {
CollectionPermissionField field;
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -43,7 +43,7 @@
use pallet_evm::{account::CrossAccountId, PrecompileHandle};
use pallet_evm_coder_substrate::call;
use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};
-use sp_core::Get;
+use sp_core::{U256, Get};
use crate::{
AccountBalance, Config, CreateItemData, NonfungibleHandle, Pallet, TokenData, TokensMinted,
@@ -63,8 +63,8 @@
#[solidity(hide)]
fn set_token_property_permission(
&mut self,
- caller: caller,
- key: string,
+ caller: Caller,
+ key: String,
is_mutable: bool,
collection_admin: bool,
token_owner: bool,
@@ -93,7 +93,7 @@
#[weight(<SelfWeightOf<T>>::set_token_property_permissions(permissions.len() as u32))]
fn set_token_property_permissions(
&mut self,
- caller: caller,
+ caller: Caller,
permissions: Vec<eth::TokenPropertyPermission>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -121,10 +121,10 @@
#[weight(<SelfWeightOf<T>>::set_token_properties(1))]
fn set_property(
&mut self,
- caller: caller,
- token_id: uint256,
- key: string,
- value: bytes,
+ caller: Caller,
+ token_id: U256,
+ key: String,
+ value: Bytes,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -154,8 +154,8 @@
#[weight(<SelfWeightOf<T>>::set_token_properties(properties.len() as u32))]
fn set_properties(
&mut self,
- caller: caller,
- token_id: uint256,
+ caller: Caller,
+ token_id: U256,
properties: Vec<eth::Property>,
) -> 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: uint256, 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)
@@ -209,9 +209,9 @@
#[weight(<SelfWeightOf<T>>::delete_token_properties(keys.len() as u32))]
fn delete_properties(
&mut self,
- token_id: uint256,
- caller: caller,
- keys: Vec<string>,
+ token_id: U256,
+ caller: Caller,
+ 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: uint256, 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()
@@ -261,11 +261,11 @@
/// any transfer, the approved address for that NFT (if any) is reset to none.
Transfer {
#[indexed]
- from: address,
+ from: Address,
#[indexed]
- to: address,
+ to: Address,
#[indexed]
- token_id: uint256,
+ token_id: U256,
},
/// @dev This emits when the approved address for an NFT is changed or
/// reaffirmed. The zero address indicates there is no approved address.
@@ -273,20 +273,20 @@
/// address for that NFT (if any) is reset to none.
Approval {
#[indexed]
- owner: address,
+ owner: Address,
#[indexed]
- approved: address,
+ approved: Address,
#[indexed]
- token_id: uint256,
+ token_id: U256,
},
/// @dev This emits when an operator is enabled or disabled for an owner.
/// The operator can manage all NFTs of the owner.
#[allow(dead_code)]
ApprovalForAll {
#[indexed]
- owner: address,
+ owner: Address,
#[indexed]
- operator: address,
+ operator: Address,
approved: bool,
},
}
@@ -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: uint256) -> 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!(
@@ -368,12 +368,12 @@
/// @param index A counter less than `totalSupply()`
/// @return The token identifier for the `index`th NFT,
/// (sort order not specified)
- fn token_by_index(&self, index: uint256) -> Result<uint256> {
+ fn token_by_index(&self, index: U256) -> Result<U256> {
Ok(index)
}
/// @dev Not implemented
- fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {
+ fn token_of_owner_by_index(&self, _owner: Address, _index: U256) -> Result<U256> {
// TODO: Not implemetable
Err("not implemented".into())
}
@@ -381,7 +381,7 @@
/// @notice Count NFTs tracked by this contract
/// @return A count of valid NFTs tracked by this contract, where each one of
/// them has an assigned and queryable owner not equal to the zero address
- fn total_supply(&self) -> Result<uint256> {
+ fn total_supply(&self) -> Result<U256> {
self.consume_store_reads(1)?;
Ok(<Pallet<T>>::total_supply(self).into())
}
@@ -396,7 +396,7 @@
/// function throws for queries about the zero address.
/// @param owner An address for whom to query the balance
/// @return The number of NFTs owned by `owner`, possibly zero
- fn balance_of(&self, owner: address) -> Result<uint256> {
+ fn balance_of(&self, owner: Address) -> Result<U256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let balance = <AccountBalance<T>>::get((self.id, owner));
@@ -407,7 +407,7 @@
/// about them do throw.
/// @param tokenId The identifier for an NFT
/// @return The address of the owner of the NFT
- fn owner_of(&self, token_id: uint256) -> Result<address> {
+ fn owner_of(&self, token_id: U256) -> Result<Address> {
self.consume_store_reads(1)?;
let token: TokenId = token_id.try_into()?;
Ok(*<TokenData<T>>::get((self.id, token))
@@ -419,21 +419,16 @@
#[solidity(rename_selector = "safeTransferFrom")]
fn safe_transfer_from_with_data(
&mut self,
- _from: address,
- _to: address,
- _token_id: uint256,
- _data: bytes,
- ) -> Result<void> {
+ _from: Address,
+ _to: Address,
+ _token_id: U256,
+ _data: Bytes,
+ ) -> Result<()> {
// TODO: Not implemetable
Err("not implemented".into())
}
/// @dev Not implemented
- fn safe_transfer_from(
- &mut self,
- _from: address,
- _to: address,
- _token_id: uint256,
- ) -> Result<void> {
+ fn safe_transfer_from(&mut self, _from: Address, _to: Address, _token_id: U256) -> Result<()> {
// TODO: Not implemetable
Err("not implemented".into())
}
@@ -450,11 +445,11 @@
#[weight(<SelfWeightOf<T>>::transfer_from())]
fn transfer_from(
&mut self,
- caller: caller,
- from: address,
- to: address,
- token_id: uint256,
- ) -> Result<void> {
+ caller: Caller,
+ from: Address,
+ to: Address,
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
let to = T::CrossAccountId::from_eth(to);
@@ -475,7 +470,7 @@
/// @param approved The new approved NFT controller
/// @param tokenId The NFT to approve
#[weight(<SelfWeightOf<T>>::approve())]
- fn approve(&mut self, caller: caller, approved: address, token_id: uint256) -> Result<void> {
+ fn approve(&mut self, caller: Caller, approved: Address, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let approved = T::CrossAccountId::from_eth(approved);
let token = token_id.try_into()?;
@@ -492,10 +487,10 @@
#[weight(<SelfWeightOf<T>>::set_allowance_for_all())]
fn set_approval_for_all(
&mut self,
- caller: caller,
- operator: address,
+ caller: Caller,
+ operator: Address,
approved: bool,
- ) -> Result<void> {
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let operator = T::CrossAccountId::from_eth(operator);
@@ -505,14 +500,14 @@
}
/// @dev Not implemented
- fn get_approved(&self, _token_id: uint256) -> Result<address> {
+ fn get_approved(&self, _token_id: U256) -> Result<Address> {
// TODO: Not implemetable
Err("not implemented".into())
}
/// @notice Tells whether the given `owner` approves the `operator`.
#[weight(<SelfWeightOf<T>>::allowance_for_all())]
- fn is_approved_for_all(&self, owner: address, operator: address) -> Result<bool> {
+ fn is_approved_for_all(&self, owner: Address, operator: Address) -> Result<bool> {
let owner = T::CrossAccountId::from_eth(owner);
let operator = T::CrossAccountId::from_eth(operator);
@@ -528,7 +523,7 @@
/// operator of the current owner.
/// @param tokenId The NFT to approve
#[weight(<SelfWeightOf<T>>::burn_item())]
- fn burn(&mut self, caller: caller, token_id: uint256) -> Result<void> {
+ fn burn(&mut self, caller: Caller, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token = token_id.try_into()?;
@@ -544,8 +539,8 @@
/// @param to The new owner
/// @return uint256 The id of the newly minted token
#[weight(<SelfWeightOf<T>>::create_item())]
- fn mint(&mut self, caller: caller, to: address) -> Result<uint256> {
- let token_id: uint256 = <TokensMinted<T>>::get(self.id)
+ fn mint(&mut self, caller: Caller, to: Address) -> Result<U256> {
+ let token_id: U256 = <TokensMinted<T>>::get(self.id)
.checked_add(1)
.ok_or("item id overflow")?
.into();
@@ -560,7 +555,7 @@
/// @param tokenId ID of the minted NFT
#[solidity(hide, rename_selector = "mint")]
#[weight(<SelfWeightOf<T>>::create_item())]
- fn mint_check_id(&mut self, caller: caller, to: address, token_id: uint256) -> Result<bool> {
+ fn mint_check_id(&mut self, caller: Caller, to: Address, token_id: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let token_id: u32 = token_id.try_into()?;
@@ -598,11 +593,11 @@
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_with_token_uri(
&mut self,
- caller: caller,
- to: address,
- token_uri: string,
- ) -> Result<uint256> {
- let token_id: uint256 = <TokensMinted<T>>::get(self.id)
+ caller: Caller,
+ to: Address,
+ token_uri: String,
+ ) -> Result<U256> {
+ let token_id: U256 = <TokensMinted<T>>::get(self.id)
.checked_add(1)
.ok_or("item id overflow")?
.into();
@@ -620,10 +615,10 @@
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_with_token_uri_check_id(
&mut self,
- caller: caller,
- to: address,
- token_id: uint256,
- token_uri: string,
+ caller: Caller,
+ to: Address,
+ token_id: U256,
+ token_uri: String,
) -> Result<bool> {
let key = key::url();
let permission = get_token_permission::<T>(self.id, &key)?;
@@ -675,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())
@@ -696,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)
@@ -709,28 +704,28 @@
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.
///
/// @param tokenId Id for the token.
- fn cross_owner_of(&self, token_id: uint256) -> Result<eth::CrossAddress> {
+ fn cross_owner_of(&self, token_id: U256) -> Result<eth::CrossAddress> {
Self::token_owner(&self, token_id.try_into()?)
.map(|o| eth::CrossAddress::from_sub_cross_account::<T>(&o))
.ok_or(Error::Revert("key too large".into()))
@@ -741,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: uint256, 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| {
@@ -770,10 +765,10 @@
#[weight(<SelfWeightOf<T>>::approve())]
fn approve_cross(
&mut self,
- caller: caller,
+ caller: Caller,
approved: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let approved = approved.into_sub_cross_account::<T>()?;
let token = token_id.try_into()?;
@@ -789,7 +784,7 @@
/// @param to The new owner
/// @param tokenId The NFT to transfer
#[weight(<SelfWeightOf<T>>::transfer())]
- fn transfer(&mut self, caller: caller, to: address, token_id: uint256) -> Result<void> {
+ fn transfer(&mut self, caller: Caller, to: Address, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let token = token_id.try_into()?;
@@ -809,10 +804,10 @@
#[weight(<SelfWeightOf<T>>::transfer())]
fn transfer_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let to = to.into_sub_cross_account::<T>()?;
let token = token_id.try_into()?;
@@ -833,11 +828,11 @@
#[weight(<SelfWeightOf<T>>::transfer())]
fn transfer_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: eth::CrossAddress,
to: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
let to = to.into_sub_cross_account::<T>()?;
@@ -858,7 +853,7 @@
/// @param tokenId The NFT to transfer
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::burn_from())]
- fn burn_from(&mut self, caller: caller, from: address, token_id: uint256) -> Result<void> {
+ fn burn_from(&mut self, caller: Caller, from: Address, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
let token = token_id.try_into()?;
@@ -880,10 +875,10 @@
#[weight(<SelfWeightOf<T>>::burn_from())]
fn burn_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
let token = token_id.try_into()?;
@@ -897,7 +892,7 @@
}
/// @notice Returns next free NFT ID.
- fn next_token_id(&self) -> Result<uint256> {
+ fn next_token_id(&self) -> Result<U256> {
self.consume_store_reads(1)?;
Ok(<TokensMinted<T>>::get(self.id)
.checked_add(1)
@@ -912,7 +907,7 @@
/// @param tokenIds IDs of the minted NFTs
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::create_multiple_items(token_ids.len() as u32))]
- fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {
+ fn mint_bulk(&mut self, caller: Caller, to: Address, token_ids: Vec<U256>) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let mut expected_index = <TokensMinted<T>>::get(self.id)
@@ -951,9 +946,9 @@
#[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]
fn mint_bulk_with_token_uri(
&mut self,
- caller: caller,
- to: address,
- tokens: Vec<(uint256, string)>,
+ caller: Caller,
+ to: Address,
+ tokens: Vec<(U256, String)>,
) -> Result<bool> {
let key = key::url();
let caller = T::CrossAccountId::from_eth(caller);
@@ -1002,10 +997,10 @@
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: eth::CrossAddress,
properties: Vec<eth::Property>,
- ) -> Result<uint256> {
+ ) -> Result<U256> {
let token_id = <TokensMinted<T>>::get(self.id)
.checked_add(1)
.ok_or("item id overflow")?;
@@ -1040,7 +1035,7 @@
}
/// @notice Returns collection helper contract address
- fn collection_helper_address(&self) -> Result<address> {
+ fn collection_helper_address(&self) -> Result<Address> {
Ok(T::ContractAddress::get())
}
}
pallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -416,11 +416,9 @@
/// Set the collection access method.
/// @param mode Access mode
- /// 0 for Normal
- /// 1 for AllowList
/// @dev EVM selector for this function is: 0x41835d4c,
/// or in textual repr: setCollectionAccess(uint8)
- function setCollectionAccess(uint8 mode) public {
+ function setCollectionAccess(AccessMode mode) public {
require(false, stub_error);
mode;
dummy = 0;
@@ -585,6 +583,14 @@
uint256 sub;
}
+/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).
+enum AccessMode {
+ /// Access grant for owner and admins. Used as default.
+ Normal,
+ /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.
+ AllowList
+}
+
/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
struct CollectionNestingPermission {
CollectionPermissionField field;
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -39,7 +39,7 @@
use pallet_evm::{account::CrossAccountId, PrecompileHandle};
use pallet_evm_coder_substrate::{call, dispatch_to_evm};
use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};
-use sp_core::{H160, Get};
+use sp_core::{H160, U256, Get};
use sp_std::{collections::btree_map::BTreeMap, vec::Vec, vec};
use up_data_structs::{
CollectionId, CollectionPropertiesVec, mapping::TokenAddressMapping, Property, PropertyKey,
@@ -66,8 +66,8 @@
#[solidity(hide)]
fn set_token_property_permission(
&mut self,
- caller: caller,
- key: string,
+ caller: Caller,
+ key: String,
is_mutable: bool,
collection_admin: bool,
token_owner: bool,
@@ -96,7 +96,7 @@
#[weight(<SelfWeightOf<T>>::set_token_property_permissions(permissions.len() as u32))]
fn set_token_property_permissions(
&mut self,
- caller: caller,
+ caller: Caller,
permissions: Vec<eth::TokenPropertyPermission>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -124,10 +124,10 @@
#[weight(<SelfWeightOf<T>>::set_token_properties(1))]
fn set_property(
&mut self,
- caller: caller,
- token_id: uint256,
- key: string,
- value: bytes,
+ caller: Caller,
+ token_id: U256,
+ key: String,
+ value: Bytes,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -157,8 +157,8 @@
#[weight(<SelfWeightOf<T>>::set_token_properties(properties.len() as u32))]
fn set_properties(
&mut self,
- caller: caller,
- token_id: uint256,
+ caller: Caller,
+ token_id: U256,
properties: Vec<eth::Property>,
) -> 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: uint256, 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)
@@ -212,9 +212,9 @@
#[weight(<SelfWeightOf<T>>::delete_token_properties(keys.len() as u32))]
fn delete_properties(
&mut self,
- token_id: uint256,
- caller: caller,
- keys: Vec<string>,
+ token_id: U256,
+ caller: Caller,
+ 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: uint256, 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()
@@ -262,28 +262,28 @@
/// may be created and assigned without emitting Transfer.
Transfer {
#[indexed]
- from: address,
+ from: Address,
#[indexed]
- to: address,
+ to: Address,
#[indexed]
- token_id: uint256,
+ token_id: U256,
},
/// @dev Not supported
Approval {
#[indexed]
- owner: address,
+ owner: Address,
#[indexed]
- approved: address,
+ approved: Address,
#[indexed]
- token_id: uint256,
+ token_id: U256,
},
/// @dev Not supported
#[allow(dead_code)]
ApprovalForAll {
#[indexed]
- owner: address,
+ owner: Address,
#[indexed]
- operator: address,
+ operator: Address,
approved: bool,
},
}
@@ -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: uint256) -> 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!(
@@ -365,12 +365,12 @@
/// @param index A counter less than `totalSupply()`
/// @return The token identifier for the `index`th NFT,
/// (sort order not specified)
- fn token_by_index(&self, index: uint256) -> Result<uint256> {
+ fn token_by_index(&self, index: U256) -> Result<U256> {
Ok(index)
}
/// Not implemented
- fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {
+ fn token_of_owner_by_index(&self, _owner: Address, _index: U256) -> Result<U256> {
// TODO: Not implemetable
Err("not implemented".into())
}
@@ -378,7 +378,7 @@
/// @notice Count RFTs tracked by this contract
/// @return A count of valid RFTs tracked by this contract, where each one of
/// them has an assigned and queryable owner not equal to the zero address
- fn total_supply(&self) -> Result<uint256> {
+ fn total_supply(&self) -> Result<U256> {
self.consume_store_reads(1)?;
Ok(<Pallet<T>>::total_supply(self).into())
}
@@ -393,7 +393,7 @@
/// function throws for queries about the zero address.
/// @param owner An address for whom to query the balance
/// @return The number of RFTs owned by `owner`, possibly zero
- fn balance_of(&self, owner: address) -> Result<uint256> {
+ fn balance_of(&self, owner: Address) -> Result<U256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let balance = <AccountBalance<T>>::get((self.id, owner));
@@ -407,7 +407,7 @@
/// the tokens that are partially owned.
/// @param tokenId The identifier for an RFT
/// @return The address of the owner of the RFT
- fn owner_of(&self, token_id: uint256) -> Result<address> {
+ fn owner_of(&self, token_id: U256) -> Result<Address> {
self.consume_store_reads(2)?;
let token = token_id.try_into()?;
let owner = <Pallet<T>>::token_owner(self.id, token);
@@ -420,23 +420,18 @@
#[solidity(rename_selector = "safeTransferFrom")]
fn safe_transfer_from_with_data(
&mut self,
- _from: address,
- _to: address,
- _token_id: uint256,
- _data: bytes,
- ) -> Result<void> {
+ _from: Address,
+ _to: Address,
+ _token_id: U256,
+ _data: Bytes,
+ ) -> Result<()> {
// TODO: Not implemetable
Err("not implemented".into())
}
/// @dev Not implemented
#[solidity(rename_selector = "safeTransferFrom")]
- fn safe_transfer_from(
- &mut self,
- _from: address,
- _to: address,
- _token_id: uint256,
- ) -> Result<void> {
+ fn safe_transfer_from(&mut self, _from: Address, _to: Address, _token_id: U256) -> Result<()> {
// TODO: Not implemetable
Err("not implemented".into())
}
@@ -454,11 +449,11 @@
#[weight(<SelfWeightOf<T>>::transfer_from_creating_removing())]
fn transfer_from(
&mut self,
- caller: caller,
- from: address,
- to: address,
- token_id: uint256,
- ) -> Result<void> {
+ caller: Caller,
+ from: Address,
+ to: Address,
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
let to = T::CrossAccountId::from_eth(to);
@@ -477,7 +472,7 @@
}
/// @dev Not implemented
- fn approve(&mut self, _caller: caller, _approved: address, _token_id: uint256) -> Result<void> {
+ fn approve(&mut self, _caller: Caller, _approved: Address, _token_id: U256) -> Result<()> {
Err("not implemented".into())
}
@@ -488,10 +483,10 @@
#[weight(<SelfWeightOf<T>>::set_allowance_for_all())]
fn set_approval_for_all(
&mut self,
- caller: caller,
- operator: address,
+ caller: Caller,
+ operator: Address,
approved: bool,
- ) -> Result<void> {
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let operator = T::CrossAccountId::from_eth(operator);
@@ -501,14 +496,14 @@
}
/// @dev Not implemented
- fn get_approved(&self, _token_id: uint256) -> Result<address> {
+ fn get_approved(&self, _token_id: U256) -> Result<Address> {
// TODO: Not implemetable
Err("not implemented".into())
}
/// @notice Tells whether the given `owner` approves the `operator`.
#[weight(<SelfWeightOf<T>>::allowance_for_all())]
- fn is_approved_for_all(&self, owner: address, operator: address) -> Result<bool> {
+ fn is_approved_for_all(&self, owner: Address, operator: Address) -> Result<bool> {
let owner = T::CrossAccountId::from_eth(owner);
let operator = T::CrossAccountId::from_eth(operator);
@@ -556,7 +551,7 @@
/// operator of the current owner.
/// @param tokenId The RFT to approve
#[weight(<SelfWeightOf<T>>::burn_item_fully())]
- fn burn(&mut self, caller: caller, token_id: uint256) -> Result<void> {
+ fn burn(&mut self, caller: Caller, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token = token_id.try_into()?;
@@ -575,8 +570,8 @@
/// @param to The new owner
/// @return uint256 The id of the newly minted token
#[weight(<SelfWeightOf<T>>::create_item())]
- fn mint(&mut self, caller: caller, to: address) -> Result<uint256> {
- let token_id: uint256 = <TokensMinted<T>>::get(self.id)
+ fn mint(&mut self, caller: Caller, to: Address) -> Result<U256> {
+ let token_id: U256 = <TokensMinted<T>>::get(self.id)
.checked_add(1)
.ok_or("item id overflow")?
.into();
@@ -591,7 +586,7 @@
/// @param tokenId ID of the minted RFT
#[solidity(hide, rename_selector = "mint")]
#[weight(<SelfWeightOf<T>>::create_item())]
- fn mint_check_id(&mut self, caller: caller, to: address, token_id: uint256) -> Result<bool> {
+ fn mint_check_id(&mut self, caller: Caller, to: Address, token_id: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let token_id: u32 = token_id.try_into()?;
@@ -634,11 +629,11 @@
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_with_token_uri(
&mut self,
- caller: caller,
- to: address,
- token_uri: string,
- ) -> Result<uint256> {
- let token_id: uint256 = <TokensMinted<T>>::get(self.id)
+ caller: Caller,
+ to: Address,
+ token_uri: String,
+ ) -> Result<U256> {
+ let token_id: U256 = <TokensMinted<T>>::get(self.id)
.checked_add(1)
.ok_or("item id overflow")?
.into();
@@ -656,10 +651,10 @@
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_with_token_uri_check_id(
&mut self,
- caller: caller,
- to: address,
- token_id: uint256,
- token_uri: string,
+ caller: Caller,
+ to: Address,
+ token_id: U256,
+ token_uri: String,
) -> Result<bool> {
let key = key::url();
let permission = get_token_permission::<T>(self.id, &key)?;
@@ -713,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())
@@ -734,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)
@@ -747,28 +742,28 @@
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.
///
/// @param tokenId Id for the token.
- fn cross_owner_of(&self, token_id: uint256) -> Result<eth::CrossAddress> {
+ fn cross_owner_of(&self, token_id: U256) -> Result<eth::CrossAddress> {
Self::token_owner(&self, token_id.try_into()?)
.map(|o| eth::CrossAddress::from_sub_cross_account::<T>(&o))
.ok_or(Error::Revert("key too large".into()))
@@ -779,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: uint256, 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| {
@@ -805,7 +800,7 @@
/// @param to The new owner
/// @param tokenId The RFT to transfer
#[weight(<SelfWeightOf<T>>::transfer_creating_removing())]
- fn transfer(&mut self, caller: caller, to: address, token_id: uint256) -> Result<void> {
+ fn transfer(&mut self, caller: Caller, to: Address, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let token = token_id.try_into()?;
@@ -830,10 +825,10 @@
#[weight(<SelfWeightOf<T>>::transfer_creating_removing())]
fn transfer_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let to = to.into_sub_cross_account::<T>()?;
let token = token_id.try_into()?;
@@ -858,11 +853,11 @@
#[weight(<SelfWeightOf<T>>::transfer_creating_removing())]
fn transfer_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: eth::CrossAddress,
to: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
let to = to.into_sub_cross_account::<T>()?;
@@ -888,7 +883,7 @@
/// @param tokenId The RFT to transfer
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::burn_from())]
- fn burn_from(&mut self, caller: caller, from: address, token_id: uint256) -> Result<void> {
+ fn burn_from(&mut self, caller: Caller, from: Address, token_id: U256) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
let token = token_id.try_into()?;
@@ -914,10 +909,10 @@
#[weight(<SelfWeightOf<T>>::burn_from())]
fn burn_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: eth::CrossAddress,
- token_id: uint256,
- ) -> Result<void> {
+ token_id: U256,
+ ) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
let token = token_id.try_into()?;
@@ -934,7 +929,7 @@
}
/// @notice Returns next free RFT ID.
- fn next_token_id(&self) -> Result<uint256> {
+ fn next_token_id(&self) -> Result<U256> {
self.consume_store_reads(1)?;
Ok(<TokensMinted<T>>::get(self.id)
.checked_add(1)
@@ -949,7 +944,7 @@
/// @param tokenIds IDs of the minted RFTs
#[solidity(hide)]
#[weight(<SelfWeightOf<T>>::create_multiple_items(token_ids.len() as u32))]
- fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {
+ fn mint_bulk(&mut self, caller: Caller, to: Address, token_ids: Vec<U256>) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let mut expected_index = <TokensMinted<T>>::get(self.id)
@@ -994,9 +989,9 @@
#[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]
fn mint_bulk_with_token_uri(
&mut self,
- caller: caller,
- to: address,
- tokens: Vec<(uint256, string)>,
+ caller: Caller,
+ to: Address,
+ tokens: Vec<(U256, String)>,
) -> Result<bool> {
let key = key::url();
let caller = T::CrossAccountId::from_eth(caller);
@@ -1051,10 +1046,10 @@
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: eth::CrossAddress,
properties: Vec<eth::Property>,
- ) -> Result<uint256> {
+ ) -> Result<U256> {
let token_id = <TokensMinted<T>>::get(self.id)
.checked_add(1)
.ok_or("item id overflow")?;
@@ -1093,7 +1088,7 @@
/// Returns EVM address for refungible token
///
/// @param token ID of the token
- fn token_contract_address(&self, token: uint256) -> Result<address> {
+ fn token_contract_address(&self, token: U256) -> Result<Address> {
Ok(T::EvmTokenAddressMapping::token_to_address(
self.id,
token.try_into().map_err(|_| "token id overflow")?,
@@ -1101,7 +1096,7 @@
}
/// @notice Returns collection helper contract address
- fn collection_helper_address(&self) -> Result<address> {
+ fn collection_helper_address(&self) -> Result<Address> {
Ok(T::ContractAddress::get())
}
}
pallets/refungible/src/erc_token.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc_token.rs
+++ b/pallets/refungible/src/erc_token.rs
@@ -37,6 +37,7 @@
use pallet_evm_coder_substrate::{call, dispatch_to_evm, WithRecorder};
use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};
use sp_std::vec::Vec;
+use sp_core::U256;
use up_data_structs::TokenId;
use crate::{
@@ -51,11 +52,11 @@
#[solidity_interface(name = ERC1633)]
impl<T: Config> RefungibleTokenHandle<T> {
- fn parent_token(&self) -> Result<address> {
+ fn parent_token(&self) -> Result<Address> {
Ok(collection_id_to_address(self.id))
}
- fn parent_token_id(&self) -> Result<uint256> {
+ fn parent_token_id(&self) -> Result<U256> {
Ok(self.1.into())
}
}
@@ -68,19 +69,19 @@
/// of burning tokens the transfer is to 0.
Transfer {
#[indexed]
- from: address,
+ from: Address,
#[indexed]
- to: address,
- value: uint256,
+ to: Address,
+ value: U256,
},
/// @dev This event is emitted when the amount of tokens (value) is approved
/// by the owner to be used by the spender.
Approval {
#[indexed]
- owner: address,
+ owner: Address,
#[indexed]
- spender: address,
- value: uint256,
+ spender: Address,
+ value: U256,
},
}
@@ -91,25 +92,25 @@
#[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
- fn total_supply(&self) -> Result<uint256> {
+ fn total_supply(&self) -> Result<U256> {
self.consume_store_reads(1)?;
Ok(<TotalSupply<T>>::get((self.id, self.1)).into())
}
/// @dev Not supported
- fn decimals(&self) -> Result<uint8> {
+ fn decimals(&self) -> Result<u8> {
// Decimals aren't supported for refungible tokens
Ok(0)
}
@@ -117,7 +118,7 @@
/// @dev Gets the balance of the specified address.
/// @param owner The address to query the balance of.
/// @return An uint256 representing the amount owned by the passed address.
- fn balance_of(&self, owner: address) -> Result<uint256> {
+ fn balance_of(&self, owner: Address) -> Result<U256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let balance = <Balance<T>>::get((self.id, self.1, owner));
@@ -128,7 +129,7 @@
/// @param to The address to transfer to.
/// @param amount The amount to be transferred.
#[weight(<CommonWeights<T>>::transfer())]
- fn transfer(&mut self, caller: caller, to: address, amount: uint256) -> Result<bool> {
+ fn transfer(&mut self, caller: Caller, to: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -148,10 +149,10 @@
#[weight(<CommonWeights<T>>::transfer_from())]
fn transfer_from(
&mut self,
- caller: caller,
- from: address,
- to: address,
- amount: uint256,
+ caller: Caller,
+ from: Address,
+ to: Address,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
@@ -174,7 +175,7 @@
/// @param spender The address which will spend the funds.
/// @param amount The amount of tokens to be spent.
#[weight(<SelfWeightOf<T>>::approve())]
- fn approve(&mut self, caller: caller, spender: address, amount: uint256) -> Result<bool> {
+ fn approve(&mut self, caller: Caller, spender: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let spender = T::CrossAccountId::from_eth(spender);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -188,7 +189,7 @@
/// @param owner address The address which owns the funds.
/// @param spender address The address which will spend the funds.
/// @return A uint256 specifying the amount of tokens still available for the spender.
- fn allowance(&self, owner: address, spender: address) -> Result<uint256> {
+ fn allowance(&self, owner: Address, spender: Address) -> Result<U256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let spender = T::CrossAccountId::from_eth(spender);
@@ -208,7 +209,7 @@
/// @param amount The amount that will be burnt.
#[weight(<SelfWeightOf<T>>::burn_from())]
#[solidity(hide)]
- fn burn_from(&mut self, caller: caller, from: address, amount: uint256) -> Result<bool> {
+ fn burn_from(&mut self, caller: Caller, from: Address, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = T::CrossAccountId::from_eth(from);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -228,9 +229,9 @@
#[weight(<SelfWeightOf<T>>::burn_from())]
fn burn_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
@@ -254,9 +255,9 @@
#[weight(<SelfWeightOf<T>>::approve())]
fn approve_cross(
&mut self,
- caller: caller,
+ caller: Caller,
spender: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let spender = spender.into_sub_cross_account::<T>()?;
@@ -270,7 +271,7 @@
/// Throws if `msg.sender` doesn't owns all of the tokens.
/// @param amount New total amount of the tokens.
#[weight(<SelfWeightOf<T>>::repartition_item())]
- fn repartition(&mut self, caller: caller, amount: uint256) -> Result<bool> {
+ fn repartition(&mut self, caller: Caller, amount: U256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let amount = amount.try_into().map_err(|_| "amount overflow")?;
@@ -284,9 +285,9 @@
#[weight(<CommonWeights<T>>::transfer())]
fn transfer_cross(
&mut self,
- caller: caller,
+ caller: Caller,
to: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let to = to.into_sub_cross_account::<T>()?;
@@ -307,10 +308,10 @@
#[weight(<CommonWeights<T>>::transfer_from())]
fn transfer_from_cross(
&mut self,
- caller: caller,
+ caller: Caller,
from: pallet_common::eth::CrossAddress,
to: pallet_common::eth::CrossAddress,
- amount: uint256,
+ amount: U256,
) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
let from = from.into_sub_cross_account::<T>()?;
pallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth1// SPDX-License-Identifier: OTHER2// This code is automatically generated34pragma solidity >=0.8.0 <0.9.0;56/// @dev common stubs holder7contract Dummy {8 uint8 dummy;9 string stub_error = "this contract is implemented in native";10}1112contract ERC165 is Dummy {13 function supportsInterface(bytes4 interfaceID) external view returns (bool) {14 require(false, stub_error);15 interfaceID;16 return true;17 }18}1920/// @title A contract that allows to set and delete token properties and change token property permissions.21/// @dev the ERC-165 identifier for this interface is 0xde0695c222contract TokenProperties is Dummy, ERC165 {23 // /// @notice Set permissions for token property.24 // /// @dev Throws error if `msg.sender` is not admin or owner of the collection.25 // /// @param key Property key.26 // /// @param isMutable Permission to mutate property.27 // /// @param collectionAdmin Permission to mutate property by collection admin if property is mutable.28 // /// @param tokenOwner Permission to mutate property by token owner if property is mutable.29 // /// @dev EVM selector for this function is: 0x222d97fa,30 // /// or in textual repr: setTokenPropertyPermission(string,bool,bool,bool)31 // function setTokenPropertyPermission(string memory key, bool isMutable, bool collectionAdmin, bool tokenOwner) public {32 // require(false, stub_error);33 // key;34 // isMutable;35 // collectionAdmin;36 // tokenOwner;37 // dummy = 0;38 // }3940 /// @notice Set permissions for token property.41 /// @dev Throws error if `msg.sender` is not admin or owner of the collection.42 /// @param permissions Permissions for keys.43 /// @dev EVM selector for this function is: 0xbd92983a,44 /// or in textual repr: setTokenPropertyPermissions((string,(uint8,bool)[])[])45 function setTokenPropertyPermissions(TokenPropertyPermission[] memory permissions) public {46 require(false, stub_error);47 permissions;48 dummy = 0;49 }5051 /// @notice Get permissions for token properties.52 /// @dev EVM selector for this function is: 0xf23d7790,53 /// or in textual repr: tokenPropertyPermissions()54 function tokenPropertyPermissions() public view returns (TokenPropertyPermission[] memory) {55 require(false, stub_error);56 dummy;57 return new TokenPropertyPermission[](0);58 }5960 // /// @notice Set token property value.61 // /// @dev Throws error if `msg.sender` has no permission to edit the property.62 // /// @param tokenId ID of the token.63 // /// @param key Property key.64 // /// @param value Property value.65 // /// @dev EVM selector for this function is: 0x1752d67b,66 // /// or in textual repr: setProperty(uint256,string,bytes)67 // function setProperty(uint256 tokenId, string memory key, bytes memory value) public {68 // require(false, stub_error);69 // tokenId;70 // key;71 // value;72 // dummy = 0;73 // }7475 /// @notice Set token properties value.76 /// @dev Throws error if `msg.sender` has no permission to edit the property.77 /// @param tokenId ID of the token.78 /// @param properties settable properties79 /// @dev EVM selector for this function is: 0x14ed3a6e,80 /// or in textual repr: setProperties(uint256,(string,bytes)[])81 function setProperties(uint256 tokenId, Property[] memory properties) public {82 require(false, stub_error);83 tokenId;84 properties;85 dummy = 0;86 }8788 // /// @notice Delete token property value.89 // /// @dev Throws error if `msg.sender` has no permission to edit the property.90 // /// @param tokenId ID of the token.91 // /// @param key Property key.92 // /// @dev EVM selector for this function is: 0x066111d1,93 // /// or in textual repr: deleteProperty(uint256,string)94 // function deleteProperty(uint256 tokenId, string memory key) public {95 // require(false, stub_error);96 // tokenId;97 // key;98 // dummy = 0;99 // }100101 /// @notice Delete token properties value.102 /// @dev Throws error if `msg.sender` has no permission to edit the property.103 /// @param tokenId ID of the token.104 /// @param keys Properties key.105 /// @dev EVM selector for this function is: 0xc472d371,106 /// or in textual repr: deleteProperties(uint256,string[])107 function deleteProperties(uint256 tokenId, string[] memory keys) public {108 require(false, stub_error);109 tokenId;110 keys;111 dummy = 0;112 }113114 /// @notice Get token property value.115 /// @dev Throws error if key not found116 /// @param tokenId ID of the token.117 /// @param key Property key.118 /// @return Property value bytes119 /// @dev EVM selector for this function is: 0x7228c327,120 /// or in textual repr: property(uint256,string)121 function property(uint256 tokenId, string memory key) public view returns (bytes memory) {122 require(false, stub_error);123 tokenId;124 key;125 dummy;126 return hex"";127 }128}129130/// Ethereum representation of collection [`PropertyKey`](up_data_structs::PropertyKey) and [`PropertyValue`](up_data_structs::PropertyValue).131struct Property {132 string key;133 bytes value;134}135136/// Ethereum representation of Token Property Permissions.137struct TokenPropertyPermission {138 /// Token property key.139 string key;140 /// Token property permissions.141 PropertyPermission[] permissions;142}143144/// Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) as an key and value.145struct PropertyPermission {146 /// TokenPermission field.147 TokenPermissionField code;148 /// TokenPermission value.149 bool value;150}151152/// Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration.153enum TokenPermissionField {154 /// Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`]155 Mutable,156 /// Change permission for the collection administrator. See [`up_data_structs::PropertyPermission::token_owner`]157 TokenOwner,158 /// Permission to change the property for the owner of the token. See [`up_data_structs::PropertyPermission::collection_admin`]159 CollectionAdmin160}161162/// @title A contract that allows you to work with collections.163/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1164contract Collection is Dummy, ERC165 {165 // /// Set collection property.166 // ///167 // /// @param key Property key.168 // /// @param value Propery value.169 // /// @dev EVM selector for this function is: 0x2f073f66,170 // /// or in textual repr: setCollectionProperty(string,bytes)171 // function setCollectionProperty(string memory key, bytes memory value) public {172 // require(false, stub_error);173 // key;174 // value;175 // dummy = 0;176 // }177178 /// Set collection properties.179 ///180 /// @param properties Vector of properties key/value pair.181 /// @dev EVM selector for this function is: 0x50b26b2a,182 /// or in textual repr: setCollectionProperties((string,bytes)[])183 function setCollectionProperties(Property[] memory properties) public {184 require(false, stub_error);185 properties;186 dummy = 0;187 }188189 // /// Delete collection property.190 // ///191 // /// @param key Property key.192 // /// @dev EVM selector for this function is: 0x7b7debce,193 // /// or in textual repr: deleteCollectionProperty(string)194 // function deleteCollectionProperty(string memory key) public {195 // require(false, stub_error);196 // key;197 // dummy = 0;198 // }199200 /// Delete collection properties.201 ///202 /// @param keys Properties keys.203 /// @dev EVM selector for this function is: 0xee206ee3,204 /// or in textual repr: deleteCollectionProperties(string[])205 function deleteCollectionProperties(string[] memory keys) public {206 require(false, stub_error);207 keys;208 dummy = 0;209 }210211 /// Get collection property.212 ///213 /// @dev Throws error if key not found.214 ///215 /// @param key Property key.216 /// @return bytes The property corresponding to the key.217 /// @dev EVM selector for this function is: 0xcf24fd6d,218 /// or in textual repr: collectionProperty(string)219 function collectionProperty(string memory key) public view returns (bytes memory) {220 require(false, stub_error);221 key;222 dummy;223 return hex"";224 }225226 /// Get collection properties.227 ///228 /// @param keys Properties keys. Empty keys for all propertyes.229 /// @return Vector of properties key/value pairs.230 /// @dev EVM selector for this function is: 0x285fb8e6,231 /// or in textual repr: collectionProperties(string[])232 function collectionProperties(string[] memory keys) public view returns (Property[] memory) {233 require(false, stub_error);234 keys;235 dummy;236 return new Property[](0);237 }238239 // /// Set the sponsor of the collection.240 // ///241 // /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.242 // ///243 // /// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.244 // /// @dev EVM selector for this function is: 0x7623402e,245 // /// or in textual repr: setCollectionSponsor(address)246 // function setCollectionSponsor(address sponsor) public {247 // require(false, stub_error);248 // sponsor;249 // dummy = 0;250 // }251252 /// Set the sponsor of the collection.253 ///254 /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.255 ///256 /// @param sponsor Cross account address of the sponsor from whose account funds will be debited for operations with the contract.257 /// @dev EVM selector for this function is: 0x84a1d5a8,258 /// or in textual repr: setCollectionSponsorCross((address,uint256))259 function setCollectionSponsorCross(CrossAddress memory sponsor) public {260 require(false, stub_error);261 sponsor;262 dummy = 0;263 }264265 /// Whether there is a pending sponsor.266 /// @dev EVM selector for this function is: 0x058ac185,267 /// or in textual repr: hasCollectionPendingSponsor()268 function hasCollectionPendingSponsor() public view returns (bool) {269 require(false, stub_error);270 dummy;271 return false;272 }273274 /// Collection sponsorship confirmation.275 ///276 /// @dev After setting the sponsor for the collection, it must be confirmed with this function.277 /// @dev EVM selector for this function is: 0x3c50e97a,278 /// or in textual repr: confirmCollectionSponsorship()279 function confirmCollectionSponsorship() public {280 require(false, stub_error);281 dummy = 0;282 }283284 /// Remove collection sponsor.285 /// @dev EVM selector for this function is: 0x6e0326a3,286 /// or in textual repr: removeCollectionSponsor()287 function removeCollectionSponsor() public {288 require(false, stub_error);289 dummy = 0;290 }291292 /// Get current sponsor.293 ///294 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.295 /// @dev EVM selector for this function is: 0x6ec0a9f1,296 /// or in textual repr: collectionSponsor()297 function collectionSponsor() public view returns (CrossAddress memory) {298 require(false, stub_error);299 dummy;300 return CrossAddress(0x0000000000000000000000000000000000000000, 0);301 }302303 /// Get current collection limits.304 ///305 /// @return Array of collection limits306 /// @dev EVM selector for this function is: 0xf63bc572,307 /// or in textual repr: collectionLimits()308 function collectionLimits() public view returns (CollectionLimit[] memory) {309 require(false, stub_error);310 dummy;311 return new CollectionLimit[](0);312 }313314 /// Set limits for the collection.315 /// @dev Throws error if limit not found.316 /// @param limit Some limit.317 /// @dev EVM selector for this function is: 0x2316ee74,318 /// or in textual repr: setCollectionLimit((uint8,(bool,uint256)))319 function setCollectionLimit(CollectionLimit memory limit) public {320 require(false, stub_error);321 limit;322 dummy = 0;323 }324325 /// Get contract address.326 /// @dev EVM selector for this function is: 0xf6b4dfb4,327 /// or in textual repr: contractAddress()328 function contractAddress() public view returns (address) {329 require(false, stub_error);330 dummy;331 return 0x0000000000000000000000000000000000000000;332 }333334 /// Add collection admin.335 /// @param newAdmin Cross account administrator address.336 /// @dev EVM selector for this function is: 0x859aa7d6,337 /// or in textual repr: addCollectionAdminCross((address,uint256))338 function addCollectionAdminCross(CrossAddress memory newAdmin) public {339 require(false, stub_error);340 newAdmin;341 dummy = 0;342 }343344 /// Remove collection admin.345 /// @param admin Cross account administrator address.346 /// @dev EVM selector for this function is: 0x6c0cd173,347 /// or in textual repr: removeCollectionAdminCross((address,uint256))348 function removeCollectionAdminCross(CrossAddress memory admin) public {349 require(false, stub_error);350 admin;351 dummy = 0;352 }353354 // /// Add collection admin.355 // /// @param newAdmin Address of the added administrator.356 // /// @dev EVM selector for this function is: 0x92e462c7,357 // /// or in textual repr: addCollectionAdmin(address)358 // function addCollectionAdmin(address newAdmin) public {359 // require(false, stub_error);360 // newAdmin;361 // dummy = 0;362 // }363364 // /// Remove collection admin.365 // ///366 // /// @param admin Address of the removed administrator.367 // /// @dev EVM selector for this function is: 0xfafd7b42,368 // /// or in textual repr: removeCollectionAdmin(address)369 // function removeCollectionAdmin(address admin) public {370 // require(false, stub_error);371 // admin;372 // dummy = 0;373 // }374375 /// Toggle accessibility of collection nesting.376 ///377 /// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'378 /// @dev EVM selector for this function is: 0x112d4586,379 /// or in textual repr: setCollectionNesting(bool)380 function setCollectionNesting(bool enable) public {381 require(false, stub_error);382 enable;383 dummy = 0;384 }385386 /// Toggle accessibility of collection nesting.387 ///388 /// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'389 /// @param collections Addresses of collections that will be available for nesting.390 /// @dev EVM selector for this function is: 0x64872396,391 /// or in textual repr: setCollectionNesting(bool,address[])392 function setCollectionNesting(bool enable, address[] memory collections) public {393 require(false, stub_error);394 enable;395 collections;396 dummy = 0;397 }398399 /// Returns nesting for a collection400 /// @dev EVM selector for this function is: 0x22d25bfe,401 /// or in textual repr: collectionNestingRestrictedCollectionIds()402 function collectionNestingRestrictedCollectionIds() public view returns (CollectionNesting memory) {403 require(false, stub_error);404 dummy;405 return CollectionNesting(false, new uint256[](0));406 }407408 /// Returns permissions for a collection409 /// @dev EVM selector for this function is: 0x5b2eaf4b,410 /// or in textual repr: collectionNestingPermissions()411 function collectionNestingPermissions() public view returns (CollectionNestingPermission[] memory) {412 require(false, stub_error);413 dummy;414 return new CollectionNestingPermission[](0);415 }416417 /// Set the collection access method.418 /// @param mode Access mode419 /// 0 for Normal420 /// 1 for AllowList421 /// @dev EVM selector for this function is: 0x41835d4c,422 /// or in textual repr: setCollectionAccess(uint8)423 function setCollectionAccess(uint8 mode) public {424 require(false, stub_error);425 mode;426 dummy = 0;427 }428429 /// Checks that user allowed to operate with collection.430 ///431 /// @param user User address to check.432 /// @dev EVM selector for this function is: 0x91b6df49,433 /// or in textual repr: allowlistedCross((address,uint256))434 function allowlistedCross(CrossAddress memory user) public view returns (bool) {435 require(false, stub_error);436 user;437 dummy;438 return false;439 }440441 // /// Add the user to the allowed list.442 // ///443 // /// @param user Address of a trusted user.444 // /// @dev EVM selector for this function is: 0x67844fe6,445 // /// or in textual repr: addToCollectionAllowList(address)446 // function addToCollectionAllowList(address user) public {447 // require(false, stub_error);448 // user;449 // dummy = 0;450 // }451452 /// Add user to allowed list.453 ///454 /// @param user User cross account address.455 /// @dev EVM selector for this function is: 0xa0184a3a,456 /// or in textual repr: addToCollectionAllowListCross((address,uint256))457 function addToCollectionAllowListCross(CrossAddress memory user) public {458 require(false, stub_error);459 user;460 dummy = 0;461 }462463 // /// Remove the user from the allowed list.464 // ///465 // /// @param user Address of a removed user.466 // /// @dev EVM selector for this function is: 0x85c51acb,467 // /// or in textual repr: removeFromCollectionAllowList(address)468 // function removeFromCollectionAllowList(address user) public {469 // require(false, stub_error);470 // user;471 // dummy = 0;472 // }473474 /// Remove user from allowed list.475 ///476 /// @param user User cross account address.477 /// @dev EVM selector for this function is: 0x09ba452a,478 /// or in textual repr: removeFromCollectionAllowListCross((address,uint256))479 function removeFromCollectionAllowListCross(CrossAddress memory user) public {480 require(false, stub_error);481 user;482 dummy = 0;483 }484485 /// Switch permission for minting.486 ///487 /// @param mode Enable if "true".488 /// @dev EVM selector for this function is: 0x00018e84,489 /// or in textual repr: setCollectionMintMode(bool)490 function setCollectionMintMode(bool mode) public {491 require(false, stub_error);492 mode;493 dummy = 0;494 }495496 // /// Check that account is the owner or admin of the collection497 // ///498 // /// @param user account to verify499 // /// @return "true" if account is the owner or admin500 // /// @dev EVM selector for this function is: 0x9811b0c7,501 // /// or in textual repr: isOwnerOrAdmin(address)502 // function isOwnerOrAdmin(address user) public view returns (bool) {503 // require(false, stub_error);504 // user;505 // dummy;506 // return false;507 // }508509 /// Check that account is the owner or admin of the collection510 ///511 /// @param user User cross account to verify512 /// @return "true" if account is the owner or admin513 /// @dev EVM selector for this function is: 0x3e75a905,514 /// or in textual repr: isOwnerOrAdminCross((address,uint256))515 function isOwnerOrAdminCross(CrossAddress memory user) public view returns (bool) {516 require(false, stub_error);517 user;518 dummy;519 return false;520 }521522 /// Returns collection type523 ///524 /// @return `Fungible` or `NFT` or `ReFungible`525 /// @dev EVM selector for this function is: 0xd34b55b8,526 /// or in textual repr: uniqueCollectionType()527 function uniqueCollectionType() public view returns (string memory) {528 require(false, stub_error);529 dummy;530 return "";531 }532533 /// Get collection owner.534 ///535 /// @return Tuble with sponsor address and his substrate mirror.536 /// If address is canonical then substrate mirror is zero and vice versa.537 /// @dev EVM selector for this function is: 0xdf727d3b,538 /// or in textual repr: collectionOwner()539 function collectionOwner() public view returns (CrossAddress memory) {540 require(false, stub_error);541 dummy;542 return CrossAddress(0x0000000000000000000000000000000000000000, 0);543 }544545 // /// Changes collection owner to another account546 // ///547 // /// @dev Owner can be changed only by current owner548 // /// @param newOwner new owner account549 // /// @dev EVM selector for this function is: 0x4f53e226,550 // /// or in textual repr: changeCollectionOwner(address)551 // function changeCollectionOwner(address newOwner) public {552 // require(false, stub_error);553 // newOwner;554 // dummy = 0;555 // }556557 /// Get collection administrators558 ///559 /// @return Vector of tuples with admins address and his substrate mirror.560 /// If address is canonical then substrate mirror is zero and vice versa.561 /// @dev EVM selector for this function is: 0x5813216b,562 /// or in textual repr: collectionAdmins()563 function collectionAdmins() public view returns (CrossAddress[] memory) {564 require(false, stub_error);565 dummy;566 return new CrossAddress[](0);567 }568569 /// Changes collection owner to another account570 ///571 /// @dev Owner can be changed only by current owner572 /// @param newOwner new owner cross account573 /// @dev EVM selector for this function is: 0x6496c497,574 /// or in textual repr: changeCollectionOwnerCross((address,uint256))575 function changeCollectionOwnerCross(CrossAddress memory newOwner) public {576 require(false, stub_error);577 newOwner;578 dummy = 0;579 }580}581582/// Cross account struct583struct CrossAddress {584 address eth;585 uint256 sub;586}587588/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.589struct CollectionNestingPermission {590 CollectionPermissionField field;591 bool value;592}593594/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.595enum CollectionPermissionField {596 /// Owner of token can nest tokens under it.597 TokenOwner,598 /// Admin of token collection can nest tokens under token.599 CollectionAdmin600}601602/// Nested collections.603struct CollectionNesting {604 bool token_owner;605 uint256[] ids;606}607608/// [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.609struct CollectionLimit {610 CollectionLimitField field;611 OptionUint256 value;612}613614/// Optional value615struct OptionUint256 {616 /// Shows the status of accessibility of value617 bool status;618 /// Actual value if `status` is true619 uint256 value;620}621622/// [`CollectionLimits`](up_data_structs::CollectionLimits) fields representation for EVM.623enum CollectionLimitField {624 /// How many tokens can a user have on one account.625 AccountTokenOwnership,626 /// How many bytes of data are available for sponsorship.627 SponsoredDataSize,628 /// In any case, chain default: [`SponsoringRateLimit::SponsoringDisabled`]629 SponsoredDataRateLimit,630 /// How many tokens can be mined into this collection.631 TokenLimit,632 /// Timeouts for transfer sponsoring.633 SponsorTransferTimeout,634 /// Timeout for sponsoring an approval in passed blocks.635 SponsorApproveTimeout,636 /// Whether the collection owner of the collection can send tokens (which belong to other users).637 OwnerCanTransfer,638 /// Can the collection owner burn other people's tokens.639 OwnerCanDestroy,640 /// Is it possible to send tokens from this collection between users.641 TransferEnabled642}643644/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension645/// @dev See https://eips.ethereum.org/EIPS/eip-721646/// @dev the ERC-165 identifier for this interface is 0x5b5e139f647contract ERC721Metadata is Dummy, ERC165 {648 // /// @notice A descriptive name for a collection of NFTs in this contract649 // /// @dev real implementation of this function lies in `ERC721UniqueExtensions`650 // /// @dev EVM selector for this function is: 0x06fdde03,651 // /// or in textual repr: name()652 // function name() public view returns (string memory) {653 // require(false, stub_error);654 // dummy;655 // return "";656 // }657658 // /// @notice An abbreviated name for NFTs in this contract659 // /// @dev real implementation of this function lies in `ERC721UniqueExtensions`660 // /// @dev EVM selector for this function is: 0x95d89b41,661 // /// or in textual repr: symbol()662 // function symbol() public view returns (string memory) {663 // require(false, stub_error);664 // dummy;665 // return "";666 // }667668 /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.669 ///670 /// @dev If the token has a `url` property and it is not empty, it is returned.671 /// Else If the collection does not have a property with key `schemaName` or its value is not equal to `ERC721Metadata`, it return an error `tokenURI not set`.672 /// If the collection property `baseURI` is empty or absent, return "" (empty string)673 /// otherwise, if token property `suffix` present and is non-empty, return concatenation of baseURI and suffix674 /// otherwise, return concatenation of `baseURI` and stringified token id (decimal stringifying, without paddings).675 ///676 /// @return token's const_metadata677 /// @dev EVM selector for this function is: 0xc87b56dd,678 /// or in textual repr: tokenURI(uint256)679 function tokenURI(uint256 tokenId) public view returns (string memory) {680 require(false, stub_error);681 tokenId;682 dummy;683 return "";684 }685}686687/// @title ERC721 Token that can be irreversibly burned (destroyed).688/// @dev the ERC-165 identifier for this interface is 0x42966c68689contract ERC721Burnable is Dummy, ERC165 {690 /// @notice Burns a specific ERC721 token.691 /// @dev Throws unless `msg.sender` is the current RFT owner, or an authorized692 /// operator of the current owner.693 /// @param tokenId The RFT to approve694 /// @dev EVM selector for this function is: 0x42966c68,695 /// or in textual repr: burn(uint256)696 function burn(uint256 tokenId) public {697 require(false, stub_error);698 tokenId;699 dummy = 0;700 }701}702703/// @title ERC721 minting logic.704/// @dev the ERC-165 identifier for this interface is 0x3fd94ea6705contract ERC721UniqueMintable is Dummy, ERC165 {706 /// @notice Function to mint a token.707 /// @param to The new owner708 /// @return uint256 The id of the newly minted token709 /// @dev EVM selector for this function is: 0x6a627842,710 /// or in textual repr: mint(address)711 function mint(address to) public returns (uint256) {712 require(false, stub_error);713 to;714 dummy = 0;715 return 0;716 }717718 // /// @notice Function to mint a token.719 // /// @dev `tokenId` should be obtained with `nextTokenId` method,720 // /// unlike standard, you can't specify it manually721 // /// @param to The new owner722 // /// @param tokenId ID of the minted RFT723 // /// @dev EVM selector for this function is: 0x40c10f19,724 // /// or in textual repr: mint(address,uint256)725 // function mint(address to, uint256 tokenId) public returns (bool) {726 // require(false, stub_error);727 // to;728 // tokenId;729 // dummy = 0;730 // return false;731 // }732733 /// @notice Function to mint token with the given tokenUri.734 /// @param to The new owner735 /// @param tokenUri Token URI that would be stored in the NFT properties736 /// @return uint256 The id of the newly minted token737 /// @dev EVM selector for this function is: 0x45c17782,738 /// or in textual repr: mintWithTokenURI(address,string)739 function mintWithTokenURI(address to, string memory tokenUri) public returns (uint256) {740 require(false, stub_error);741 to;742 tokenUri;743 dummy = 0;744 return 0;745 }746 // /// @notice Function to mint token with the given tokenUri.747 // /// @dev `tokenId` should be obtained with `nextTokenId` method,748 // /// unlike standard, you can't specify it manually749 // /// @param to The new owner750 // /// @param tokenId ID of the minted RFT751 // /// @param tokenUri Token URI that would be stored in the RFT properties752 // /// @dev EVM selector for this function is: 0x50bb4e7f,753 // /// or in textual repr: mintWithTokenURI(address,uint256,string)754 // function mintWithTokenURI(address to, uint256 tokenId, string memory tokenUri) public returns (bool) {755 // require(false, stub_error);756 // to;757 // tokenId;758 // tokenUri;759 // dummy = 0;760 // return false;761 // }762763}764765/// @title Unique extensions for ERC721.766/// @dev the ERC-165 identifier for this interface is 0xb365c124767contract ERC721UniqueExtensions is Dummy, ERC165 {768 /// @notice A descriptive name for a collection of NFTs in this contract769 /// @dev EVM selector for this function is: 0x06fdde03,770 /// or in textual repr: name()771 function name() public view returns (string memory) {772 require(false, stub_error);773 dummy;774 return "";775 }776777 /// @notice An abbreviated name for NFTs in this contract778 /// @dev EVM selector for this function is: 0x95d89b41,779 /// or in textual repr: symbol()780 function symbol() public view returns (string memory) {781 require(false, stub_error);782 dummy;783 return "";784 }785786 /// @notice A description for the collection.787 /// @dev EVM selector for this function is: 0x7284e416,788 /// or in textual repr: description()789 function description() public view returns (string memory) {790 require(false, stub_error);791 dummy;792 return "";793 }794795 /// Returns the owner (in cross format) of the token.796 ///797 /// @param tokenId Id for the token.798 /// @dev EVM selector for this function is: 0x2b29dace,799 /// or in textual repr: crossOwnerOf(uint256)800 function crossOwnerOf(uint256 tokenId) public view returns (CrossAddress memory) {801 require(false, stub_error);802 tokenId;803 dummy;804 return CrossAddress(0x0000000000000000000000000000000000000000, 0);805 }806807 /// Returns the token properties.808 ///809 /// @param tokenId Id for the token.810 /// @param keys Properties keys. Empty keys for all propertyes.811 /// @return Vector of properties key/value pairs.812 /// @dev EVM selector for this function is: 0xe07ede7e,813 /// or in textual repr: properties(uint256,string[])814 function properties(uint256 tokenId, string[] memory keys) public view returns (Property[] memory) {815 require(false, stub_error);816 tokenId;817 keys;818 dummy;819 return new Property[](0);820 }821822 /// @notice Transfer ownership of an RFT823 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`824 /// is the zero address. Throws if `tokenId` is not a valid RFT.825 /// Throws if RFT pieces have multiple owners.826 /// @param to The new owner827 /// @param tokenId The RFT to transfer828 /// @dev EVM selector for this function is: 0xa9059cbb,829 /// or in textual repr: transfer(address,uint256)830 function transfer(address to, uint256 tokenId) public {831 require(false, stub_error);832 to;833 tokenId;834 dummy = 0;835 }836837 /// @notice Transfer ownership of an RFT838 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`839 /// is the zero address. Throws if `tokenId` is not a valid RFT.840 /// Throws if RFT pieces have multiple owners.841 /// @param to The new owner842 /// @param tokenId The RFT to transfer843 /// @dev EVM selector for this function is: 0x2ada85ff,844 /// or in textual repr: transferCross((address,uint256),uint256)845 function transferCross(CrossAddress memory to, uint256 tokenId) public {846 require(false, stub_error);847 to;848 tokenId;849 dummy = 0;850 }851852 /// @notice Transfer ownership of an RFT853 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`854 /// is the zero address. Throws if `tokenId` is not a valid RFT.855 /// Throws if RFT pieces have multiple owners.856 /// @param to The new owner857 /// @param tokenId The RFT to transfer858 /// @dev EVM selector for this function is: 0xd5cf430b,859 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)860 function transferFromCross(861 CrossAddress memory from,862 CrossAddress memory to,863 uint256 tokenId864 ) public {865 require(false, stub_error);866 from;867 to;868 tokenId;869 dummy = 0;870 }871872 // /// @notice Burns a specific ERC721 token.873 // /// @dev Throws unless `msg.sender` is the current owner or an authorized874 // /// operator for this RFT. Throws if `from` is not the current owner. Throws875 // /// if `to` is the zero address. Throws if `tokenId` is not a valid RFT.876 // /// Throws if RFT pieces have multiple owners.877 // /// @param from The current owner of the RFT878 // /// @param tokenId The RFT to transfer879 // /// @dev EVM selector for this function is: 0x79cc6790,880 // /// or in textual repr: burnFrom(address,uint256)881 // function burnFrom(address from, uint256 tokenId) public {882 // require(false, stub_error);883 // from;884 // tokenId;885 // dummy = 0;886 // }887888 /// @notice Burns a specific ERC721 token.889 /// @dev Throws unless `msg.sender` is the current owner or an authorized890 /// operator for this RFT. Throws if `from` is not the current owner. Throws891 /// if `to` is the zero address. Throws if `tokenId` is not a valid RFT.892 /// Throws if RFT pieces have multiple owners.893 /// @param from The current owner of the RFT894 /// @param tokenId The RFT to transfer895 /// @dev EVM selector for this function is: 0xbb2f5a58,896 /// or in textual repr: burnFromCross((address,uint256),uint256)897 function burnFromCross(CrossAddress memory from, uint256 tokenId) public {898 require(false, stub_error);899 from;900 tokenId;901 dummy = 0;902 }903904 /// @notice Returns next free RFT ID.905 /// @dev EVM selector for this function is: 0x75794a3c,906 /// or in textual repr: nextTokenId()907 function nextTokenId() public view returns (uint256) {908 require(false, stub_error);909 dummy;910 return 0;911 }912913 // /// @notice Function to mint multiple tokens.914 // /// @dev `tokenIds` should be an array of consecutive numbers and first number915 // /// should be obtained with `nextTokenId` method916 // /// @param to The new owner917 // /// @param tokenIds IDs of the minted RFTs918 // /// @dev EVM selector for this function is: 0x44a9945e,919 // /// or in textual repr: mintBulk(address,uint256[])920 // function mintBulk(address to, uint256[] memory tokenIds) public returns (bool) {921 // require(false, stub_error);922 // to;923 // tokenIds;924 // dummy = 0;925 // return false;926 // }927928 // /// @notice Function to mint multiple tokens with the given tokenUris.929 // /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive930 // /// numbers and first number should be obtained with `nextTokenId` method931 // /// @param to The new owner932 // /// @param tokens array of pairs of token ID and token URI for minted tokens933 // /// @dev EVM selector for this function is: 0x36543006,934 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])935 // function mintBulkWithTokenURI(address to, Tuple14[] memory tokens) public returns (bool) {936 // require(false, stub_error);937 // to;938 // tokens;939 // dummy = 0;940 // return false;941 // }942943 /// @notice Function to mint a token.944 /// @param to The new owner crossAccountId945 /// @param properties Properties of minted token946 /// @return uint256 The id of the newly minted token947 /// @dev EVM selector for this function is: 0xb904db03,948 /// or in textual repr: mintCross((address,uint256),(string,bytes)[])949 function mintCross(CrossAddress memory to, Property[] memory properties) public returns (uint256) {950 require(false, stub_error);951 to;952 properties;953 dummy = 0;954 return 0;955 }956957 /// Returns EVM address for refungible token958 ///959 /// @param token ID of the token960 /// @dev EVM selector for this function is: 0xab76fac6,961 /// or in textual repr: tokenContractAddress(uint256)962 function tokenContractAddress(uint256 token) public view returns (address) {963 require(false, stub_error);964 token;965 dummy;966 return 0x0000000000000000000000000000000000000000;967 }968969 /// @notice Returns collection helper contract address970 /// @dev EVM selector for this function is: 0x1896cce6,971 /// or in textual repr: collectionHelperAddress()972 function collectionHelperAddress() public view returns (address) {973 require(false, stub_error);974 dummy;975 return 0x0000000000000000000000000000000000000000;976 }977}978979/// @dev anonymous struct980struct Tuple14 {981 uint256 field_0;982 string field_1;983}984985/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension986/// @dev See https://eips.ethereum.org/EIPS/eip-721987/// @dev the ERC-165 identifier for this interface is 0x780e9d63988contract ERC721Enumerable is Dummy, ERC165 {989 /// @notice Enumerate valid RFTs990 /// @param index A counter less than `totalSupply()`991 /// @return The token identifier for the `index`th NFT,992 /// (sort order not specified)993 /// @dev EVM selector for this function is: 0x4f6ccce7,994 /// or in textual repr: tokenByIndex(uint256)995 function tokenByIndex(uint256 index) public view returns (uint256) {996 require(false, stub_error);997 index;998 dummy;999 return 0;1000 }10011002 /// Not implemented1003 /// @dev EVM selector for this function is: 0x2f745c59,1004 /// or in textual repr: tokenOfOwnerByIndex(address,uint256)1005 function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {1006 require(false, stub_error);1007 owner;1008 index;1009 dummy;1010 return 0;1011 }10121013 /// @notice Count RFTs tracked by this contract1014 /// @return A count of valid RFTs tracked by this contract, where each one of1015 /// them has an assigned and queryable owner not equal to the zero address1016 /// @dev EVM selector for this function is: 0x18160ddd,1017 /// or in textual repr: totalSupply()1018 function totalSupply() public view returns (uint256) {1019 require(false, stub_error);1020 dummy;1021 return 0;1022 }1023}10241025/// @dev inlined interface1026contract ERC721Events {1027 event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);1028 event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);1029 event ApprovalForAll(address indexed owner, address indexed operator, bool approved);1030}10311032/// @title ERC-721 Non-Fungible Token Standard1033/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md1034/// @dev the ERC-165 identifier for this interface is 0x80ac58cd1035contract ERC721 is Dummy, ERC165, ERC721Events {1036 /// @notice Count all RFTs assigned to an owner1037 /// @dev RFTs assigned to the zero address are considered invalid, and this1038 /// function throws for queries about the zero address.1039 /// @param owner An address for whom to query the balance1040 /// @return The number of RFTs owned by `owner`, possibly zero1041 /// @dev EVM selector for this function is: 0x70a08231,1042 /// or in textual repr: balanceOf(address)1043 function balanceOf(address owner) public view returns (uint256) {1044 require(false, stub_error);1045 owner;1046 dummy;1047 return 0;1048 }10491050 /// @notice Find the owner of an RFT1051 /// @dev RFTs assigned to zero address are considered invalid, and queries1052 /// about them do throw.1053 /// Returns special 0xffffffffffffffffffffffffffffffffffffffff address for1054 /// the tokens that are partially owned.1055 /// @param tokenId The identifier for an RFT1056 /// @return The address of the owner of the RFT1057 /// @dev EVM selector for this function is: 0x6352211e,1058 /// or in textual repr: ownerOf(uint256)1059 function ownerOf(uint256 tokenId) public view returns (address) {1060 require(false, stub_error);1061 tokenId;1062 dummy;1063 return 0x0000000000000000000000000000000000000000;1064 }10651066 /// @dev Not implemented1067 /// @dev EVM selector for this function is: 0xb88d4fde,1068 /// or in textual repr: safeTransferFrom(address,address,uint256,bytes)1069 function safeTransferFrom(1070 address from,1071 address to,1072 uint256 tokenId,1073 bytes memory data1074 ) public {1075 require(false, stub_error);1076 from;1077 to;1078 tokenId;1079 data;1080 dummy = 0;1081 }10821083 /// @dev Not implemented1084 /// @dev EVM selector for this function is: 0x42842e0e,1085 /// or in textual repr: safeTransferFrom(address,address,uint256)1086 function safeTransferFrom(1087 address from,1088 address to,1089 uint256 tokenId1090 ) public {1091 require(false, stub_error);1092 from;1093 to;1094 tokenId;1095 dummy = 0;1096 }10971098 /// @notice Transfer ownership of an RFT -- THE CALLER IS RESPONSIBLE1099 /// TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE1100 /// THEY MAY BE PERMANENTLY LOST1101 /// @dev Throws unless `msg.sender` is the current owner or an authorized1102 /// operator for this RFT. Throws if `from` is not the current owner. Throws1103 /// if `to` is the zero address. Throws if `tokenId` is not a valid RFT.1104 /// Throws if RFT pieces have multiple owners.1105 /// @param from The current owner of the NFT1106 /// @param to The new owner1107 /// @param tokenId The NFT to transfer1108 /// @dev EVM selector for this function is: 0x23b872dd,1109 /// or in textual repr: transferFrom(address,address,uint256)1110 function transferFrom(1111 address from,1112 address to,1113 uint256 tokenId1114 ) public {1115 require(false, stub_error);1116 from;1117 to;1118 tokenId;1119 dummy = 0;1120 }11211122 /// @dev Not implemented1123 /// @dev EVM selector for this function is: 0x095ea7b3,1124 /// or in textual repr: approve(address,uint256)1125 function approve(address approved, uint256 tokenId) public {1126 require(false, stub_error);1127 approved;1128 tokenId;1129 dummy = 0;1130 }11311132 /// @notice Sets or unsets the approval of a given operator.1133 /// The `operator` is allowed to transfer all token pieces of the `caller` on their behalf.1134 /// @param operator Operator1135 /// @param approved Should operator status be granted or revoked?1136 /// @dev EVM selector for this function is: 0xa22cb465,1137 /// or in textual repr: setApprovalForAll(address,bool)1138 function setApprovalForAll(address operator, bool approved) public {1139 require(false, stub_error);1140 operator;1141 approved;1142 dummy = 0;1143 }11441145 /// @dev Not implemented1146 /// @dev EVM selector for this function is: 0x081812fc,1147 /// or in textual repr: getApproved(uint256)1148 function getApproved(uint256 tokenId) public view returns (address) {1149 require(false, stub_error);1150 tokenId;1151 dummy;1152 return 0x0000000000000000000000000000000000000000;1153 }11541155 /// @notice Tells whether the given `owner` approves the `operator`.1156 /// @dev EVM selector for this function is: 0xe985e9c5,1157 /// or in textual repr: isApprovedForAll(address,address)1158 function isApprovedForAll(address owner, address operator) public view returns (bool) {1159 require(false, stub_error);1160 owner;1161 operator;1162 dummy;1163 return false;1164 }1165}11661167contract UniqueRefungible is1168 Dummy,1169 ERC165,1170 ERC721,1171 ERC721Enumerable,1172 ERC721UniqueExtensions,1173 ERC721UniqueMintable,1174 ERC721Burnable,1175 ERC721Metadata,1176 Collection,1177 TokenProperties1178{}1// SPDX-License-Identifier: OTHER2// This code is automatically generated34pragma solidity >=0.8.0 <0.9.0;56/// @dev common stubs holder7contract Dummy {8 uint8 dummy;9 string stub_error = "this contract is implemented in native";10}1112contract ERC165 is Dummy {13 function supportsInterface(bytes4 interfaceID) external view returns (bool) {14 require(false, stub_error);15 interfaceID;16 return true;17 }18}1920/// @title A contract that allows to set and delete token properties and change token property permissions.21/// @dev the ERC-165 identifier for this interface is 0xde0695c222contract TokenProperties is Dummy, ERC165 {23 // /// @notice Set permissions for token property.24 // /// @dev Throws error if `msg.sender` is not admin or owner of the collection.25 // /// @param key Property key.26 // /// @param isMutable Permission to mutate property.27 // /// @param collectionAdmin Permission to mutate property by collection admin if property is mutable.28 // /// @param tokenOwner Permission to mutate property by token owner if property is mutable.29 // /// @dev EVM selector for this function is: 0x222d97fa,30 // /// or in textual repr: setTokenPropertyPermission(string,bool,bool,bool)31 // function setTokenPropertyPermission(string memory key, bool isMutable, bool collectionAdmin, bool tokenOwner) public {32 // require(false, stub_error);33 // key;34 // isMutable;35 // collectionAdmin;36 // tokenOwner;37 // dummy = 0;38 // }3940 /// @notice Set permissions for token property.41 /// @dev Throws error if `msg.sender` is not admin or owner of the collection.42 /// @param permissions Permissions for keys.43 /// @dev EVM selector for this function is: 0xbd92983a,44 /// or in textual repr: setTokenPropertyPermissions((string,(uint8,bool)[])[])45 function setTokenPropertyPermissions(TokenPropertyPermission[] memory permissions) public {46 require(false, stub_error);47 permissions;48 dummy = 0;49 }5051 /// @notice Get permissions for token properties.52 /// @dev EVM selector for this function is: 0xf23d7790,53 /// or in textual repr: tokenPropertyPermissions()54 function tokenPropertyPermissions() public view returns (TokenPropertyPermission[] memory) {55 require(false, stub_error);56 dummy;57 return new TokenPropertyPermission[](0);58 }5960 // /// @notice Set token property value.61 // /// @dev Throws error if `msg.sender` has no permission to edit the property.62 // /// @param tokenId ID of the token.63 // /// @param key Property key.64 // /// @param value Property value.65 // /// @dev EVM selector for this function is: 0x1752d67b,66 // /// or in textual repr: setProperty(uint256,string,bytes)67 // function setProperty(uint256 tokenId, string memory key, bytes memory value) public {68 // require(false, stub_error);69 // tokenId;70 // key;71 // value;72 // dummy = 0;73 // }7475 /// @notice Set token properties value.76 /// @dev Throws error if `msg.sender` has no permission to edit the property.77 /// @param tokenId ID of the token.78 /// @param properties settable properties79 /// @dev EVM selector for this function is: 0x14ed3a6e,80 /// or in textual repr: setProperties(uint256,(string,bytes)[])81 function setProperties(uint256 tokenId, Property[] memory properties) public {82 require(false, stub_error);83 tokenId;84 properties;85 dummy = 0;86 }8788 // /// @notice Delete token property value.89 // /// @dev Throws error if `msg.sender` has no permission to edit the property.90 // /// @param tokenId ID of the token.91 // /// @param key Property key.92 // /// @dev EVM selector for this function is: 0x066111d1,93 // /// or in textual repr: deleteProperty(uint256,string)94 // function deleteProperty(uint256 tokenId, string memory key) public {95 // require(false, stub_error);96 // tokenId;97 // key;98 // dummy = 0;99 // }100101 /// @notice Delete token properties value.102 /// @dev Throws error if `msg.sender` has no permission to edit the property.103 /// @param tokenId ID of the token.104 /// @param keys Properties key.105 /// @dev EVM selector for this function is: 0xc472d371,106 /// or in textual repr: deleteProperties(uint256,string[])107 function deleteProperties(uint256 tokenId, string[] memory keys) public {108 require(false, stub_error);109 tokenId;110 keys;111 dummy = 0;112 }113114 /// @notice Get token property value.115 /// @dev Throws error if key not found116 /// @param tokenId ID of the token.117 /// @param key Property key.118 /// @return Property value bytes119 /// @dev EVM selector for this function is: 0x7228c327,120 /// or in textual repr: property(uint256,string)121 function property(uint256 tokenId, string memory key) public view returns (bytes memory) {122 require(false, stub_error);123 tokenId;124 key;125 dummy;126 return hex"";127 }128}129130/// Ethereum representation of collection [`PropertyKey`](up_data_structs::PropertyKey) and [`PropertyValue`](up_data_structs::PropertyValue).131struct Property {132 string key;133 bytes value;134}135136/// Ethereum representation of Token Property Permissions.137struct TokenPropertyPermission {138 /// Token property key.139 string key;140 /// Token property permissions.141 PropertyPermission[] permissions;142}143144/// Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) as an key and value.145struct PropertyPermission {146 /// TokenPermission field.147 TokenPermissionField code;148 /// TokenPermission value.149 bool value;150}151152/// Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration.153enum TokenPermissionField {154 /// Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`]155 Mutable,156 /// Change permission for the collection administrator. See [`up_data_structs::PropertyPermission::token_owner`]157 TokenOwner,158 /// Permission to change the property for the owner of the token. See [`up_data_structs::PropertyPermission::collection_admin`]159 CollectionAdmin160}161162/// @title A contract that allows you to work with collections.163/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1164contract Collection is Dummy, ERC165 {165 // /// Set collection property.166 // ///167 // /// @param key Property key.168 // /// @param value Propery value.169 // /// @dev EVM selector for this function is: 0x2f073f66,170 // /// or in textual repr: setCollectionProperty(string,bytes)171 // function setCollectionProperty(string memory key, bytes memory value) public {172 // require(false, stub_error);173 // key;174 // value;175 // dummy = 0;176 // }177178 /// Set collection properties.179 ///180 /// @param properties Vector of properties key/value pair.181 /// @dev EVM selector for this function is: 0x50b26b2a,182 /// or in textual repr: setCollectionProperties((string,bytes)[])183 function setCollectionProperties(Property[] memory properties) public {184 require(false, stub_error);185 properties;186 dummy = 0;187 }188189 // /// Delete collection property.190 // ///191 // /// @param key Property key.192 // /// @dev EVM selector for this function is: 0x7b7debce,193 // /// or in textual repr: deleteCollectionProperty(string)194 // function deleteCollectionProperty(string memory key) public {195 // require(false, stub_error);196 // key;197 // dummy = 0;198 // }199200 /// Delete collection properties.201 ///202 /// @param keys Properties keys.203 /// @dev EVM selector for this function is: 0xee206ee3,204 /// or in textual repr: deleteCollectionProperties(string[])205 function deleteCollectionProperties(string[] memory keys) public {206 require(false, stub_error);207 keys;208 dummy = 0;209 }210211 /// Get collection property.212 ///213 /// @dev Throws error if key not found.214 ///215 /// @param key Property key.216 /// @return bytes The property corresponding to the key.217 /// @dev EVM selector for this function is: 0xcf24fd6d,218 /// or in textual repr: collectionProperty(string)219 function collectionProperty(string memory key) public view returns (bytes memory) {220 require(false, stub_error);221 key;222 dummy;223 return hex"";224 }225226 /// Get collection properties.227 ///228 /// @param keys Properties keys. Empty keys for all propertyes.229 /// @return Vector of properties key/value pairs.230 /// @dev EVM selector for this function is: 0x285fb8e6,231 /// or in textual repr: collectionProperties(string[])232 function collectionProperties(string[] memory keys) public view returns (Property[] memory) {233 require(false, stub_error);234 keys;235 dummy;236 return new Property[](0);237 }238239 // /// Set the sponsor of the collection.240 // ///241 // /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.242 // ///243 // /// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.244 // /// @dev EVM selector for this function is: 0x7623402e,245 // /// or in textual repr: setCollectionSponsor(address)246 // function setCollectionSponsor(address sponsor) public {247 // require(false, stub_error);248 // sponsor;249 // dummy = 0;250 // }251252 /// Set the sponsor of the collection.253 ///254 /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.255 ///256 /// @param sponsor Cross account address of the sponsor from whose account funds will be debited for operations with the contract.257 /// @dev EVM selector for this function is: 0x84a1d5a8,258 /// or in textual repr: setCollectionSponsorCross((address,uint256))259 function setCollectionSponsorCross(CrossAddress memory sponsor) public {260 require(false, stub_error);261 sponsor;262 dummy = 0;263 }264265 /// Whether there is a pending sponsor.266 /// @dev EVM selector for this function is: 0x058ac185,267 /// or in textual repr: hasCollectionPendingSponsor()268 function hasCollectionPendingSponsor() public view returns (bool) {269 require(false, stub_error);270 dummy;271 return false;272 }273274 /// Collection sponsorship confirmation.275 ///276 /// @dev After setting the sponsor for the collection, it must be confirmed with this function.277 /// @dev EVM selector for this function is: 0x3c50e97a,278 /// or in textual repr: confirmCollectionSponsorship()279 function confirmCollectionSponsorship() public {280 require(false, stub_error);281 dummy = 0;282 }283284 /// Remove collection sponsor.285 /// @dev EVM selector for this function is: 0x6e0326a3,286 /// or in textual repr: removeCollectionSponsor()287 function removeCollectionSponsor() public {288 require(false, stub_error);289 dummy = 0;290 }291292 /// Get current sponsor.293 ///294 /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.295 /// @dev EVM selector for this function is: 0x6ec0a9f1,296 /// or in textual repr: collectionSponsor()297 function collectionSponsor() public view returns (CrossAddress memory) {298 require(false, stub_error);299 dummy;300 return CrossAddress(0x0000000000000000000000000000000000000000, 0);301 }302303 /// Get current collection limits.304 ///305 /// @return Array of collection limits306 /// @dev EVM selector for this function is: 0xf63bc572,307 /// or in textual repr: collectionLimits()308 function collectionLimits() public view returns (CollectionLimit[] memory) {309 require(false, stub_error);310 dummy;311 return new CollectionLimit[](0);312 }313314 /// Set limits for the collection.315 /// @dev Throws error if limit not found.316 /// @param limit Some limit.317 /// @dev EVM selector for this function is: 0x2316ee74,318 /// or in textual repr: setCollectionLimit((uint8,(bool,uint256)))319 function setCollectionLimit(CollectionLimit memory limit) public {320 require(false, stub_error);321 limit;322 dummy = 0;323 }324325 /// Get contract address.326 /// @dev EVM selector for this function is: 0xf6b4dfb4,327 /// or in textual repr: contractAddress()328 function contractAddress() public view returns (address) {329 require(false, stub_error);330 dummy;331 return 0x0000000000000000000000000000000000000000;332 }333334 /// Add collection admin.335 /// @param newAdmin Cross account administrator address.336 /// @dev EVM selector for this function is: 0x859aa7d6,337 /// or in textual repr: addCollectionAdminCross((address,uint256))338 function addCollectionAdminCross(CrossAddress memory newAdmin) public {339 require(false, stub_error);340 newAdmin;341 dummy = 0;342 }343344 /// Remove collection admin.345 /// @param admin Cross account administrator address.346 /// @dev EVM selector for this function is: 0x6c0cd173,347 /// or in textual repr: removeCollectionAdminCross((address,uint256))348 function removeCollectionAdminCross(CrossAddress memory admin) public {349 require(false, stub_error);350 admin;351 dummy = 0;352 }353354 // /// Add collection admin.355 // /// @param newAdmin Address of the added administrator.356 // /// @dev EVM selector for this function is: 0x92e462c7,357 // /// or in textual repr: addCollectionAdmin(address)358 // function addCollectionAdmin(address newAdmin) public {359 // require(false, stub_error);360 // newAdmin;361 // dummy = 0;362 // }363364 // /// Remove collection admin.365 // ///366 // /// @param admin Address of the removed administrator.367 // /// @dev EVM selector for this function is: 0xfafd7b42,368 // /// or in textual repr: removeCollectionAdmin(address)369 // function removeCollectionAdmin(address admin) public {370 // require(false, stub_error);371 // admin;372 // dummy = 0;373 // }374375 /// Toggle accessibility of collection nesting.376 ///377 /// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'378 /// @dev EVM selector for this function is: 0x112d4586,379 /// or in textual repr: setCollectionNesting(bool)380 function setCollectionNesting(bool enable) public {381 require(false, stub_error);382 enable;383 dummy = 0;384 }385386 /// Toggle accessibility of collection nesting.387 ///388 /// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'389 /// @param collections Addresses of collections that will be available for nesting.390 /// @dev EVM selector for this function is: 0x64872396,391 /// or in textual repr: setCollectionNesting(bool,address[])392 function setCollectionNesting(bool enable, address[] memory collections) public {393 require(false, stub_error);394 enable;395 collections;396 dummy = 0;397 }398399 /// Returns nesting for a collection400 /// @dev EVM selector for this function is: 0x22d25bfe,401 /// or in textual repr: collectionNestingRestrictedCollectionIds()402 function collectionNestingRestrictedCollectionIds() public view returns (CollectionNesting memory) {403 require(false, stub_error);404 dummy;405 return CollectionNesting(false, new uint256[](0));406 }407408 /// Returns permissions for a collection409 /// @dev EVM selector for this function is: 0x5b2eaf4b,410 /// or in textual repr: collectionNestingPermissions()411 function collectionNestingPermissions() public view returns (CollectionNestingPermission[] memory) {412 require(false, stub_error);413 dummy;414 return new CollectionNestingPermission[](0);415 }416417 /// Set the collection access method.418 /// @param mode Access mode419 /// @dev EVM selector for this function is: 0x41835d4c,420 /// or in textual repr: setCollectionAccess(uint8)421 function setCollectionAccess(AccessMode mode) public {422 require(false, stub_error);423 mode;424 dummy = 0;425 }426427 /// Checks that user allowed to operate with collection.428 ///429 /// @param user User address to check.430 /// @dev EVM selector for this function is: 0x91b6df49,431 /// or in textual repr: allowlistedCross((address,uint256))432 function allowlistedCross(CrossAddress memory user) public view returns (bool) {433 require(false, stub_error);434 user;435 dummy;436 return false;437 }438439 // /// Add the user to the allowed list.440 // ///441 // /// @param user Address of a trusted user.442 // /// @dev EVM selector for this function is: 0x67844fe6,443 // /// or in textual repr: addToCollectionAllowList(address)444 // function addToCollectionAllowList(address user) public {445 // require(false, stub_error);446 // user;447 // dummy = 0;448 // }449450 /// Add user to allowed list.451 ///452 /// @param user User cross account address.453 /// @dev EVM selector for this function is: 0xa0184a3a,454 /// or in textual repr: addToCollectionAllowListCross((address,uint256))455 function addToCollectionAllowListCross(CrossAddress memory user) public {456 require(false, stub_error);457 user;458 dummy = 0;459 }460461 // /// Remove the user from the allowed list.462 // ///463 // /// @param user Address of a removed user.464 // /// @dev EVM selector for this function is: 0x85c51acb,465 // /// or in textual repr: removeFromCollectionAllowList(address)466 // function removeFromCollectionAllowList(address user) public {467 // require(false, stub_error);468 // user;469 // dummy = 0;470 // }471472 /// Remove user from allowed list.473 ///474 /// @param user User cross account address.475 /// @dev EVM selector for this function is: 0x09ba452a,476 /// or in textual repr: removeFromCollectionAllowListCross((address,uint256))477 function removeFromCollectionAllowListCross(CrossAddress memory user) public {478 require(false, stub_error);479 user;480 dummy = 0;481 }482483 /// Switch permission for minting.484 ///485 /// @param mode Enable if "true".486 /// @dev EVM selector for this function is: 0x00018e84,487 /// or in textual repr: setCollectionMintMode(bool)488 function setCollectionMintMode(bool mode) public {489 require(false, stub_error);490 mode;491 dummy = 0;492 }493494 // /// Check that account is the owner or admin of the collection495 // ///496 // /// @param user account to verify497 // /// @return "true" if account is the owner or admin498 // /// @dev EVM selector for this function is: 0x9811b0c7,499 // /// or in textual repr: isOwnerOrAdmin(address)500 // function isOwnerOrAdmin(address user) public view returns (bool) {501 // require(false, stub_error);502 // user;503 // dummy;504 // return false;505 // }506507 /// Check that account is the owner or admin of the collection508 ///509 /// @param user User cross account to verify510 /// @return "true" if account is the owner or admin511 /// @dev EVM selector for this function is: 0x3e75a905,512 /// or in textual repr: isOwnerOrAdminCross((address,uint256))513 function isOwnerOrAdminCross(CrossAddress memory user) public view returns (bool) {514 require(false, stub_error);515 user;516 dummy;517 return false;518 }519520 /// Returns collection type521 ///522 /// @return `Fungible` or `NFT` or `ReFungible`523 /// @dev EVM selector for this function is: 0xd34b55b8,524 /// or in textual repr: uniqueCollectionType()525 function uniqueCollectionType() public view returns (string memory) {526 require(false, stub_error);527 dummy;528 return "";529 }530531 /// Get collection owner.532 ///533 /// @return Tuble with sponsor address and his substrate mirror.534 /// If address is canonical then substrate mirror is zero and vice versa.535 /// @dev EVM selector for this function is: 0xdf727d3b,536 /// or in textual repr: collectionOwner()537 function collectionOwner() public view returns (CrossAddress memory) {538 require(false, stub_error);539 dummy;540 return CrossAddress(0x0000000000000000000000000000000000000000, 0);541 }542543 // /// Changes collection owner to another account544 // ///545 // /// @dev Owner can be changed only by current owner546 // /// @param newOwner new owner account547 // /// @dev EVM selector for this function is: 0x4f53e226,548 // /// or in textual repr: changeCollectionOwner(address)549 // function changeCollectionOwner(address newOwner) public {550 // require(false, stub_error);551 // newOwner;552 // dummy = 0;553 // }554555 /// Get collection administrators556 ///557 /// @return Vector of tuples with admins address and his substrate mirror.558 /// If address is canonical then substrate mirror is zero and vice versa.559 /// @dev EVM selector for this function is: 0x5813216b,560 /// or in textual repr: collectionAdmins()561 function collectionAdmins() public view returns (CrossAddress[] memory) {562 require(false, stub_error);563 dummy;564 return new CrossAddress[](0);565 }566567 /// Changes collection owner to another account568 ///569 /// @dev Owner can be changed only by current owner570 /// @param newOwner new owner cross account571 /// @dev EVM selector for this function is: 0x6496c497,572 /// or in textual repr: changeCollectionOwnerCross((address,uint256))573 function changeCollectionOwnerCross(CrossAddress memory newOwner) public {574 require(false, stub_error);575 newOwner;576 dummy = 0;577 }578}579580/// Cross account struct581struct CrossAddress {582 address eth;583 uint256 sub;584}585586/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).587enum AccessMode {588 /// Access grant for owner and admins. Used as default.589 Normal,590 /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.591 AllowList592}593594/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.595struct CollectionNestingPermission {596 CollectionPermissionField field;597 bool value;598}599600/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.601enum CollectionPermissionField {602 /// Owner of token can nest tokens under it.603 TokenOwner,604 /// Admin of token collection can nest tokens under token.605 CollectionAdmin606}607608/// Nested collections.609struct CollectionNesting {610 bool token_owner;611 uint256[] ids;612}613614/// [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.615struct CollectionLimit {616 CollectionLimitField field;617 OptionUint256 value;618}619620/// Optional value621struct OptionUint256 {622 /// Shows the status of accessibility of value623 bool status;624 /// Actual value if `status` is true625 uint256 value;626}627628/// [`CollectionLimits`](up_data_structs::CollectionLimits) fields representation for EVM.629enum CollectionLimitField {630 /// How many tokens can a user have on one account.631 AccountTokenOwnership,632 /// How many bytes of data are available for sponsorship.633 SponsoredDataSize,634 /// In any case, chain default: [`SponsoringRateLimit::SponsoringDisabled`]635 SponsoredDataRateLimit,636 /// How many tokens can be mined into this collection.637 TokenLimit,638 /// Timeouts for transfer sponsoring.639 SponsorTransferTimeout,640 /// Timeout for sponsoring an approval in passed blocks.641 SponsorApproveTimeout,642 /// Whether the collection owner of the collection can send tokens (which belong to other users).643 OwnerCanTransfer,644 /// Can the collection owner burn other people's tokens.645 OwnerCanDestroy,646 /// Is it possible to send tokens from this collection between users.647 TransferEnabled648}649650/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension651/// @dev See https://eips.ethereum.org/EIPS/eip-721652/// @dev the ERC-165 identifier for this interface is 0x5b5e139f653contract ERC721Metadata is Dummy, ERC165 {654 // /// @notice A descriptive name for a collection of NFTs in this contract655 // /// @dev real implementation of this function lies in `ERC721UniqueExtensions`656 // /// @dev EVM selector for this function is: 0x06fdde03,657 // /// or in textual repr: name()658 // function name() public view returns (string memory) {659 // require(false, stub_error);660 // dummy;661 // return "";662 // }663664 // /// @notice An abbreviated name for NFTs in this contract665 // /// @dev real implementation of this function lies in `ERC721UniqueExtensions`666 // /// @dev EVM selector for this function is: 0x95d89b41,667 // /// or in textual repr: symbol()668 // function symbol() public view returns (string memory) {669 // require(false, stub_error);670 // dummy;671 // return "";672 // }673674 /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.675 ///676 /// @dev If the token has a `url` property and it is not empty, it is returned.677 /// Else If the collection does not have a property with key `schemaName` or its value is not equal to `ERC721Metadata`, it return an error `tokenURI not set`.678 /// If the collection property `baseURI` is empty or absent, return "" (empty string)679 /// otherwise, if token property `suffix` present and is non-empty, return concatenation of baseURI and suffix680 /// otherwise, return concatenation of `baseURI` and stringified token id (decimal stringifying, without paddings).681 ///682 /// @return token's const_metadata683 /// @dev EVM selector for this function is: 0xc87b56dd,684 /// or in textual repr: tokenURI(uint256)685 function tokenURI(uint256 tokenId) public view returns (string memory) {686 require(false, stub_error);687 tokenId;688 dummy;689 return "";690 }691}692693/// @title ERC721 Token that can be irreversibly burned (destroyed).694/// @dev the ERC-165 identifier for this interface is 0x42966c68695contract ERC721Burnable is Dummy, ERC165 {696 /// @notice Burns a specific ERC721 token.697 /// @dev Throws unless `msg.sender` is the current RFT owner, or an authorized698 /// operator of the current owner.699 /// @param tokenId The RFT to approve700 /// @dev EVM selector for this function is: 0x42966c68,701 /// or in textual repr: burn(uint256)702 function burn(uint256 tokenId) public {703 require(false, stub_error);704 tokenId;705 dummy = 0;706 }707}708709/// @title ERC721 minting logic.710/// @dev the ERC-165 identifier for this interface is 0x3fd94ea6711contract ERC721UniqueMintable is Dummy, ERC165 {712 /// @notice Function to mint a token.713 /// @param to The new owner714 /// @return uint256 The id of the newly minted token715 /// @dev EVM selector for this function is: 0x6a627842,716 /// or in textual repr: mint(address)717 function mint(address to) public returns (uint256) {718 require(false, stub_error);719 to;720 dummy = 0;721 return 0;722 }723724 // /// @notice Function to mint a token.725 // /// @dev `tokenId` should be obtained with `nextTokenId` method,726 // /// unlike standard, you can't specify it manually727 // /// @param to The new owner728 // /// @param tokenId ID of the minted RFT729 // /// @dev EVM selector for this function is: 0x40c10f19,730 // /// or in textual repr: mint(address,uint256)731 // function mint(address to, uint256 tokenId) public returns (bool) {732 // require(false, stub_error);733 // to;734 // tokenId;735 // dummy = 0;736 // return false;737 // }738739 /// @notice Function to mint token with the given tokenUri.740 /// @param to The new owner741 /// @param tokenUri Token URI that would be stored in the NFT properties742 /// @return uint256 The id of the newly minted token743 /// @dev EVM selector for this function is: 0x45c17782,744 /// or in textual repr: mintWithTokenURI(address,string)745 function mintWithTokenURI(address to, string memory tokenUri) public returns (uint256) {746 require(false, stub_error);747 to;748 tokenUri;749 dummy = 0;750 return 0;751 }752 // /// @notice Function to mint token with the given tokenUri.753 // /// @dev `tokenId` should be obtained with `nextTokenId` method,754 // /// unlike standard, you can't specify it manually755 // /// @param to The new owner756 // /// @param tokenId ID of the minted RFT757 // /// @param tokenUri Token URI that would be stored in the RFT properties758 // /// @dev EVM selector for this function is: 0x50bb4e7f,759 // /// or in textual repr: mintWithTokenURI(address,uint256,string)760 // function mintWithTokenURI(address to, uint256 tokenId, string memory tokenUri) public returns (bool) {761 // require(false, stub_error);762 // to;763 // tokenId;764 // tokenUri;765 // dummy = 0;766 // return false;767 // }768769}770771/// @title Unique extensions for ERC721.772/// @dev the ERC-165 identifier for this interface is 0xb365c124773contract ERC721UniqueExtensions is Dummy, ERC165 {774 /// @notice A descriptive name for a collection of NFTs in this contract775 /// @dev EVM selector for this function is: 0x06fdde03,776 /// or in textual repr: name()777 function name() public view returns (string memory) {778 require(false, stub_error);779 dummy;780 return "";781 }782783 /// @notice An abbreviated name for NFTs in this contract784 /// @dev EVM selector for this function is: 0x95d89b41,785 /// or in textual repr: symbol()786 function symbol() public view returns (string memory) {787 require(false, stub_error);788 dummy;789 return "";790 }791792 /// @notice A description for the collection.793 /// @dev EVM selector for this function is: 0x7284e416,794 /// or in textual repr: description()795 function description() public view returns (string memory) {796 require(false, stub_error);797 dummy;798 return "";799 }800801 /// Returns the owner (in cross format) of the token.802 ///803 /// @param tokenId Id for the token.804 /// @dev EVM selector for this function is: 0x2b29dace,805 /// or in textual repr: crossOwnerOf(uint256)806 function crossOwnerOf(uint256 tokenId) public view returns (CrossAddress memory) {807 require(false, stub_error);808 tokenId;809 dummy;810 return CrossAddress(0x0000000000000000000000000000000000000000, 0);811 }812813 /// Returns the token properties.814 ///815 /// @param tokenId Id for the token.816 /// @param keys Properties keys. Empty keys for all propertyes.817 /// @return Vector of properties key/value pairs.818 /// @dev EVM selector for this function is: 0xe07ede7e,819 /// or in textual repr: properties(uint256,string[])820 function properties(uint256 tokenId, string[] memory keys) public view returns (Property[] memory) {821 require(false, stub_error);822 tokenId;823 keys;824 dummy;825 return new Property[](0);826 }827828 /// @notice Transfer ownership of an RFT829 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`830 /// is the zero address. Throws if `tokenId` is not a valid RFT.831 /// Throws if RFT pieces have multiple owners.832 /// @param to The new owner833 /// @param tokenId The RFT to transfer834 /// @dev EVM selector for this function is: 0xa9059cbb,835 /// or in textual repr: transfer(address,uint256)836 function transfer(address to, uint256 tokenId) public {837 require(false, stub_error);838 to;839 tokenId;840 dummy = 0;841 }842843 /// @notice Transfer ownership of an RFT844 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`845 /// is the zero address. Throws if `tokenId` is not a valid RFT.846 /// Throws if RFT pieces have multiple owners.847 /// @param to The new owner848 /// @param tokenId The RFT to transfer849 /// @dev EVM selector for this function is: 0x2ada85ff,850 /// or in textual repr: transferCross((address,uint256),uint256)851 function transferCross(CrossAddress memory to, uint256 tokenId) public {852 require(false, stub_error);853 to;854 tokenId;855 dummy = 0;856 }857858 /// @notice Transfer ownership of an RFT859 /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`860 /// is the zero address. Throws if `tokenId` is not a valid RFT.861 /// Throws if RFT pieces have multiple owners.862 /// @param to The new owner863 /// @param tokenId The RFT to transfer864 /// @dev EVM selector for this function is: 0xd5cf430b,865 /// or in textual repr: transferFromCross((address,uint256),(address,uint256),uint256)866 function transferFromCross(867 CrossAddress memory from,868 CrossAddress memory to,869 uint256 tokenId870 ) public {871 require(false, stub_error);872 from;873 to;874 tokenId;875 dummy = 0;876 }877878 // /// @notice Burns a specific ERC721 token.879 // /// @dev Throws unless `msg.sender` is the current owner or an authorized880 // /// operator for this RFT. Throws if `from` is not the current owner. Throws881 // /// if `to` is the zero address. Throws if `tokenId` is not a valid RFT.882 // /// Throws if RFT pieces have multiple owners.883 // /// @param from The current owner of the RFT884 // /// @param tokenId The RFT to transfer885 // /// @dev EVM selector for this function is: 0x79cc6790,886 // /// or in textual repr: burnFrom(address,uint256)887 // function burnFrom(address from, uint256 tokenId) public {888 // require(false, stub_error);889 // from;890 // tokenId;891 // dummy = 0;892 // }893894 /// @notice Burns a specific ERC721 token.895 /// @dev Throws unless `msg.sender` is the current owner or an authorized896 /// operator for this RFT. Throws if `from` is not the current owner. Throws897 /// if `to` is the zero address. Throws if `tokenId` is not a valid RFT.898 /// Throws if RFT pieces have multiple owners.899 /// @param from The current owner of the RFT900 /// @param tokenId The RFT to transfer901 /// @dev EVM selector for this function is: 0xbb2f5a58,902 /// or in textual repr: burnFromCross((address,uint256),uint256)903 function burnFromCross(CrossAddress memory from, uint256 tokenId) public {904 require(false, stub_error);905 from;906 tokenId;907 dummy = 0;908 }909910 /// @notice Returns next free RFT ID.911 /// @dev EVM selector for this function is: 0x75794a3c,912 /// or in textual repr: nextTokenId()913 function nextTokenId() public view returns (uint256) {914 require(false, stub_error);915 dummy;916 return 0;917 }918919 // /// @notice Function to mint multiple tokens.920 // /// @dev `tokenIds` should be an array of consecutive numbers and first number921 // /// should be obtained with `nextTokenId` method922 // /// @param to The new owner923 // /// @param tokenIds IDs of the minted RFTs924 // /// @dev EVM selector for this function is: 0x44a9945e,925 // /// or in textual repr: mintBulk(address,uint256[])926 // function mintBulk(address to, uint256[] memory tokenIds) public returns (bool) {927 // require(false, stub_error);928 // to;929 // tokenIds;930 // dummy = 0;931 // return false;932 // }933934 // /// @notice Function to mint multiple tokens with the given tokenUris.935 // /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive936 // /// numbers and first number should be obtained with `nextTokenId` method937 // /// @param to The new owner938 // /// @param tokens array of pairs of token ID and token URI for minted tokens939 // /// @dev EVM selector for this function is: 0x36543006,940 // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])941 // function mintBulkWithTokenURI(address to, Tuple14[] memory tokens) public returns (bool) {942 // require(false, stub_error);943 // to;944 // tokens;945 // dummy = 0;946 // return false;947 // }948949 /// @notice Function to mint a token.950 /// @param to The new owner crossAccountId951 /// @param properties Properties of minted token952 /// @return uint256 The id of the newly minted token953 /// @dev EVM selector for this function is: 0xb904db03,954 /// or in textual repr: mintCross((address,uint256),(string,bytes)[])955 function mintCross(CrossAddress memory to, Property[] memory properties) public returns (uint256) {956 require(false, stub_error);957 to;958 properties;959 dummy = 0;960 return 0;961 }962963 /// Returns EVM address for refungible token964 ///965 /// @param token ID of the token966 /// @dev EVM selector for this function is: 0xab76fac6,967 /// or in textual repr: tokenContractAddress(uint256)968 function tokenContractAddress(uint256 token) public view returns (address) {969 require(false, stub_error);970 token;971 dummy;972 return 0x0000000000000000000000000000000000000000;973 }974975 /// @notice Returns collection helper contract address976 /// @dev EVM selector for this function is: 0x1896cce6,977 /// or in textual repr: collectionHelperAddress()978 function collectionHelperAddress() public view returns (address) {979 require(false, stub_error);980 dummy;981 return 0x0000000000000000000000000000000000000000;982 }983}984985/// @dev anonymous struct986struct Tuple14 {987 uint256 field_0;988 string field_1;989}990991/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension992/// @dev See https://eips.ethereum.org/EIPS/eip-721993/// @dev the ERC-165 identifier for this interface is 0x780e9d63994contract ERC721Enumerable is Dummy, ERC165 {995 /// @notice Enumerate valid RFTs996 /// @param index A counter less than `totalSupply()`997 /// @return The token identifier for the `index`th NFT,998 /// (sort order not specified)999 /// @dev EVM selector for this function is: 0x4f6ccce7,1000 /// or in textual repr: tokenByIndex(uint256)1001 function tokenByIndex(uint256 index) public view returns (uint256) {1002 require(false, stub_error);1003 index;1004 dummy;1005 return 0;1006 }10071008 /// Not implemented1009 /// @dev EVM selector for this function is: 0x2f745c59,1010 /// or in textual repr: tokenOfOwnerByIndex(address,uint256)1011 function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {1012 require(false, stub_error);1013 owner;1014 index;1015 dummy;1016 return 0;1017 }10181019 /// @notice Count RFTs tracked by this contract1020 /// @return A count of valid RFTs tracked by this contract, where each one of1021 /// them has an assigned and queryable owner not equal to the zero address1022 /// @dev EVM selector for this function is: 0x18160ddd,1023 /// or in textual repr: totalSupply()1024 function totalSupply() public view returns (uint256) {1025 require(false, stub_error);1026 dummy;1027 return 0;1028 }1029}10301031/// @dev inlined interface1032contract ERC721Events {1033 event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);1034 event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);1035 event ApprovalForAll(address indexed owner, address indexed operator, bool approved);1036}10371038/// @title ERC-721 Non-Fungible Token Standard1039/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md1040/// @dev the ERC-165 identifier for this interface is 0x80ac58cd1041contract ERC721 is Dummy, ERC165, ERC721Events {1042 /// @notice Count all RFTs assigned to an owner1043 /// @dev RFTs assigned to the zero address are considered invalid, and this1044 /// function throws for queries about the zero address.1045 /// @param owner An address for whom to query the balance1046 /// @return The number of RFTs owned by `owner`, possibly zero1047 /// @dev EVM selector for this function is: 0x70a08231,1048 /// or in textual repr: balanceOf(address)1049 function balanceOf(address owner) public view returns (uint256) {1050 require(false, stub_error);1051 owner;1052 dummy;1053 return 0;1054 }10551056 /// @notice Find the owner of an RFT1057 /// @dev RFTs assigned to zero address are considered invalid, and queries1058 /// about them do throw.1059 /// Returns special 0xffffffffffffffffffffffffffffffffffffffff address for1060 /// the tokens that are partially owned.1061 /// @param tokenId The identifier for an RFT1062 /// @return The address of the owner of the RFT1063 /// @dev EVM selector for this function is: 0x6352211e,1064 /// or in textual repr: ownerOf(uint256)1065 function ownerOf(uint256 tokenId) public view returns (address) {1066 require(false, stub_error);1067 tokenId;1068 dummy;1069 return 0x0000000000000000000000000000000000000000;1070 }10711072 /// @dev Not implemented1073 /// @dev EVM selector for this function is: 0xb88d4fde,1074 /// or in textual repr: safeTransferFrom(address,address,uint256,bytes)1075 function safeTransferFrom(1076 address from,1077 address to,1078 uint256 tokenId,1079 bytes memory data1080 ) public {1081 require(false, stub_error);1082 from;1083 to;1084 tokenId;1085 data;1086 dummy = 0;1087 }10881089 /// @dev Not implemented1090 /// @dev EVM selector for this function is: 0x42842e0e,1091 /// or in textual repr: safeTransferFrom(address,address,uint256)1092 function safeTransferFrom(1093 address from,1094 address to,1095 uint256 tokenId1096 ) public {1097 require(false, stub_error);1098 from;1099 to;1100 tokenId;1101 dummy = 0;1102 }11031104 /// @notice Transfer ownership of an RFT -- THE CALLER IS RESPONSIBLE1105 /// TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE1106 /// THEY MAY BE PERMANENTLY LOST1107 /// @dev Throws unless `msg.sender` is the current owner or an authorized1108 /// operator for this RFT. Throws if `from` is not the current owner. Throws1109 /// if `to` is the zero address. Throws if `tokenId` is not a valid RFT.1110 /// Throws if RFT pieces have multiple owners.1111 /// @param from The current owner of the NFT1112 /// @param to The new owner1113 /// @param tokenId The NFT to transfer1114 /// @dev EVM selector for this function is: 0x23b872dd,1115 /// or in textual repr: transferFrom(address,address,uint256)1116 function transferFrom(1117 address from,1118 address to,1119 uint256 tokenId1120 ) public {1121 require(false, stub_error);1122 from;1123 to;1124 tokenId;1125 dummy = 0;1126 }11271128 /// @dev Not implemented1129 /// @dev EVM selector for this function is: 0x095ea7b3,1130 /// or in textual repr: approve(address,uint256)1131 function approve(address approved, uint256 tokenId) public {1132 require(false, stub_error);1133 approved;1134 tokenId;1135 dummy = 0;1136 }11371138 /// @notice Sets or unsets the approval of a given operator.1139 /// The `operator` is allowed to transfer all token pieces of the `caller` on their behalf.1140 /// @param operator Operator1141 /// @param approved Should operator status be granted or revoked?1142 /// @dev EVM selector for this function is: 0xa22cb465,1143 /// or in textual repr: setApprovalForAll(address,bool)1144 function setApprovalForAll(address operator, bool approved) public {1145 require(false, stub_error);1146 operator;1147 approved;1148 dummy = 0;1149 }11501151 /// @dev Not implemented1152 /// @dev EVM selector for this function is: 0x081812fc,1153 /// or in textual repr: getApproved(uint256)1154 function getApproved(uint256 tokenId) public view returns (address) {1155 require(false, stub_error);1156 tokenId;1157 dummy;1158 return 0x0000000000000000000000000000000000000000;1159 }11601161 /// @notice Tells whether the given `owner` approves the `operator`.1162 /// @dev EVM selector for this function is: 0xe985e9c5,1163 /// or in textual repr: isApprovedForAll(address,address)1164 function isApprovedForAll(address owner, address operator) public view returns (bool) {1165 require(false, stub_error);1166 owner;1167 operator;1168 dummy;1169 return false;1170 }1171}11721173contract UniqueRefungible is1174 Dummy,1175 ERC165,1176 ERC721,1177 ERC721Enumerable,1178 ERC721UniqueExtensions,1179 ERC721UniqueMintable,1180 ERC721Burnable,1181 ERC721Metadata,1182 Collection,1183 TokenProperties1184{}pallets/unique/src/eth/mod.rsdiffbeforeafterboth--- a/pallets/unique/src/eth/mod.rs
+++ b/pallets/unique/src/eth/mod.rs
@@ -56,10 +56,10 @@
}
fn convert_data<T: Config>(
- caller: caller,
- name: string,
- description: string,
- token_prefix: string,
+ caller: Caller,
+ name: String,
+ description: String,
+ token_prefix: String,
) -> Result<(
T::CrossAccountId,
CollectionName,
@@ -87,13 +87,13 @@
#[inline(always)]
fn create_collection_internal<T: Config>(
- caller: caller,
- value: value,
- name: string,
+ caller: Caller,
+ value: Value,
+ name: String,
collection_mode: CollectionMode,
- description: string,
- token_prefix: string,
-) -> Result<address> {
+ description: String,
+ token_prefix: String,
+) -> Result<Address> {
let (caller, name, description, token_prefix) =
convert_data::<T>(caller, name, description, token_prefix)?;
let data = CreateCollectionData {
@@ -118,7 +118,7 @@
Ok(address)
}
-fn check_sent_amount_equals_collection_creation_price<T: Config>(value: value) -> Result<()> {
+fn check_sent_amount_equals_collection_creation_price<T: Config>(value: Value) -> Result<()> {
let value = value.as_u128();
let creation_price: u128 = T::CollectionCreationPrice::get()
.try_into()
@@ -149,12 +149,12 @@
#[solidity(rename_selector = "createNFTCollection")]
fn create_nft_collection(
&mut self,
- caller: caller,
- value: value,
- name: string,
- description: string,
- token_prefix: string,
- ) -> Result<address> {
+ caller: Caller,
+ value: Value,
+ name: String,
+ description: String,
+ token_prefix: String,
+ ) -> Result<Address> {
let (caller, name, description, token_prefix) =
convert_data::<T>(caller, name, description, token_prefix)?;
let data = CreateCollectionData {
@@ -188,12 +188,12 @@
#[solidity(hide)]
fn create_nonfungible_collection(
&mut self,
- caller: caller,
- value: value,
- name: string,
- description: string,
- token_prefix: string,
- ) -> Result<address> {
+ caller: Caller,
+ value: Value,
+ name: String,
+ description: String,
+ token_prefix: String,
+ ) -> Result<Address> {
create_collection_internal::<T>(
caller,
value,
@@ -208,12 +208,12 @@
#[solidity(rename_selector = "createRFTCollection")]
fn create_rft_collection(
&mut self,
- caller: caller,
- value: value,
- name: string,
- description: string,
- token_prefix: string,
- ) -> Result<address> {
+ caller: Caller,
+ value: Value,
+ name: String,
+ description: String,
+ token_prefix: String,
+ ) -> Result<Address> {
create_collection_internal::<T>(
caller,
value,
@@ -228,13 +228,13 @@
#[solidity(rename_selector = "createFTCollection")]
fn create_fungible_collection(
&mut self,
- caller: caller,
- value: value,
- name: string,
- decimals: uint8,
- description: string,
- token_prefix: string,
- ) -> Result<address> {
+ caller: Caller,
+ value: Value,
+ name: String,
+ decimals: u8,
+ description: String,
+ token_prefix: String,
+ ) -> Result<Address> {
create_collection_internal::<T>(
caller,
value,
@@ -248,9 +248,9 @@
#[solidity(rename_selector = "makeCollectionERC721MetadataCompatible")]
fn make_collection_metadata_compatible(
&mut self,
- caller: caller,
- collection: address,
- base_uri: string,
+ caller: Caller,
+ collection: Address,
+ base_uri: String,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let collection =
@@ -334,7 +334,7 @@
}
#[weight(<SelfWeightOf<T>>::destroy_collection())]
- fn destroy_collection(&mut self, caller: caller, collection_address: address) -> Result<void> {
+ fn destroy_collection(&mut self, caller: Caller, collection_address: Address) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let collection_id = pallet_common::eth::map_eth_to_id(&collection_address)
@@ -346,7 +346,7 @@
/// Check if a collection exists
/// @param collectionAddress Address of the collection in question
/// @return bool Does the collection exist?
- fn is_collection_exist(&self, _caller: caller, collection_address: address) -> Result<bool> {
+ fn is_collection_exist(&self, _caller: Caller, collection_address: Address) -> Result<bool> {
if let Some(id) = pallet_common::eth::map_eth_to_id(&collection_address) {
let collection_id = id;
return Ok(<CollectionById<T>>::contains_key(collection_id));
@@ -355,7 +355,7 @@
Ok(false)
}
- fn collection_creation_fee(&self) -> Result<value> {
+ fn collection_creation_fee(&self) -> Result<Value> {
let price: u128 = T::CollectionCreationPrice::get()
.try_into()
.map_err(|_| ()) // workaround for `expect` requiring `Debug` trait
@@ -366,14 +366,14 @@
/// Returns address of a collection.
/// @param collectionId - CollectionId of the collection
/// @return eth mirror address of the collection
- fn collection_address(&self, collection_id: uint32) -> Result<address> {
+ fn collection_address(&self, collection_id: u32) -> Result<Address> {
Ok(collection_id_to_address(collection_id.into()))
}
/// Returns collectionId of a collection.
/// @param collectionAddress - Eth address of the collection
/// @return collectionId of the collection
- fn collection_id(&self, collection_address: address) -> Result<uint32> {
+ fn collection_id(&self, collection_address: Address) -> Result<u32> {
map_eth_to_id(&collection_address)
.map(|id| id.0)
.ok_or(Error::Revert(format!(
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),
tests/src/eth/abi/fungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/fungible.json
+++ b/tests/src/eth/abi/fungible.json
@@ -488,7 +488,9 @@
"type": "function"
},
{
- "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],
+ "inputs": [
+ { "internalType": "enum AccessMode", "name": "mode", "type": "uint8" }
+ ],
"name": "setCollectionAccess",
"outputs": [],
"stateMutability": "nonpayable",
tests/src/eth/abi/nonFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -630,7 +630,9 @@
"type": "function"
},
{
- "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],
+ "inputs": [
+ { "internalType": "enum AccessMode", "name": "mode", "type": "uint8" }
+ ],
"name": "setCollectionAccess",
"outputs": [],
"stateMutability": "nonpayable",
tests/src/eth/abi/reFungible.jsondiffbeforeafterboth--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -612,7 +612,9 @@
"type": "function"
},
{
- "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],
+ "inputs": [
+ { "internalType": "enum AccessMode", "name": "mode", "type": "uint8" }
+ ],
"name": "setCollectionAccess",
"outputs": [],
"stateMutability": "nonpayable",
tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -175,11 +175,9 @@
/// Set the collection access method.
/// @param mode Access mode
- /// 0 for Normal
- /// 1 for AllowList
/// @dev EVM selector for this function is: 0x41835d4c,
/// or in textual repr: setCollectionAccess(uint8)
- function setCollectionAccess(uint8 mode) external;
+ function setCollectionAccess(AccessMode mode) external;
/// Checks that user allowed to operate with collection.
///
@@ -285,6 +283,14 @@
uint256 sub;
}
+/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).
+enum AccessMode {
+ /// Access grant for owner and admins. Used as default.
+ Normal,
+ /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.
+ AllowList
+}
+
/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
struct CollectionNestingPermission {
CollectionPermissionField field;
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -275,11 +275,9 @@
/// Set the collection access method.
/// @param mode Access mode
- /// 0 for Normal
- /// 1 for AllowList
/// @dev EVM selector for this function is: 0x41835d4c,
/// or in textual repr: setCollectionAccess(uint8)
- function setCollectionAccess(uint8 mode) external;
+ function setCollectionAccess(AccessMode mode) external;
/// Checks that user allowed to operate with collection.
///
@@ -385,6 +383,14 @@
uint256 sub;
}
+/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).
+enum AccessMode {
+ /// Access grant for owner and admins. Used as default.
+ Normal,
+ /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.
+ AllowList
+}
+
/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
struct CollectionNestingPermission {
CollectionPermissionField field;
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -275,11 +275,9 @@
/// Set the collection access method.
/// @param mode Access mode
- /// 0 for Normal
- /// 1 for AllowList
/// @dev EVM selector for this function is: 0x41835d4c,
/// or in textual repr: setCollectionAccess(uint8)
- function setCollectionAccess(uint8 mode) external;
+ function setCollectionAccess(AccessMode mode) external;
/// Checks that user allowed to operate with collection.
///
@@ -385,6 +383,14 @@
uint256 sub;
}
+/// Ethereum representation of `AccessMode` (see [`up_data_structs::AccessMode`]).
+enum AccessMode {
+ /// Access grant for owner and admins. Used as default.
+ Normal,
+ /// Like a [`Normal`](AccessMode::Normal) but also users in allow list.
+ AllowList
+}
+
/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
struct CollectionNestingPermission {
CollectionPermissionField field;