git.delta.rocks / unique-network / refs/commits / 45d19b2ecee4

difftreelog

refactor remove last anonimous structs

Trubnikov Sergey2022-12-21parent: #8ca834e.patch.diff
in: master

14 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -34,9 +34,7 @@
 
 use crate::{
 	Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf,
-	eth::{
-		CollectionPermissions as EvmPermissions, CollectionLimitField as EvmCollectionLimits, self,
-	},
+	eth::{CollectionLimitField as EvmCollectionLimits, self},
 	weights::WeightInfo,
 };
 
@@ -490,10 +488,10 @@
 
 	/// Returns nesting for a collection
 	#[solidity(rename_selector = "collectionNestingRestrictedCollectionIds")]
-	fn collection_nesting_restricted_ids(&self) -> Result<(bool, Vec<uint256>)> {
+	fn collection_nesting_restricted_ids(&self) -> Result<eth::CollectionNesting> {
 		let nesting = self.collection.permissions.nesting();
 
-		Ok((
+		Ok(eth::CollectionNesting::new(
 			nesting.token_owner,
 			nesting
 				.restricted
@@ -504,11 +502,17 @@
 	}
 
 	/// Returns permissions for a collection
-	fn collection_nesting_permissions(&self) -> Result<Vec<(EvmPermissions, bool)>> {
+	fn collection_nesting_permissions(&self) -> Result<Vec<eth::CollectionNestingPermission>> {
 		let nesting = self.collection.permissions.nesting();
 		Ok(vec![
-			(EvmPermissions::CollectionAdmin, nesting.collection_admin),
-			(EvmPermissions::TokenOwner, nesting.token_owner),
+			eth::CollectionNestingPermission::new(
+				eth::CollectionPermissionField::CollectionAdmin,
+				nesting.collection_admin,
+			),
+			eth::CollectionNestingPermission::new(
+				eth::CollectionPermissionField::TokenOwner,
+				nesting.token_owner,
+			),
 		])
 	}
 	/// Set the collection access method.
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -306,7 +306,7 @@
 /// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
 #[derive(Default, Debug, Clone, Copy, AbiCoder)]
 #[repr(u8)]
-pub enum CollectionPermissions {
+pub enum CollectionPermissionField {
 	/// Owner of token can nest tokens under it.
 	#[default]
 	TokenOwner,
@@ -431,3 +431,31 @@
 		Ok(perms)
 	}
 }
+
+/// Nested collections.
+#[derive(Debug, Default, AbiCoder)]
+pub struct CollectionNesting {
+	token_owner: bool,
+	ids: Vec<uint256>,
+}
+
+impl CollectionNesting {
+	/// Create [`CollectionNesting`].
+	pub fn new(token_owner: bool, ids: Vec<uint256>) -> Self {
+		Self { token_owner, ids }
+	}
+}
+
+/// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+#[derive(Debug, Default, AbiCoder)]
+pub struct CollectionNestingPermission {
+	field: CollectionPermissionField,
+	value: bool,
+}
+
+impl CollectionNestingPermission {
+	/// Create [`CollectionNestingPermission`].
+	pub fn new(field: CollectionPermissionField, value: bool) -> Self {
+		Self { field, value }
+	}
+}
modifiedpallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -257,19 +257,19 @@
 	/// Returns nesting for a collection
 	/// @dev EVM selector for this function is: 0x22d25bfe,
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
-	function collectionNestingRestrictedCollectionIds() public view returns (Tuple33 memory) {
+	function collectionNestingRestrictedCollectionIds() public view returns (CollectionNesting memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple33(false, new uint256[](0));
+		return CollectionNesting(false, new uint256[](0));
 	}
 
 	/// Returns permissions for a collection
 	/// @dev EVM selector for this function is: 0x5b2eaf4b,
 	///  or in textual repr: collectionNestingPermissions()
-	function collectionNestingPermissions() public view returns (Tuple36[] memory) {
+	function collectionNestingPermissions() public view returns (CollectionNestingPermission[] memory) {
 		require(false, stub_error);
 		dummy;
-		return new Tuple36[](0);
+		return new CollectionNestingPermission[](0);
 	}
 
 	/// Set the collection access method.
@@ -443,24 +443,24 @@
 	uint256 sub;
 }
 
+/// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+struct CollectionNestingPermission {
+	CollectionPermissionField field;
+	bool value;
+}
+
 /// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
-enum CollectionPermissions {
+enum CollectionPermissionField {
 	/// @dev Owner of token can nest tokens under it.
 	TokenOwner,
 	/// @dev Admin of token collection can nest tokens under token.
 	CollectionAdmin
 }
 
-/// @dev anonymous struct
-struct Tuple36 {
-	CollectionPermissions field_0;
-	bool field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple33 {
-	bool field_0;
-	uint256[] field_1;
+/// @dev Nested collections.
+struct CollectionNesting {
+	bool token_owner;
+	uint256[] ids;
 }
 
 /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.
@@ -469,6 +469,7 @@
 	OptionUint value;
 }
 
+/// @dev Ethereum representation of Optional value with uint256.
 struct OptionUint {
 	bool status;
 	uint256 value;
modifiedpallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -401,19 +401,19 @@
 	/// Returns nesting for a collection
 	/// @dev EVM selector for this function is: 0x22d25bfe,
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
-	function collectionNestingRestrictedCollectionIds() public view returns (Tuple45 memory) {
+	function collectionNestingRestrictedCollectionIds() public view returns (CollectionNesting memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple45(false, new uint256[](0));
+		return CollectionNesting(false, new uint256[](0));
 	}
 
 	/// Returns permissions for a collection
 	/// @dev EVM selector for this function is: 0x5b2eaf4b,
 	///  or in textual repr: collectionNestingPermissions()
-	function collectionNestingPermissions() public view returns (Tuple48[] memory) {
+	function collectionNestingPermissions() public view returns (CollectionNestingPermission[] memory) {
 		require(false, stub_error);
 		dummy;
-		return new Tuple48[](0);
+		return new CollectionNestingPermission[](0);
 	}
 
 	/// Set the collection access method.
@@ -587,24 +587,24 @@
 	uint256 sub;
 }
 
+/// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+struct CollectionNestingPermission {
+	CollectionPermissionField field;
+	bool value;
+}
+
 /// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
-enum CollectionPermissions {
+enum CollectionPermissionField {
 	/// @dev Owner of token can nest tokens under it.
 	TokenOwner,
 	/// @dev Admin of token collection can nest tokens under token.
 	CollectionAdmin
 }
 
-/// @dev anonymous struct
-struct Tuple48 {
-	CollectionPermissions field_0;
-	bool field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple45 {
-	bool field_0;
-	uint256[] field_1;
+/// @dev Nested collections.
+struct CollectionNesting {
+	bool token_owner;
+	uint256[] ids;
 }
 
 /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.
@@ -613,6 +613,7 @@
 	OptionUint value;
 }
 
+/// @dev Ethereum representation of Optional value with uint256.
 struct OptionUint {
 	bool status;
 	uint256 value;
modifiedpallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -401,19 +401,19 @@
 	/// Returns nesting for a collection
 	/// @dev EVM selector for this function is: 0x22d25bfe,
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
-	function collectionNestingRestrictedCollectionIds() public view returns (Tuple44 memory) {
+	function collectionNestingRestrictedCollectionIds() public view returns (CollectionNesting memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple44(false, new uint256[](0));
+		return CollectionNesting(false, new uint256[](0));
 	}
 
 	/// Returns permissions for a collection
 	/// @dev EVM selector for this function is: 0x5b2eaf4b,
 	///  or in textual repr: collectionNestingPermissions()
-	function collectionNestingPermissions() public view returns (Tuple47[] memory) {
+	function collectionNestingPermissions() public view returns (CollectionNestingPermission[] memory) {
 		require(false, stub_error);
 		dummy;
-		return new Tuple47[](0);
+		return new CollectionNestingPermission[](0);
 	}
 
 	/// Set the collection access method.
@@ -587,24 +587,24 @@
 	uint256 sub;
 }
 
+/// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+struct CollectionNestingPermission {
+	CollectionPermissionField field;
+	bool value;
+}
+
 /// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
-enum CollectionPermissions {
+enum CollectionPermissionField {
 	/// @dev Owner of token can nest tokens under it.
 	TokenOwner,
 	/// @dev Admin of token collection can nest tokens under token.
 	CollectionAdmin
 }
 
-/// @dev anonymous struct
-struct Tuple47 {
-	CollectionPermissions field_0;
-	bool field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple44 {
-	bool field_0;
-	uint256[] field_1;
+/// @dev Nested collections.
+struct CollectionNesting {
+	bool token_owner;
+	uint256[] ids;
 }
 
 /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.
@@ -613,6 +613,7 @@
 	OptionUint value;
 }
 
+/// @dev Ethereum representation of Optional value with uint256.
 struct OptionUint {
 	bool status;
 	uint256 value;
modifiedtests/src/eth/abi/fungible.jsondiffbeforeafterboth
before · tests/src/eth/abi/fungible.json
1[2  {3    "anonymous": false,4    "inputs": [5      {6        "indexed": true,7        "internalType": "address",8        "name": "owner",9        "type": "address"10      },11      {12        "indexed": true,13        "internalType": "address",14        "name": "spender",15        "type": "address"16      },17      {18        "indexed": false,19        "internalType": "uint256",20        "name": "value",21        "type": "uint256"22      }23    ],24    "name": "Approval",25    "type": "event"26  },27  {28    "anonymous": false,29    "inputs": [30      {31        "indexed": true,32        "internalType": "address",33        "name": "from",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "to",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "uint256",45        "name": "value",46        "type": "uint256"47      }48    ],49    "name": "Transfer",50    "type": "event"51  },52  {53    "inputs": [54      {55        "components": [56          { "internalType": "address", "name": "eth", "type": "address" },57          { "internalType": "uint256", "name": "sub", "type": "uint256" }58        ],59        "internalType": "struct CrossAccount",60        "name": "newAdmin",61        "type": "tuple"62      }63    ],64    "name": "addCollectionAdminCross",65    "outputs": [],66    "stateMutability": "nonpayable",67    "type": "function"68  },69  {70    "inputs": [71      {72        "components": [73          { "internalType": "address", "name": "eth", "type": "address" },74          { "internalType": "uint256", "name": "sub", "type": "uint256" }75        ],76        "internalType": "struct CrossAccount",77        "name": "user",78        "type": "tuple"79      }80    ],81    "name": "addToCollectionAllowListCross",82    "outputs": [],83    "stateMutability": "nonpayable",84    "type": "function"85  },86  {87    "inputs": [88      { "internalType": "address", "name": "owner", "type": "address" },89      { "internalType": "address", "name": "spender", "type": "address" }90    ],91    "name": "allowance",92    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],93    "stateMutability": "view",94    "type": "function"95  },96  {97    "inputs": [98      {99        "components": [100          { "internalType": "address", "name": "eth", "type": "address" },101          { "internalType": "uint256", "name": "sub", "type": "uint256" }102        ],103        "internalType": "struct CrossAccount",104        "name": "user",105        "type": "tuple"106      }107    ],108    "name": "allowlistedCross",109    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],110    "stateMutability": "view",111    "type": "function"112  },113  {114    "inputs": [115      { "internalType": "address", "name": "spender", "type": "address" },116      { "internalType": "uint256", "name": "amount", "type": "uint256" }117    ],118    "name": "approve",119    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],120    "stateMutability": "nonpayable",121    "type": "function"122  },123  {124    "inputs": [125      {126        "components": [127          { "internalType": "address", "name": "eth", "type": "address" },128          { "internalType": "uint256", "name": "sub", "type": "uint256" }129        ],130        "internalType": "struct CrossAccount",131        "name": "spender",132        "type": "tuple"133      },134      { "internalType": "uint256", "name": "amount", "type": "uint256" }135    ],136    "name": "approveCross",137    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],138    "stateMutability": "nonpayable",139    "type": "function"140  },141  {142    "inputs": [143      { "internalType": "address", "name": "owner", "type": "address" }144    ],145    "name": "balanceOf",146    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],147    "stateMutability": "view",148    "type": "function"149  },150  {151    "inputs": [152      {153        "components": [154          { "internalType": "address", "name": "eth", "type": "address" },155          { "internalType": "uint256", "name": "sub", "type": "uint256" }156        ],157        "internalType": "struct CrossAccount",158        "name": "from",159        "type": "tuple"160      },161      { "internalType": "uint256", "name": "amount", "type": "uint256" }162    ],163    "name": "burnFromCross",164    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],165    "stateMutability": "nonpayable",166    "type": "function"167  },168  {169    "inputs": [170      {171        "components": [172          { "internalType": "address", "name": "eth", "type": "address" },173          { "internalType": "uint256", "name": "sub", "type": "uint256" }174        ],175        "internalType": "struct CrossAccount",176        "name": "newOwner",177        "type": "tuple"178      }179    ],180    "name": "changeCollectionOwnerCross",181    "outputs": [],182    "stateMutability": "nonpayable",183    "type": "function"184  },185  {186    "inputs": [],187    "name": "collectionAdmins",188    "outputs": [189      {190        "components": [191          { "internalType": "address", "name": "eth", "type": "address" },192          { "internalType": "uint256", "name": "sub", "type": "uint256" }193        ],194        "internalType": "struct CrossAccount[]",195        "name": "",196        "type": "tuple[]"197      }198    ],199    "stateMutability": "view",200    "type": "function"201  },202  {203    "inputs": [],204    "name": "collectionHelperAddress",205    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],206    "stateMutability": "view",207    "type": "function"208  },209  {210    "inputs": [],211    "name": "collectionLimits",212    "outputs": [213      {214        "components": [215          {216            "internalType": "enum CollectionLimitField",217            "name": "field",218            "type": "uint8"219          },220          {221            "components": [222              { "internalType": "bool", "name": "status", "type": "bool" },223              { "internalType": "uint256", "name": "value", "type": "uint256" }224            ],225            "internalType": "struct OptionUint",226            "name": "value",227            "type": "tuple"228          }229        ],230        "internalType": "struct CollectionLimit[]",231        "name": "",232        "type": "tuple[]"233      }234    ],235    "stateMutability": "view",236    "type": "function"237  },238  {239    "inputs": [],240    "name": "collectionNestingPermissions",241    "outputs": [242      {243        "components": [244          {245            "internalType": "enum CollectionPermissions",246            "name": "field_0",247            "type": "uint8"248          },249          { "internalType": "bool", "name": "field_1", "type": "bool" }250        ],251        "internalType": "struct Tuple36[]",252        "name": "",253        "type": "tuple[]"254      }255    ],256    "stateMutability": "view",257    "type": "function"258  },259  {260    "inputs": [],261    "name": "collectionNestingRestrictedCollectionIds",262    "outputs": [263      {264        "components": [265          { "internalType": "bool", "name": "field_0", "type": "bool" },266          {267            "internalType": "uint256[]",268            "name": "field_1",269            "type": "uint256[]"270          }271        ],272        "internalType": "struct Tuple33",273        "name": "",274        "type": "tuple"275      }276    ],277    "stateMutability": "view",278    "type": "function"279  },280  {281    "inputs": [],282    "name": "collectionOwner",283    "outputs": [284      {285        "components": [286          { "internalType": "address", "name": "eth", "type": "address" },287          { "internalType": "uint256", "name": "sub", "type": "uint256" }288        ],289        "internalType": "struct CrossAccount",290        "name": "",291        "type": "tuple"292      }293    ],294    "stateMutability": "view",295    "type": "function"296  },297  {298    "inputs": [299      { "internalType": "string[]", "name": "keys", "type": "string[]" }300    ],301    "name": "collectionProperties",302    "outputs": [303      {304        "components": [305          { "internalType": "string", "name": "key", "type": "string" },306          { "internalType": "bytes", "name": "value", "type": "bytes" }307        ],308        "internalType": "struct Property[]",309        "name": "",310        "type": "tuple[]"311      }312    ],313    "stateMutability": "view",314    "type": "function"315  },316  {317    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],318    "name": "collectionProperty",319    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],320    "stateMutability": "view",321    "type": "function"322  },323  {324    "inputs": [],325    "name": "collectionSponsor",326    "outputs": [327      {328        "components": [329          { "internalType": "address", "name": "eth", "type": "address" },330          { "internalType": "uint256", "name": "sub", "type": "uint256" }331        ],332        "internalType": "struct CrossAccount",333        "name": "",334        "type": "tuple"335      }336    ],337    "stateMutability": "view",338    "type": "function"339  },340  {341    "inputs": [],342    "name": "confirmCollectionSponsorship",343    "outputs": [],344    "stateMutability": "nonpayable",345    "type": "function"346  },347  {348    "inputs": [],349    "name": "contractAddress",350    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],351    "stateMutability": "view",352    "type": "function"353  },354  {355    "inputs": [],356    "name": "decimals",357    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],358    "stateMutability": "view",359    "type": "function"360  },361  {362    "inputs": [363      { "internalType": "string[]", "name": "keys", "type": "string[]" }364    ],365    "name": "deleteCollectionProperties",366    "outputs": [],367    "stateMutability": "nonpayable",368    "type": "function"369  },370  {371    "inputs": [],372    "name": "description",373    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],374    "stateMutability": "view",375    "type": "function"376  },377  {378    "inputs": [],379    "name": "hasCollectionPendingSponsor",380    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],381    "stateMutability": "view",382    "type": "function"383  },384  {385    "inputs": [386      {387        "components": [388          { "internalType": "address", "name": "eth", "type": "address" },389          { "internalType": "uint256", "name": "sub", "type": "uint256" }390        ],391        "internalType": "struct CrossAccount",392        "name": "user",393        "type": "tuple"394      }395    ],396    "name": "isOwnerOrAdminCross",397    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],398    "stateMutability": "view",399    "type": "function"400  },401  {402    "inputs": [403      { "internalType": "address", "name": "to", "type": "address" },404      { "internalType": "uint256", "name": "amount", "type": "uint256" }405    ],406    "name": "mint",407    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],408    "stateMutability": "nonpayable",409    "type": "function"410  },411  {412    "inputs": [413      {414        "components": [415          { "internalType": "address", "name": "field_0", "type": "address" },416          { "internalType": "uint256", "name": "field_1", "type": "uint256" }417        ],418        "internalType": "struct Tuple9[]",419        "name": "amounts",420        "type": "tuple[]"421      }422    ],423    "name": "mintBulk",424    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],425    "stateMutability": "nonpayable",426    "type": "function"427  },428  {429    "inputs": [430      {431        "components": [432          { "internalType": "address", "name": "eth", "type": "address" },433          { "internalType": "uint256", "name": "sub", "type": "uint256" }434        ],435        "internalType": "struct CrossAccount",436        "name": "to",437        "type": "tuple"438      },439      { "internalType": "uint256", "name": "amount", "type": "uint256" }440    ],441    "name": "mintCross",442    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],443    "stateMutability": "nonpayable",444    "type": "function"445  },446  {447    "inputs": [],448    "name": "name",449    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],450    "stateMutability": "view",451    "type": "function"452  },453  {454    "inputs": [455      {456        "components": [457          { "internalType": "address", "name": "eth", "type": "address" },458          { "internalType": "uint256", "name": "sub", "type": "uint256" }459        ],460        "internalType": "struct CrossAccount",461        "name": "admin",462        "type": "tuple"463      }464    ],465    "name": "removeCollectionAdminCross",466    "outputs": [],467    "stateMutability": "nonpayable",468    "type": "function"469  },470  {471    "inputs": [],472    "name": "removeCollectionSponsor",473    "outputs": [],474    "stateMutability": "nonpayable",475    "type": "function"476  },477  {478    "inputs": [479      {480        "components": [481          { "internalType": "address", "name": "eth", "type": "address" },482          { "internalType": "uint256", "name": "sub", "type": "uint256" }483        ],484        "internalType": "struct CrossAccount",485        "name": "user",486        "type": "tuple"487      }488    ],489    "name": "removeFromCollectionAllowListCross",490    "outputs": [],491    "stateMutability": "nonpayable",492    "type": "function"493  },494  {495    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],496    "name": "setCollectionAccess",497    "outputs": [],498    "stateMutability": "nonpayable",499    "type": "function"500  },501  {502    "inputs": [503      {504        "components": [505          {506            "internalType": "enum CollectionLimitField",507            "name": "field",508            "type": "uint8"509          },510          {511            "components": [512              { "internalType": "bool", "name": "status", "type": "bool" },513              { "internalType": "uint256", "name": "value", "type": "uint256" }514            ],515            "internalType": "struct OptionUint",516            "name": "value",517            "type": "tuple"518          }519        ],520        "internalType": "struct CollectionLimit",521        "name": "limit",522        "type": "tuple"523      }524    ],525    "name": "setCollectionLimit",526    "outputs": [],527    "stateMutability": "nonpayable",528    "type": "function"529  },530  {531    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],532    "name": "setCollectionMintMode",533    "outputs": [],534    "stateMutability": "nonpayable",535    "type": "function"536  },537  {538    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],539    "name": "setCollectionNesting",540    "outputs": [],541    "stateMutability": "nonpayable",542    "type": "function"543  },544  {545    "inputs": [546      { "internalType": "bool", "name": "enable", "type": "bool" },547      {548        "internalType": "address[]",549        "name": "collections",550        "type": "address[]"551      }552    ],553    "name": "setCollectionNesting",554    "outputs": [],555    "stateMutability": "nonpayable",556    "type": "function"557  },558  {559    "inputs": [560      {561        "components": [562          { "internalType": "string", "name": "key", "type": "string" },563          { "internalType": "bytes", "name": "value", "type": "bytes" }564        ],565        "internalType": "struct Property[]",566        "name": "properties",567        "type": "tuple[]"568      }569    ],570    "name": "setCollectionProperties",571    "outputs": [],572    "stateMutability": "nonpayable",573    "type": "function"574  },575  {576    "inputs": [577      {578        "components": [579          { "internalType": "address", "name": "eth", "type": "address" },580          { "internalType": "uint256", "name": "sub", "type": "uint256" }581        ],582        "internalType": "struct CrossAccount",583        "name": "sponsor",584        "type": "tuple"585      }586    ],587    "name": "setCollectionSponsorCross",588    "outputs": [],589    "stateMutability": "nonpayable",590    "type": "function"591  },592  {593    "inputs": [594      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }595    ],596    "name": "supportsInterface",597    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],598    "stateMutability": "view",599    "type": "function"600  },601  {602    "inputs": [],603    "name": "symbol",604    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],605    "stateMutability": "view",606    "type": "function"607  },608  {609    "inputs": [],610    "name": "totalSupply",611    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],612    "stateMutability": "view",613    "type": "function"614  },615  {616    "inputs": [617      { "internalType": "address", "name": "to", "type": "address" },618      { "internalType": "uint256", "name": "amount", "type": "uint256" }619    ],620    "name": "transfer",621    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],622    "stateMutability": "nonpayable",623    "type": "function"624  },625  {626    "inputs": [627      {628        "components": [629          { "internalType": "address", "name": "eth", "type": "address" },630          { "internalType": "uint256", "name": "sub", "type": "uint256" }631        ],632        "internalType": "struct CrossAccount",633        "name": "to",634        "type": "tuple"635      },636      { "internalType": "uint256", "name": "amount", "type": "uint256" }637    ],638    "name": "transferCross",639    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],640    "stateMutability": "nonpayable",641    "type": "function"642  },643  {644    "inputs": [645      { "internalType": "address", "name": "from", "type": "address" },646      { "internalType": "address", "name": "to", "type": "address" },647      { "internalType": "uint256", "name": "amount", "type": "uint256" }648    ],649    "name": "transferFrom",650    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],651    "stateMutability": "nonpayable",652    "type": "function"653  },654  {655    "inputs": [656      {657        "components": [658          { "internalType": "address", "name": "eth", "type": "address" },659          { "internalType": "uint256", "name": "sub", "type": "uint256" }660        ],661        "internalType": "struct CrossAccount",662        "name": "from",663        "type": "tuple"664      },665      {666        "components": [667          { "internalType": "address", "name": "eth", "type": "address" },668          { "internalType": "uint256", "name": "sub", "type": "uint256" }669        ],670        "internalType": "struct CrossAccount",671        "name": "to",672        "type": "tuple"673      },674      { "internalType": "uint256", "name": "amount", "type": "uint256" }675    ],676    "name": "transferFromCross",677    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],678    "stateMutability": "nonpayable",679    "type": "function"680  },681  {682    "inputs": [],683    "name": "uniqueCollectionType",684    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],685    "stateMutability": "view",686    "type": "function"687  }688]
after · tests/src/eth/abi/fungible.json
1[2  {3    "anonymous": false,4    "inputs": [5      {6        "indexed": true,7        "internalType": "address",8        "name": "owner",9        "type": "address"10      },11      {12        "indexed": true,13        "internalType": "address",14        "name": "spender",15        "type": "address"16      },17      {18        "indexed": false,19        "internalType": "uint256",20        "name": "value",21        "type": "uint256"22      }23    ],24    "name": "Approval",25    "type": "event"26  },27  {28    "anonymous": false,29    "inputs": [30      {31        "indexed": true,32        "internalType": "address",33        "name": "from",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "to",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "uint256",45        "name": "value",46        "type": "uint256"47      }48    ],49    "name": "Transfer",50    "type": "event"51  },52  {53    "inputs": [54      {55        "components": [56          { "internalType": "address", "name": "eth", "type": "address" },57          { "internalType": "uint256", "name": "sub", "type": "uint256" }58        ],59        "internalType": "struct CrossAccount",60        "name": "newAdmin",61        "type": "tuple"62      }63    ],64    "name": "addCollectionAdminCross",65    "outputs": [],66    "stateMutability": "nonpayable",67    "type": "function"68  },69  {70    "inputs": [71      {72        "components": [73          { "internalType": "address", "name": "eth", "type": "address" },74          { "internalType": "uint256", "name": "sub", "type": "uint256" }75        ],76        "internalType": "struct CrossAccount",77        "name": "user",78        "type": "tuple"79      }80    ],81    "name": "addToCollectionAllowListCross",82    "outputs": [],83    "stateMutability": "nonpayable",84    "type": "function"85  },86  {87    "inputs": [88      { "internalType": "address", "name": "owner", "type": "address" },89      { "internalType": "address", "name": "spender", "type": "address" }90    ],91    "name": "allowance",92    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],93    "stateMutability": "view",94    "type": "function"95  },96  {97    "inputs": [98      {99        "components": [100          { "internalType": "address", "name": "eth", "type": "address" },101          { "internalType": "uint256", "name": "sub", "type": "uint256" }102        ],103        "internalType": "struct CrossAccount",104        "name": "user",105        "type": "tuple"106      }107    ],108    "name": "allowlistedCross",109    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],110    "stateMutability": "view",111    "type": "function"112  },113  {114    "inputs": [115      { "internalType": "address", "name": "spender", "type": "address" },116      { "internalType": "uint256", "name": "amount", "type": "uint256" }117    ],118    "name": "approve",119    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],120    "stateMutability": "nonpayable",121    "type": "function"122  },123  {124    "inputs": [125      {126        "components": [127          { "internalType": "address", "name": "eth", "type": "address" },128          { "internalType": "uint256", "name": "sub", "type": "uint256" }129        ],130        "internalType": "struct CrossAccount",131        "name": "spender",132        "type": "tuple"133      },134      { "internalType": "uint256", "name": "amount", "type": "uint256" }135    ],136    "name": "approveCross",137    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],138    "stateMutability": "nonpayable",139    "type": "function"140  },141  {142    "inputs": [143      { "internalType": "address", "name": "owner", "type": "address" }144    ],145    "name": "balanceOf",146    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],147    "stateMutability": "view",148    "type": "function"149  },150  {151    "inputs": [152      {153        "components": [154          { "internalType": "address", "name": "eth", "type": "address" },155          { "internalType": "uint256", "name": "sub", "type": "uint256" }156        ],157        "internalType": "struct CrossAccount",158        "name": "from",159        "type": "tuple"160      },161      { "internalType": "uint256", "name": "amount", "type": "uint256" }162    ],163    "name": "burnFromCross",164    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],165    "stateMutability": "nonpayable",166    "type": "function"167  },168  {169    "inputs": [170      {171        "components": [172          { "internalType": "address", "name": "eth", "type": "address" },173          { "internalType": "uint256", "name": "sub", "type": "uint256" }174        ],175        "internalType": "struct CrossAccount",176        "name": "newOwner",177        "type": "tuple"178      }179    ],180    "name": "changeCollectionOwnerCross",181    "outputs": [],182    "stateMutability": "nonpayable",183    "type": "function"184  },185  {186    "inputs": [],187    "name": "collectionAdmins",188    "outputs": [189      {190        "components": [191          { "internalType": "address", "name": "eth", "type": "address" },192          { "internalType": "uint256", "name": "sub", "type": "uint256" }193        ],194        "internalType": "struct CrossAccount[]",195        "name": "",196        "type": "tuple[]"197      }198    ],199    "stateMutability": "view",200    "type": "function"201  },202  {203    "inputs": [],204    "name": "collectionHelperAddress",205    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],206    "stateMutability": "view",207    "type": "function"208  },209  {210    "inputs": [],211    "name": "collectionLimits",212    "outputs": [213      {214        "components": [215          {216            "internalType": "enum CollectionLimitField",217            "name": "field",218            "type": "uint8"219          },220          {221            "components": [222              { "internalType": "bool", "name": "status", "type": "bool" },223              { "internalType": "uint256", "name": "value", "type": "uint256" }224            ],225            "internalType": "struct OptionUint",226            "name": "value",227            "type": "tuple"228          }229        ],230        "internalType": "struct CollectionLimit[]",231        "name": "",232        "type": "tuple[]"233      }234    ],235    "stateMutability": "view",236    "type": "function"237  },238  {239    "inputs": [],240    "name": "collectionNestingPermissions",241    "outputs": [242      {243        "components": [244          {245            "internalType": "enum CollectionPermissionField",246            "name": "field",247            "type": "uint8"248          },249          { "internalType": "bool", "name": "value", "type": "bool" }250        ],251        "internalType": "struct CollectionNestingPermission[]",252        "name": "",253        "type": "tuple[]"254      }255    ],256    "stateMutability": "view",257    "type": "function"258  },259  {260    "inputs": [],261    "name": "collectionNestingRestrictedCollectionIds",262    "outputs": [263      {264        "components": [265          { "internalType": "bool", "name": "token_owner", "type": "bool" },266          { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }267        ],268        "internalType": "struct CollectionNesting",269        "name": "",270        "type": "tuple"271      }272    ],273    "stateMutability": "view",274    "type": "function"275  },276  {277    "inputs": [],278    "name": "collectionOwner",279    "outputs": [280      {281        "components": [282          { "internalType": "address", "name": "eth", "type": "address" },283          { "internalType": "uint256", "name": "sub", "type": "uint256" }284        ],285        "internalType": "struct CrossAccount",286        "name": "",287        "type": "tuple"288      }289    ],290    "stateMutability": "view",291    "type": "function"292  },293  {294    "inputs": [295      { "internalType": "string[]", "name": "keys", "type": "string[]" }296    ],297    "name": "collectionProperties",298    "outputs": [299      {300        "components": [301          { "internalType": "string", "name": "key", "type": "string" },302          { "internalType": "bytes", "name": "value", "type": "bytes" }303        ],304        "internalType": "struct Property[]",305        "name": "",306        "type": "tuple[]"307      }308    ],309    "stateMutability": "view",310    "type": "function"311  },312  {313    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],314    "name": "collectionProperty",315    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],316    "stateMutability": "view",317    "type": "function"318  },319  {320    "inputs": [],321    "name": "collectionSponsor",322    "outputs": [323      {324        "components": [325          { "internalType": "address", "name": "eth", "type": "address" },326          { "internalType": "uint256", "name": "sub", "type": "uint256" }327        ],328        "internalType": "struct CrossAccount",329        "name": "",330        "type": "tuple"331      }332    ],333    "stateMutability": "view",334    "type": "function"335  },336  {337    "inputs": [],338    "name": "confirmCollectionSponsorship",339    "outputs": [],340    "stateMutability": "nonpayable",341    "type": "function"342  },343  {344    "inputs": [],345    "name": "contractAddress",346    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],347    "stateMutability": "view",348    "type": "function"349  },350  {351    "inputs": [],352    "name": "decimals",353    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],354    "stateMutability": "view",355    "type": "function"356  },357  {358    "inputs": [359      { "internalType": "string[]", "name": "keys", "type": "string[]" }360    ],361    "name": "deleteCollectionProperties",362    "outputs": [],363    "stateMutability": "nonpayable",364    "type": "function"365  },366  {367    "inputs": [],368    "name": "description",369    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],370    "stateMutability": "view",371    "type": "function"372  },373  {374    "inputs": [],375    "name": "hasCollectionPendingSponsor",376    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],377    "stateMutability": "view",378    "type": "function"379  },380  {381    "inputs": [382      {383        "components": [384          { "internalType": "address", "name": "eth", "type": "address" },385          { "internalType": "uint256", "name": "sub", "type": "uint256" }386        ],387        "internalType": "struct CrossAccount",388        "name": "user",389        "type": "tuple"390      }391    ],392    "name": "isOwnerOrAdminCross",393    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],394    "stateMutability": "view",395    "type": "function"396  },397  {398    "inputs": [399      { "internalType": "address", "name": "to", "type": "address" },400      { "internalType": "uint256", "name": "amount", "type": "uint256" }401    ],402    "name": "mint",403    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],404    "stateMutability": "nonpayable",405    "type": "function"406  },407  {408    "inputs": [409      {410        "components": [411          { "internalType": "address", "name": "field_0", "type": "address" },412          { "internalType": "uint256", "name": "field_1", "type": "uint256" }413        ],414        "internalType": "struct Tuple9[]",415        "name": "amounts",416        "type": "tuple[]"417      }418    ],419    "name": "mintBulk",420    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],421    "stateMutability": "nonpayable",422    "type": "function"423  },424  {425    "inputs": [426      {427        "components": [428          { "internalType": "address", "name": "eth", "type": "address" },429          { "internalType": "uint256", "name": "sub", "type": "uint256" }430        ],431        "internalType": "struct CrossAccount",432        "name": "to",433        "type": "tuple"434      },435      { "internalType": "uint256", "name": "amount", "type": "uint256" }436    ],437    "name": "mintCross",438    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],439    "stateMutability": "nonpayable",440    "type": "function"441  },442  {443    "inputs": [],444    "name": "name",445    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],446    "stateMutability": "view",447    "type": "function"448  },449  {450    "inputs": [451      {452        "components": [453          { "internalType": "address", "name": "eth", "type": "address" },454          { "internalType": "uint256", "name": "sub", "type": "uint256" }455        ],456        "internalType": "struct CrossAccount",457        "name": "admin",458        "type": "tuple"459      }460    ],461    "name": "removeCollectionAdminCross",462    "outputs": [],463    "stateMutability": "nonpayable",464    "type": "function"465  },466  {467    "inputs": [],468    "name": "removeCollectionSponsor",469    "outputs": [],470    "stateMutability": "nonpayable",471    "type": "function"472  },473  {474    "inputs": [475      {476        "components": [477          { "internalType": "address", "name": "eth", "type": "address" },478          { "internalType": "uint256", "name": "sub", "type": "uint256" }479        ],480        "internalType": "struct CrossAccount",481        "name": "user",482        "type": "tuple"483      }484    ],485    "name": "removeFromCollectionAllowListCross",486    "outputs": [],487    "stateMutability": "nonpayable",488    "type": "function"489  },490  {491    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],492    "name": "setCollectionAccess",493    "outputs": [],494    "stateMutability": "nonpayable",495    "type": "function"496  },497  {498    "inputs": [499      {500        "components": [501          {502            "internalType": "enum CollectionLimitField",503            "name": "field",504            "type": "uint8"505          },506          {507            "components": [508              { "internalType": "bool", "name": "status", "type": "bool" },509              { "internalType": "uint256", "name": "value", "type": "uint256" }510            ],511            "internalType": "struct OptionUint",512            "name": "value",513            "type": "tuple"514          }515        ],516        "internalType": "struct CollectionLimit",517        "name": "limit",518        "type": "tuple"519      }520    ],521    "name": "setCollectionLimit",522    "outputs": [],523    "stateMutability": "nonpayable",524    "type": "function"525  },526  {527    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],528    "name": "setCollectionMintMode",529    "outputs": [],530    "stateMutability": "nonpayable",531    "type": "function"532  },533  {534    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],535    "name": "setCollectionNesting",536    "outputs": [],537    "stateMutability": "nonpayable",538    "type": "function"539  },540  {541    "inputs": [542      { "internalType": "bool", "name": "enable", "type": "bool" },543      {544        "internalType": "address[]",545        "name": "collections",546        "type": "address[]"547      }548    ],549    "name": "setCollectionNesting",550    "outputs": [],551    "stateMutability": "nonpayable",552    "type": "function"553  },554  {555    "inputs": [556      {557        "components": [558          { "internalType": "string", "name": "key", "type": "string" },559          { "internalType": "bytes", "name": "value", "type": "bytes" }560        ],561        "internalType": "struct Property[]",562        "name": "properties",563        "type": "tuple[]"564      }565    ],566    "name": "setCollectionProperties",567    "outputs": [],568    "stateMutability": "nonpayable",569    "type": "function"570  },571  {572    "inputs": [573      {574        "components": [575          { "internalType": "address", "name": "eth", "type": "address" },576          { "internalType": "uint256", "name": "sub", "type": "uint256" }577        ],578        "internalType": "struct CrossAccount",579        "name": "sponsor",580        "type": "tuple"581      }582    ],583    "name": "setCollectionSponsorCross",584    "outputs": [],585    "stateMutability": "nonpayable",586    "type": "function"587  },588  {589    "inputs": [590      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }591    ],592    "name": "supportsInterface",593    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],594    "stateMutability": "view",595    "type": "function"596  },597  {598    "inputs": [],599    "name": "symbol",600    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],601    "stateMutability": "view",602    "type": "function"603  },604  {605    "inputs": [],606    "name": "totalSupply",607    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],608    "stateMutability": "view",609    "type": "function"610  },611  {612    "inputs": [613      { "internalType": "address", "name": "to", "type": "address" },614      { "internalType": "uint256", "name": "amount", "type": "uint256" }615    ],616    "name": "transfer",617    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],618    "stateMutability": "nonpayable",619    "type": "function"620  },621  {622    "inputs": [623      {624        "components": [625          { "internalType": "address", "name": "eth", "type": "address" },626          { "internalType": "uint256", "name": "sub", "type": "uint256" }627        ],628        "internalType": "struct CrossAccount",629        "name": "to",630        "type": "tuple"631      },632      { "internalType": "uint256", "name": "amount", "type": "uint256" }633    ],634    "name": "transferCross",635    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],636    "stateMutability": "nonpayable",637    "type": "function"638  },639  {640    "inputs": [641      { "internalType": "address", "name": "from", "type": "address" },642      { "internalType": "address", "name": "to", "type": "address" },643      { "internalType": "uint256", "name": "amount", "type": "uint256" }644    ],645    "name": "transferFrom",646    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],647    "stateMutability": "nonpayable",648    "type": "function"649  },650  {651    "inputs": [652      {653        "components": [654          { "internalType": "address", "name": "eth", "type": "address" },655          { "internalType": "uint256", "name": "sub", "type": "uint256" }656        ],657        "internalType": "struct CrossAccount",658        "name": "from",659        "type": "tuple"660      },661      {662        "components": [663          { "internalType": "address", "name": "eth", "type": "address" },664          { "internalType": "uint256", "name": "sub", "type": "uint256" }665        ],666        "internalType": "struct CrossAccount",667        "name": "to",668        "type": "tuple"669      },670      { "internalType": "uint256", "name": "amount", "type": "uint256" }671    ],672    "name": "transferFromCross",673    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],674    "stateMutability": "nonpayable",675    "type": "function"676  },677  {678    "inputs": [],679    "name": "uniqueCollectionType",680    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],681    "stateMutability": "view",682    "type": "function"683  }684]
modifiedtests/src/eth/abi/nonFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -272,13 +272,13 @@
       {
         "components": [
           {
-            "internalType": "enum CollectionPermissions",
-            "name": "field_0",
+            "internalType": "enum CollectionPermissionField",
+            "name": "field",
             "type": "uint8"
           },
-          { "internalType": "bool", "name": "field_1", "type": "bool" }
+          { "internalType": "bool", "name": "value", "type": "bool" }
         ],
-        "internalType": "struct Tuple48[]",
+        "internalType": "struct CollectionNestingPermission[]",
         "name": "",
         "type": "tuple[]"
       }
@@ -292,14 +292,10 @@
     "outputs": [
       {
         "components": [
-          { "internalType": "bool", "name": "field_0", "type": "bool" },
-          {
-            "internalType": "uint256[]",
-            "name": "field_1",
-            "type": "uint256[]"
-          }
+          { "internalType": "bool", "name": "token_owner", "type": "bool" },
+          { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }
         ],
-        "internalType": "struct Tuple45",
+        "internalType": "struct CollectionNesting",
         "name": "",
         "type": "tuple"
       }
modifiedtests/src/eth/abi/reFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -254,13 +254,13 @@
       {
         "components": [
           {
-            "internalType": "enum CollectionPermissions",
-            "name": "field_0",
+            "internalType": "enum CollectionPermissionField",
+            "name": "field",
             "type": "uint8"
           },
-          { "internalType": "bool", "name": "field_1", "type": "bool" }
+          { "internalType": "bool", "name": "value", "type": "bool" }
         ],
-        "internalType": "struct Tuple47[]",
+        "internalType": "struct CollectionNestingPermission[]",
         "name": "",
         "type": "tuple[]"
       }
@@ -274,14 +274,10 @@
     "outputs": [
       {
         "components": [
-          { "internalType": "bool", "name": "field_0", "type": "bool" },
-          {
-            "internalType": "uint256[]",
-            "name": "field_1",
-            "type": "uint256[]"
-          }
+          { "internalType": "bool", "name": "token_owner", "type": "bool" },
+          { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }
         ],
-        "internalType": "struct Tuple44",
+        "internalType": "struct CollectionNesting",
         "name": "",
         "type": "tuple"
       }
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -166,12 +166,12 @@
 	/// Returns nesting for a collection
 	/// @dev EVM selector for this function is: 0x22d25bfe,
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
-	function collectionNestingRestrictedCollectionIds() external view returns (Tuple28 memory);
+	function collectionNestingRestrictedCollectionIds() external view returns (CollectionNesting memory);
 
 	/// Returns permissions for a collection
 	/// @dev EVM selector for this function is: 0x5b2eaf4b,
 	///  or in textual repr: collectionNestingPermissions()
-	function collectionNestingPermissions() external view returns (Tuple31[] memory);
+	function collectionNestingPermissions() external view returns (CollectionNestingPermission[] memory);
 
 	/// Set the collection access method.
 	/// @param mode Access mode
@@ -285,24 +285,24 @@
 	uint256 sub;
 }
 
-/// @dev anonymous struct
-struct Tuple31 {
-	CollectionPermissions field_0;
-	bool field_1;
+/// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+struct CollectionNestingPermission {
+	CollectionPermissionField field;
+	bool value;
 }
 
 /// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
-enum CollectionPermissions {
+enum CollectionPermissionField {
 	/// @dev Owner of token can nest tokens under it.
 	TokenOwner,
 	/// @dev Admin of token collection can nest tokens under token.
 	CollectionAdmin
 }
 
-/// @dev anonymous struct
-struct Tuple28 {
-	bool field_0;
-	uint256[] field_1;
+/// @dev Nested collections.
+struct CollectionNesting {
+	bool token_owner;
+	uint256[] ids;
 }
 
 /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.
@@ -311,6 +311,7 @@
 	OptionUint value;
 }
 
+/// @dev Ethereum representation of Optional value with uint256.
 struct OptionUint {
 	bool status;
 	uint256 value;
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -268,12 +268,12 @@
 	/// Returns nesting for a collection
 	/// @dev EVM selector for this function is: 0x22d25bfe,
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
-	function collectionNestingRestrictedCollectionIds() external view returns (Tuple38 memory);
+	function collectionNestingRestrictedCollectionIds() external view returns (CollectionNesting memory);
 
 	/// Returns permissions for a collection
 	/// @dev EVM selector for this function is: 0x5b2eaf4b,
 	///  or in textual repr: collectionNestingPermissions()
-	function collectionNestingPermissions() external view returns (Tuple41[] memory);
+	function collectionNestingPermissions() external view returns (CollectionNestingPermission[] memory);
 
 	/// Set the collection access method.
 	/// @param mode Access mode
@@ -387,24 +387,24 @@
 	uint256 sub;
 }
 
-/// @dev anonymous struct
-struct Tuple41 {
-	CollectionPermissions field_0;
-	bool field_1;
+/// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+struct CollectionNestingPermission {
+	CollectionPermissionField field;
+	bool value;
 }
 
 /// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
-enum CollectionPermissions {
+enum CollectionPermissionField {
 	/// @dev Owner of token can nest tokens under it.
 	TokenOwner,
 	/// @dev Admin of token collection can nest tokens under token.
 	CollectionAdmin
 }
 
-/// @dev anonymous struct
-struct Tuple38 {
-	bool field_0;
-	uint256[] field_1;
+/// @dev Nested collections.
+struct CollectionNesting {
+	bool token_owner;
+	uint256[] ids;
 }
 
 /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.
@@ -413,6 +413,7 @@
 	OptionUint value;
 }
 
+/// @dev Ethereum representation of Optional value with uint256.
 struct OptionUint {
 	bool status;
 	uint256 value;
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -268,12 +268,12 @@
 	/// Returns nesting for a collection
 	/// @dev EVM selector for this function is: 0x22d25bfe,
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
-	function collectionNestingRestrictedCollectionIds() external view returns (Tuple37 memory);
+	function collectionNestingRestrictedCollectionIds() external view returns (CollectionNesting memory);
 
 	/// Returns permissions for a collection
 	/// @dev EVM selector for this function is: 0x5b2eaf4b,
 	///  or in textual repr: collectionNestingPermissions()
-	function collectionNestingPermissions() external view returns (Tuple40[] memory);
+	function collectionNestingPermissions() external view returns (CollectionNestingPermission[] memory);
 
 	/// Set the collection access method.
 	/// @param mode Access mode
@@ -387,24 +387,24 @@
 	uint256 sub;
 }
 
-/// @dev anonymous struct
-struct Tuple40 {
-	CollectionPermissions field_0;
-	bool field_1;
+/// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) field.
+struct CollectionNestingPermission {
+	CollectionPermissionField field;
+	bool value;
 }
 
 /// @dev Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration.
-enum CollectionPermissions {
+enum CollectionPermissionField {
 	/// @dev Owner of token can nest tokens under it.
 	TokenOwner,
 	/// @dev Admin of token collection can nest tokens under token.
 	CollectionAdmin
 }
 
-/// @dev anonymous struct
-struct Tuple37 {
-	bool field_0;
-	uint256[] field_1;
+/// @dev Nested collections.
+struct CollectionNesting {
+	bool token_owner;
+	uint256[] ids;
 }
 
 /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM.
@@ -413,6 +413,7 @@
 	OptionUint value;
 }
 
+/// @dev Ethereum representation of Optional value with uint256.
 struct OptionUint {
 	bool status;
 	uint256 value;