difftreelog
Merge branch 'develop' into rapid-parallel-start-v2
in: master
15 files changed
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -668,7 +668,7 @@
/// should be obtained with `nextTokenId` method
/// @param to The new owner
/// @param tokenIds IDs of the minted NFTs
- // #[solidity(hide)]
+ #[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> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -705,7 +705,7 @@
/// numbers and first number should be obtained with `nextTokenId` method
/// @param to The new owner
/// @param tokens array of pairs of token ID and token URI for minted tokens
- #[solidity(/*hide,*/ rename_selector = "mintBulkWithTokenURI")]
+ #[solidity(hide, rename_selector = "mintBulkWithTokenURI")]
#[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]
fn mint_bulk_with_token_uri(
&mut self,
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
@@ -585,36 +585,36 @@
dummy;
return 0;
}
+ // /// @notice Function to mint multiple tokens.
+ // /// @dev `tokenIds` should be an array of consecutive numbers and first number
+ // /// should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokenIds IDs of the minted NFTs
+ // /// @dev EVM selector for this function is: 0x44a9945e,
+ // /// or in textual repr: mintBulk(address,uint256[])
+ // function mintBulk(address to, uint256[] memory tokenIds) public returns (bool) {
+ // require(false, stub_error);
+ // to;
+ // tokenIds;
+ // dummy = 0;
+ // return false;
+ // }
- /// @notice Function to mint multiple tokens.
- /// @dev `tokenIds` should be an array of consecutive numbers and first number
- /// should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokenIds IDs of the minted NFTs
- /// @dev EVM selector for this function is: 0x44a9945e,
- /// or in textual repr: mintBulk(address,uint256[])
- function mintBulk(address to, uint256[] memory tokenIds) public returns (bool) {
- require(false, stub_error);
- to;
- tokenIds;
- dummy = 0;
- return false;
- }
+ // /// @notice Function to mint multiple tokens with the given tokenUris.
+ // /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ // /// numbers and first number should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokens array of pairs of token ID and token URI for minted tokens
+ // /// @dev EVM selector for this function is: 0x36543006,
+ // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
+ // function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) public returns (bool) {
+ // require(false, stub_error);
+ // to;
+ // tokens;
+ // dummy = 0;
+ // return false;
+ // }
- /// @notice Function to mint multiple tokens with the given tokenUris.
- /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
- /// numbers and first number should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokens array of pairs of token ID and token URI for minted tokens
- /// @dev EVM selector for this function is: 0x36543006,
- /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
- function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) public returns (bool) {
- require(false, stub_error);
- to;
- tokens;
- dummy = 0;
- return false;
- }
}
/// @dev anonymous struct
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -705,7 +705,7 @@
/// should be obtained with `nextTokenId` method
/// @param to The new owner
/// @param tokenIds IDs of the minted RFTs
- // #[solidity(hide)]
+ #[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> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -748,7 +748,7 @@
/// numbers and first number should be obtained with `nextTokenId` method
/// @param to The new owner
/// @param tokens array of pairs of token ID and token URI for minted tokens
- #[solidity(/*hide,*/ rename_selector = "mintBulkWithTokenURI")]
+ #[solidity(hide, rename_selector = "mintBulkWithTokenURI")]
#[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]
fn mint_bulk_with_token_uri(
&mut self,
pallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -586,35 +586,35 @@
return 0;
}
- /// @notice Function to mint multiple tokens.
- /// @dev `tokenIds` should be an array of consecutive numbers and first number
- /// should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokenIds IDs of the minted RFTs
- /// @dev EVM selector for this function is: 0x44a9945e,
- /// or in textual repr: mintBulk(address,uint256[])
- function mintBulk(address to, uint256[] memory tokenIds) public returns (bool) {
- require(false, stub_error);
- to;
- tokenIds;
- dummy = 0;
- return false;
- }
+ // /// @notice Function to mint multiple tokens.
+ // /// @dev `tokenIds` should be an array of consecutive numbers and first number
+ // /// should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokenIds IDs of the minted RFTs
+ // /// @dev EVM selector for this function is: 0x44a9945e,
+ // /// or in textual repr: mintBulk(address,uint256[])
+ // function mintBulk(address to, uint256[] memory tokenIds) public returns (bool) {
+ // require(false, stub_error);
+ // to;
+ // tokenIds;
+ // dummy = 0;
+ // return false;
+ // }
- /// @notice Function to mint multiple tokens with the given tokenUris.
- /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
- /// numbers and first number should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokens array of pairs of token ID and token URI for minted tokens
- /// @dev EVM selector for this function is: 0x36543006,
- /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
- function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) public returns (bool) {
- require(false, stub_error);
- to;
- tokens;
- dummy = 0;
- return false;
- }
+ // /// @notice Function to mint multiple tokens with the given tokenUris.
+ // /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ // /// numbers and first number should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokens array of pairs of token ID and token URI for minted tokens
+ // /// @dev EVM selector for this function is: 0x36543006,
+ // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
+ // function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) public returns (bool) {
+ // require(false, stub_error);
+ // to;
+ // tokens;
+ // dummy = 0;
+ // return false;
+ // }
/// Returns EVM address for refungible token
///
pallets/refungible/src/stubs/UniqueRefungibleToken.rawdiffbeforeafterbothbinary blob — no preview
runtime/opal/src/lib.rsdiffbeforeafterboth--- a/runtime/opal/src/lib.rs
+++ b/runtime/opal/src/lib.rs
@@ -50,7 +50,7 @@
spec_name: create_runtime_str!(RUNTIME_NAME),
impl_name: create_runtime_str!(RUNTIME_NAME),
authoring_version: 1,
- spec_version: 929030,
+ spec_version: 929031,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 2,
runtime/quartz/src/lib.rsdiffbeforeafterboth--- a/runtime/quartz/src/lib.rs
+++ b/runtime/quartz/src/lib.rs
@@ -50,7 +50,7 @@
spec_name: create_runtime_str!(RUNTIME_NAME),
impl_name: create_runtime_str!(RUNTIME_NAME),
authoring_version: 1,
- spec_version: 929030,
+ spec_version: 929031,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 2,
runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -50,7 +50,7 @@
spec_name: create_runtime_str!(RUNTIME_NAME),
impl_name: create_runtime_str!(RUNTIME_NAME),
authoring_version: 1,
- spec_version: 929030,
+ spec_version: 929031,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 2,
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -384,24 +384,24 @@
/// @dev EVM selector for this function is: 0x75794a3c,
/// or in textual repr: nextTokenId()
function nextTokenId() external view returns (uint256);
+ // /// @notice Function to mint multiple tokens.
+ // /// @dev `tokenIds` should be an array of consecutive numbers and first number
+ // /// should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokenIds IDs of the minted NFTs
+ // /// @dev EVM selector for this function is: 0x44a9945e,
+ // /// or in textual repr: mintBulk(address,uint256[])
+ // function mintBulk(address to, uint256[] memory tokenIds) external returns (bool);
- /// @notice Function to mint multiple tokens.
- /// @dev `tokenIds` should be an array of consecutive numbers and first number
- /// should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokenIds IDs of the minted NFTs
- /// @dev EVM selector for this function is: 0x44a9945e,
- /// or in textual repr: mintBulk(address,uint256[])
- function mintBulk(address to, uint256[] memory tokenIds) external returns (bool);
+ // /// @notice Function to mint multiple tokens with the given tokenUris.
+ // /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ // /// numbers and first number should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokens array of pairs of token ID and token URI for minted tokens
+ // /// @dev EVM selector for this function is: 0x36543006,
+ // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
+ // function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) external returns (bool);
- /// @notice Function to mint multiple tokens with the given tokenUris.
- /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
- /// numbers and first number should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokens array of pairs of token ID and token URI for minted tokens
- /// @dev EVM selector for this function is: 0x36543006,
- /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
- function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) external returns (bool);
}
/// @dev anonymous struct
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -385,23 +385,23 @@
/// or in textual repr: nextTokenId()
function nextTokenId() external view returns (uint256);
- /// @notice Function to mint multiple tokens.
- /// @dev `tokenIds` should be an array of consecutive numbers and first number
- /// should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokenIds IDs of the minted RFTs
- /// @dev EVM selector for this function is: 0x44a9945e,
- /// or in textual repr: mintBulk(address,uint256[])
- function mintBulk(address to, uint256[] memory tokenIds) external returns (bool);
+ // /// @notice Function to mint multiple tokens.
+ // /// @dev `tokenIds` should be an array of consecutive numbers and first number
+ // /// should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokenIds IDs of the minted RFTs
+ // /// @dev EVM selector for this function is: 0x44a9945e,
+ // /// or in textual repr: mintBulk(address,uint256[])
+ // function mintBulk(address to, uint256[] memory tokenIds) external returns (bool);
- /// @notice Function to mint multiple tokens with the given tokenUris.
- /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
- /// numbers and first number should be obtained with `nextTokenId` method
- /// @param to The new owner
- /// @param tokens array of pairs of token ID and token URI for minted tokens
- /// @dev EVM selector for this function is: 0x36543006,
- /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
- function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) external returns (bool);
+ // /// @notice Function to mint multiple tokens with the given tokenUris.
+ // /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ // /// numbers and first number should be obtained with `nextTokenId` method
+ // /// @param to The new owner
+ // /// @param tokens array of pairs of token ID and token URI for minted tokens
+ // /// @dev EVM selector for this function is: 0x36543006,
+ // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
+ // function mintBulkWithTokenURI(address to, Tuple6[] memory tokens) external returns (bool);
/// Returns EVM address for refungible token
///
tests/src/eth/nonFungibleAbi.jsondiffbeforeafterboth--- a/tests/src/eth/nonFungibleAbi.json
+++ b/tests/src/eth/nonFungibleAbi.json
@@ -278,34 +278,6 @@
{
"inputs": [
{ "internalType": "address", "name": "to", "type": "address" },
- { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }
- ],
- "name": "mintBulk",
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- { "internalType": "address", "name": "to", "type": "address" },
- {
- "components": [
- { "internalType": "uint256", "name": "field_0", "type": "uint256" },
- { "internalType": "string", "name": "field_1", "type": "string" }
- ],
- "internalType": "struct Tuple6[]",
- "name": "tokens",
- "type": "tuple[]"
- }
- ],
- "name": "mintBulkWithTokenURI",
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- { "internalType": "address", "name": "to", "type": "address" },
{ "internalType": "string", "name": "tokenUri", "type": "string" }
],
"name": "mintWithTokenURI",
tests/src/eth/reFungible.test.tsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {Pallets, requirePalletsOrSkip} from '../util';18import {expect, itEth, usingEthPlaygrounds} from './util';19import {IKeyringPair} from '@polkadot/types/types';2021describe('Refungible: Information getting', () => {22 let donor: IKeyringPair;2324 before(async function() {25 await usingEthPlaygrounds(async (helper, privateKey) => {26 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);2728 donor = await privateKey({filename: __filename});29 });30 });3132 itEth('totalSupply', async ({helper}) => {33 const caller = await helper.eth.createAccountWithBalance(donor);34 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'TotalSupply', '6', '6');35 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);3637 await contract.methods.mint(caller).send();3839 const totalSupply = await contract.methods.totalSupply().call();40 expect(totalSupply).to.equal('1');41 });4243 itEth('balanceOf', async ({helper}) => {44 const caller = await helper.eth.createAccountWithBalance(donor);45 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'BalanceOf', '6', '6');46 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);4748 await contract.methods.mint(caller).send();49 await contract.methods.mint(caller).send();50 await contract.methods.mint(caller).send();5152 const balance = await contract.methods.balanceOf(caller).call();53 expect(balance).to.equal('3');54 });5556 itEth('ownerOf', async ({helper}) => {57 const caller = await helper.eth.createAccountWithBalance(donor);58 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'OwnerOf', '6', '6');59 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);6061 const result = await contract.methods.mint(caller).send();62 const tokenId = result.events.Transfer.returnValues.tokenId;6364 const owner = await contract.methods.ownerOf(tokenId).call();65 expect(owner).to.equal(caller);66 });6768 itEth('ownerOf after burn', async ({helper}) => {69 const caller = await helper.eth.createAccountWithBalance(donor);70 const receiver = helper.eth.createAccount();71 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'OwnerOf-AfterBurn', '6', '6');72 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);7374 const result = await contract.methods.mint(caller).send();75 const tokenId = result.events.Transfer.returnValues.tokenId;76 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);7778 await tokenContract.methods.repartition(2).send();79 await tokenContract.methods.transfer(receiver, 1).send();8081 await tokenContract.methods.burnFrom(caller, 1).send();8283 const owner = await contract.methods.ownerOf(tokenId).call();84 expect(owner).to.equal(receiver);85 });8687 itEth('ownerOf for partial ownership', async ({helper}) => {88 const caller = await helper.eth.createAccountWithBalance(donor);89 const receiver = helper.eth.createAccount();90 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Partial-OwnerOf', '6', '6');91 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);9293 const result = await contract.methods.mint(caller).send();94 const tokenId = result.events.Transfer.returnValues.tokenId;95 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);9697 await tokenContract.methods.repartition(2).send();98 await tokenContract.methods.transfer(receiver, 1).send();99100 const owner = await contract.methods.ownerOf(tokenId).call();101 expect(owner).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');102 });103});104105describe('Refungible: Plain calls', () => {106 let donor: IKeyringPair;107108 before(async function() {109 await usingEthPlaygrounds(async (helper, privateKey) => {110 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);111112 donor = await privateKey({filename: __filename});113 });114 });115116 itEth('Can perform mint()', async ({helper}) => {117 const owner = await helper.eth.createAccountWithBalance(donor);118 const receiver = helper.eth.createAccount();119 const {collectionAddress} = await helper.eth.createERC721MetadataCompatibleRFTCollection(owner, 'Minty', '6', '6', '');120 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);121122 const result = await contract.methods.mintWithTokenURI(receiver, 'Test URI').send();123124 const event = result.events.Transfer;125 expect(event.address).to.equal(collectionAddress);126 expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');127 expect(event.returnValues.to).to.equal(receiver);128 const tokenId = event.returnValues.tokenId;129 expect(tokenId).to.be.equal('1');130131 expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');132 });133134 itEth('Can perform mintBulk()', async ({helper}) => {135 const owner = await helper.eth.createAccountWithBalance(donor);136 const receiver = helper.eth.createAccount();137 const {collectionAddress} = await helper.eth.createERC721MetadataCompatibleRFTCollection(owner, 'MintBulky', '6', '6', '');138 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);139140 {141 const nextTokenId = await contract.methods.nextTokenId().call();142 expect(nextTokenId).to.be.equal('1');143 const result = await contract.methods.mintBulkWithTokenURI(144 receiver,145 [146 [nextTokenId, 'Test URI 0'],147 [+nextTokenId + 1, 'Test URI 1'],148 [+nextTokenId + 2, 'Test URI 2'],149 ],150 ).send();151152 const events = result.events.Transfer;153 for (let i = 0; i < 2; i++) {154 const event = events[i];155 expect(event.address).to.equal(collectionAddress);156 expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');157 expect(event.returnValues.to).to.equal(receiver);158 expect(event.returnValues.tokenId).to.equal(String(+nextTokenId + i));159 }160161 expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI 0');162 expect(await contract.methods.tokenURI(+nextTokenId + 1).call()).to.be.equal('Test URI 1');163 expect(await contract.methods.tokenURI(+nextTokenId + 2).call()).to.be.equal('Test URI 2');164 }165 });166167 itEth('Can perform burn()', async ({helper}) => {168 const caller = await helper.eth.createAccountWithBalance(donor);169 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Burny', '6', '6');170 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);171172 const result = await contract.methods.mint(caller).send();173 const tokenId = result.events.Transfer.returnValues.tokenId;174 {175 const result = await contract.methods.burn(tokenId).send();176 const event = result.events.Transfer;177 expect(event.address).to.equal(collectionAddress);178 expect(event.returnValues.from).to.equal(caller);179 expect(event.returnValues.to).to.equal('0x0000000000000000000000000000000000000000');180 expect(event.returnValues.tokenId).to.equal(tokenId.toString());181 }182 });183184 itEth('Can perform transferFrom()', async ({helper}) => {185 const caller = await helper.eth.createAccountWithBalance(donor);186 const receiver = helper.eth.createAccount();187 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'TransferFromy', '6', '6');188 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);189190 const result = await contract.methods.mint(caller).send();191 const tokenId = result.events.Transfer.returnValues.tokenId;192193 const tokenAddress = helper.ethAddress.fromTokenId(collectionId, tokenId);194195 const tokenContract = helper.ethNativeContract.rftToken(tokenAddress, caller);196 await tokenContract.methods.repartition(15).send();197198 {199 const tokenEvents: any = [];200 tokenContract.events.allEvents((_: any, event: any) => {201 tokenEvents.push(event);202 });203 const result = await contract.methods.transferFrom(caller, receiver, tokenId).send();204205 let event = result.events.Transfer;206 expect(event.address).to.equal(collectionAddress);207 expect(event.returnValues.from).to.equal(caller);208 expect(event.returnValues.to).to.equal(receiver);209 expect(event.returnValues.tokenId).to.equal(tokenId.toString());210211 event = tokenEvents[0];212 expect(event.address).to.equal(tokenAddress);213 expect(event.returnValues.from).to.equal(caller);214 expect(event.returnValues.to).to.equal(receiver);215 expect(event.returnValues.value).to.equal('15');216 }217218 {219 const balance = await contract.methods.balanceOf(receiver).call();220 expect(+balance).to.equal(1);221 }222223 {224 const balance = await contract.methods.balanceOf(caller).call();225 expect(+balance).to.equal(0);226 }227 });228229 itEth('Can perform transfer()', async ({helper}) => {230 const caller = await helper.eth.createAccountWithBalance(donor);231 const receiver = helper.eth.createAccount();232 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry', '6', '6');233 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);234235 const result = await contract.methods.mint(caller).send();236 const tokenId = result.events.Transfer.returnValues.tokenId;237238 {239 const result = await contract.methods.transfer(receiver, tokenId).send();240241 const event = result.events.Transfer;242 expect(event.address).to.equal(collectionAddress);243 expect(event.returnValues.from).to.equal(caller);244 expect(event.returnValues.to).to.equal(receiver);245 expect(event.returnValues.tokenId).to.equal(tokenId.toString());246 }247248 {249 const balance = await contract.methods.balanceOf(caller).call();250 expect(+balance).to.equal(0);251 }252253 {254 const balance = await contract.methods.balanceOf(receiver).call();255 expect(+balance).to.equal(1);256 }257 });258259 itEth('transfer event on transfer from partial ownership to full ownership', async ({helper}) => {260 const caller = await helper.eth.createAccountWithBalance(donor);261 const receiver = helper.eth.createAccount();262 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry-Partial-to-Full', '6', '6');263 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);264265 const result = await contract.methods.mint(caller).send();266 const tokenId = result.events.Transfer.returnValues.tokenId;267268 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);269270 await tokenContract.methods.repartition(2).send();271 await tokenContract.methods.transfer(receiver, 1).send();272273 const events: any = [];274 contract.events.allEvents((_: any, event: any) => {275 events.push(event);276 });277278 await tokenContract.methods.transfer(receiver, 1).send();279 if (events.length == 0) await helper.wait.newBlocks(1);280 const event = events[0];281282 expect(event.address).to.equal(collectionAddress);283 expect(event.returnValues.from).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');284 expect(event.returnValues.to).to.equal(receiver);285 expect(event.returnValues.tokenId).to.equal(tokenId.toString());286 });287288 itEth('transfer event on transfer from full ownership to partial ownership', async ({helper}) => {289 const caller = await helper.eth.createAccountWithBalance(donor);290 const receiver = helper.eth.createAccount();291 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry-Full-to-Partial', '6', '6');292 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);293294 const result = await contract.methods.mint(caller).send();295 const tokenId = result.events.Transfer.returnValues.tokenId;296297 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);298299 await tokenContract.methods.repartition(2).send();300301 const events: any = [];302 contract.events.allEvents((_: any, event: any) => {303 events.push(event);304 });305306 await tokenContract.methods.transfer(receiver, 1).send();307 if (events.length == 0) await helper.wait.newBlocks(1);308 const event = events[0];309310 expect(event.address).to.equal(collectionAddress);311 expect(event.returnValues.from).to.equal(caller);312 expect(event.returnValues.to).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');313 expect(event.returnValues.tokenId).to.equal(tokenId.toString());314 });315});316317describe('RFT: Fees', () => {318 let donor: IKeyringPair;319320 before(async function() {321 await usingEthPlaygrounds(async (helper, privateKey) => {322 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);323324 donor = await privateKey({filename: __filename});325 });326 });327328 itEth('transferFrom() call fee is less than 0.2UNQ', async ({helper}) => {329 const caller = await helper.eth.createAccountWithBalance(donor);330 const receiver = helper.eth.createAccount();331 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Feeful-Transfer-From', '6', '6');332 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);333334 const result = await contract.methods.mint(caller).send();335 const tokenId = result.events.Transfer.returnValues.tokenId;336337 const cost = await helper.eth.recordCallFee(caller, () => contract.methods.transferFrom(caller, receiver, tokenId).send());338 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));339 expect(cost > 0n);340 });341342 itEth('transfer() call fee is less than 0.2UNQ', async ({helper}) => {343 const caller = await helper.eth.createAccountWithBalance(donor);344 const receiver = helper.eth.createAccount();345 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Feeful-Transfer', '6', '6');346 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);347348 const result = await contract.methods.mint(caller).send();349 const tokenId = result.events.Transfer.returnValues.tokenId;350351 const cost = await helper.eth.recordCallFee(caller, () => contract.methods.transfer(receiver, tokenId).send());352 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));353 expect(cost > 0n);354 });355});356357describe('Common metadata', () => {358 let donor: IKeyringPair;359 let alice: IKeyringPair;360361 before(async function() {362 await usingEthPlaygrounds(async (helper, privateKey) => {363 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);364365 donor = await privateKey({filename: __filename});366 [alice] = await helper.arrange.createAccounts([20n], donor);367 });368 });369370 itEth('Returns collection name', async ({helper}) => {371 const caller = helper.eth.createAccount();372 const tokenPropertyPermissions = [{373 key: 'URI',374 permission: {375 mutable: true,376 collectionAdmin: true,377 tokenOwner: false,378 },379 }];380 const collection = await helper.rft.mintCollection(381 alice,382 {383 name: 'Leviathan',384 tokenPrefix: '11',385 properties: [{key: 'ERC721Metadata', value: '1'}],386 tokenPropertyPermissions,387 },388 );389390 const contract = helper.ethNativeContract.collectionById(collection.collectionId, 'rft', caller);391 const name = await contract.methods.name().call();392 expect(name).to.equal('Leviathan');393 });394395 itEth('Returns symbol name', async ({helper}) => {396 const caller = await helper.eth.createAccountWithBalance(donor);397 const tokenPropertyPermissions = [{398 key: 'URI',399 permission: {400 mutable: true,401 collectionAdmin: true,402 tokenOwner: false,403 },404 }];405 const {collectionId} = await helper.rft.mintCollection(406 alice,407 {408 name: 'Leviathan',409 tokenPrefix: '12',410 properties: [{key: 'ERC721Metadata', value: '1'}],411 tokenPropertyPermissions,412 },413 );414415 const contract = helper.ethNativeContract.collectionById(collectionId, 'rft', caller);416 const symbol = await contract.methods.symbol().call();417 expect(symbol).to.equal('12');418 });419});1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {Pallets, requirePalletsOrSkip} from '../util';18import {expect, itEth, usingEthPlaygrounds} from './util';19import {IKeyringPair} from '@polkadot/types/types';2021describe('Refungible: Information getting', () => {22 let donor: IKeyringPair;2324 before(async function() {25 await usingEthPlaygrounds(async (helper, privateKey) => {26 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);2728 donor = await privateKey({filename: __filename});29 });30 });3132 itEth('totalSupply', async ({helper}) => {33 const caller = await helper.eth.createAccountWithBalance(donor);34 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'TotalSupply', '6', '6');35 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);3637 await contract.methods.mint(caller).send();3839 const totalSupply = await contract.methods.totalSupply().call();40 expect(totalSupply).to.equal('1');41 });4243 itEth('balanceOf', async ({helper}) => {44 const caller = await helper.eth.createAccountWithBalance(donor);45 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'BalanceOf', '6', '6');46 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);4748 await contract.methods.mint(caller).send();49 await contract.methods.mint(caller).send();50 await contract.methods.mint(caller).send();5152 const balance = await contract.methods.balanceOf(caller).call();53 expect(balance).to.equal('3');54 });5556 itEth('ownerOf', async ({helper}) => {57 const caller = await helper.eth.createAccountWithBalance(donor);58 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'OwnerOf', '6', '6');59 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);6061 const result = await contract.methods.mint(caller).send();62 const tokenId = result.events.Transfer.returnValues.tokenId;6364 const owner = await contract.methods.ownerOf(tokenId).call();65 expect(owner).to.equal(caller);66 });6768 itEth('ownerOf after burn', async ({helper}) => {69 const caller = await helper.eth.createAccountWithBalance(donor);70 const receiver = helper.eth.createAccount();71 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'OwnerOf-AfterBurn', '6', '6');72 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);7374 const result = await contract.methods.mint(caller).send();75 const tokenId = result.events.Transfer.returnValues.tokenId;76 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);7778 await tokenContract.methods.repartition(2).send();79 await tokenContract.methods.transfer(receiver, 1).send();8081 await tokenContract.methods.burnFrom(caller, 1).send();8283 const owner = await contract.methods.ownerOf(tokenId).call();84 expect(owner).to.equal(receiver);85 });8687 itEth('ownerOf for partial ownership', async ({helper}) => {88 const caller = await helper.eth.createAccountWithBalance(donor);89 const receiver = helper.eth.createAccount();90 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Partial-OwnerOf', '6', '6');91 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);9293 const result = await contract.methods.mint(caller).send();94 const tokenId = result.events.Transfer.returnValues.tokenId;95 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);9697 await tokenContract.methods.repartition(2).send();98 await tokenContract.methods.transfer(receiver, 1).send();99100 const owner = await contract.methods.ownerOf(tokenId).call();101 expect(owner).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');102 });103});104105describe('Refungible: Plain calls', () => {106 let donor: IKeyringPair;107108 before(async function() {109 await usingEthPlaygrounds(async (helper, privateKey) => {110 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);111112 donor = await privateKey({filename: __filename});113 });114 });115116 itEth('Can perform mint()', async ({helper}) => {117 const owner = await helper.eth.createAccountWithBalance(donor);118 const receiver = helper.eth.createAccount();119 const {collectionAddress} = await helper.eth.createERC721MetadataCompatibleRFTCollection(owner, 'Minty', '6', '6', '');120 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);121122 const result = await contract.methods.mintWithTokenURI(receiver, 'Test URI').send();123124 const event = result.events.Transfer;125 expect(event.address).to.equal(collectionAddress);126 expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');127 expect(event.returnValues.to).to.equal(receiver);128 const tokenId = event.returnValues.tokenId;129 expect(tokenId).to.be.equal('1');130131 expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');132 });133134 itEth.skip('Can perform mintBulk()', async ({helper}) => {135 const owner = await helper.eth.createAccountWithBalance(donor);136 const receiver = helper.eth.createAccount();137 const {collectionAddress} = await helper.eth.createERC721MetadataCompatibleRFTCollection(owner, 'MintBulky', '6', '6', '');138 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);139140 {141 const nextTokenId = await contract.methods.nextTokenId().call();142 expect(nextTokenId).to.be.equal('1');143 const result = await contract.methods.mintBulkWithTokenURI(144 receiver,145 [146 [nextTokenId, 'Test URI 0'],147 [+nextTokenId + 1, 'Test URI 1'],148 [+nextTokenId + 2, 'Test URI 2'],149 ],150 ).send();151152 const events = result.events.Transfer;153 for (let i = 0; i < 2; i++) {154 const event = events[i];155 expect(event.address).to.equal(collectionAddress);156 expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');157 expect(event.returnValues.to).to.equal(receiver);158 expect(event.returnValues.tokenId).to.equal(String(+nextTokenId + i));159 }160161 expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI 0');162 expect(await contract.methods.tokenURI(+nextTokenId + 1).call()).to.be.equal('Test URI 1');163 expect(await contract.methods.tokenURI(+nextTokenId + 2).call()).to.be.equal('Test URI 2');164 }165 });166167 itEth('Can perform burn()', async ({helper}) => {168 const caller = await helper.eth.createAccountWithBalance(donor);169 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Burny', '6', '6');170 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);171172 const result = await contract.methods.mint(caller).send();173 const tokenId = result.events.Transfer.returnValues.tokenId;174 {175 const result = await contract.methods.burn(tokenId).send();176 const event = result.events.Transfer;177 expect(event.address).to.equal(collectionAddress);178 expect(event.returnValues.from).to.equal(caller);179 expect(event.returnValues.to).to.equal('0x0000000000000000000000000000000000000000');180 expect(event.returnValues.tokenId).to.equal(tokenId.toString());181 }182 });183184 itEth('Can perform transferFrom()', async ({helper}) => {185 const caller = await helper.eth.createAccountWithBalance(donor);186 const receiver = helper.eth.createAccount();187 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'TransferFromy', '6', '6');188 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);189190 const result = await contract.methods.mint(caller).send();191 const tokenId = result.events.Transfer.returnValues.tokenId;192193 const tokenAddress = helper.ethAddress.fromTokenId(collectionId, tokenId);194195 const tokenContract = helper.ethNativeContract.rftToken(tokenAddress, caller);196 await tokenContract.methods.repartition(15).send();197198 {199 const tokenEvents: any = [];200 tokenContract.events.allEvents((_: any, event: any) => {201 tokenEvents.push(event);202 });203 const result = await contract.methods.transferFrom(caller, receiver, tokenId).send();204205 let event = result.events.Transfer;206 expect(event.address).to.equal(collectionAddress);207 expect(event.returnValues.from).to.equal(caller);208 expect(event.returnValues.to).to.equal(receiver);209 expect(event.returnValues.tokenId).to.equal(tokenId.toString());210211 event = tokenEvents[0];212 expect(event.address).to.equal(tokenAddress);213 expect(event.returnValues.from).to.equal(caller);214 expect(event.returnValues.to).to.equal(receiver);215 expect(event.returnValues.value).to.equal('15');216 }217218 {219 const balance = await contract.methods.balanceOf(receiver).call();220 expect(+balance).to.equal(1);221 }222223 {224 const balance = await contract.methods.balanceOf(caller).call();225 expect(+balance).to.equal(0);226 }227 });228229 itEth('Can perform transfer()', async ({helper}) => {230 const caller = await helper.eth.createAccountWithBalance(donor);231 const receiver = helper.eth.createAccount();232 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry', '6', '6');233 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);234235 const result = await contract.methods.mint(caller).send();236 const tokenId = result.events.Transfer.returnValues.tokenId;237238 {239 const result = await contract.methods.transfer(receiver, tokenId).send();240241 const event = result.events.Transfer;242 expect(event.address).to.equal(collectionAddress);243 expect(event.returnValues.from).to.equal(caller);244 expect(event.returnValues.to).to.equal(receiver);245 expect(event.returnValues.tokenId).to.equal(tokenId.toString());246 }247248 {249 const balance = await contract.methods.balanceOf(caller).call();250 expect(+balance).to.equal(0);251 }252253 {254 const balance = await contract.methods.balanceOf(receiver).call();255 expect(+balance).to.equal(1);256 }257 });258259 itEth('transfer event on transfer from partial ownership to full ownership', async ({helper}) => {260 const caller = await helper.eth.createAccountWithBalance(donor);261 const receiver = helper.eth.createAccount();262 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry-Partial-to-Full', '6', '6');263 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);264265 const result = await contract.methods.mint(caller).send();266 const tokenId = result.events.Transfer.returnValues.tokenId;267268 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);269270 await tokenContract.methods.repartition(2).send();271 await tokenContract.methods.transfer(receiver, 1).send();272273 const events: any = [];274 contract.events.allEvents((_: any, event: any) => {275 events.push(event);276 });277278 await tokenContract.methods.transfer(receiver, 1).send();279 if (events.length == 0) await helper.wait.newBlocks(1);280 const event = events[0];281282 expect(event.address).to.equal(collectionAddress);283 expect(event.returnValues.from).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');284 expect(event.returnValues.to).to.equal(receiver);285 expect(event.returnValues.tokenId).to.equal(tokenId.toString());286 });287288 itEth('transfer event on transfer from full ownership to partial ownership', async ({helper}) => {289 const caller = await helper.eth.createAccountWithBalance(donor);290 const receiver = helper.eth.createAccount();291 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry-Full-to-Partial', '6', '6');292 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);293294 const result = await contract.methods.mint(caller).send();295 const tokenId = result.events.Transfer.returnValues.tokenId;296297 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);298299 await tokenContract.methods.repartition(2).send();300301 const events: any = [];302 contract.events.allEvents((_: any, event: any) => {303 events.push(event);304 });305306 await tokenContract.methods.transfer(receiver, 1).send();307 if (events.length == 0) await helper.wait.newBlocks(1);308 const event = events[0];309310 expect(event.address).to.equal(collectionAddress);311 expect(event.returnValues.from).to.equal(caller);312 expect(event.returnValues.to).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');313 expect(event.returnValues.tokenId).to.equal(tokenId.toString());314 });315});316317describe('RFT: Fees', () => {318 let donor: IKeyringPair;319320 before(async function() {321 await usingEthPlaygrounds(async (helper, privateKey) => {322 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);323324 donor = await privateKey({filename: __filename});325 });326 });327328 itEth('transferFrom() call fee is less than 0.2UNQ', async ({helper}) => {329 const caller = await helper.eth.createAccountWithBalance(donor);330 const receiver = helper.eth.createAccount();331 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Feeful-Transfer-From', '6', '6');332 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);333334 const result = await contract.methods.mint(caller).send();335 const tokenId = result.events.Transfer.returnValues.tokenId;336337 const cost = await helper.eth.recordCallFee(caller, () => contract.methods.transferFrom(caller, receiver, tokenId).send());338 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));339 expect(cost > 0n);340 });341342 itEth('transfer() call fee is less than 0.2UNQ', async ({helper}) => {343 const caller = await helper.eth.createAccountWithBalance(donor);344 const receiver = helper.eth.createAccount();345 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Feeful-Transfer', '6', '6');346 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);347348 const result = await contract.methods.mint(caller).send();349 const tokenId = result.events.Transfer.returnValues.tokenId;350351 const cost = await helper.eth.recordCallFee(caller, () => contract.methods.transfer(receiver, tokenId).send());352 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));353 expect(cost > 0n);354 });355});356357describe('Common metadata', () => {358 let donor: IKeyringPair;359 let alice: IKeyringPair;360361 before(async function() {362 await usingEthPlaygrounds(async (helper, privateKey) => {363 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);364365 donor = await privateKey({filename: __filename});366 [alice] = await helper.arrange.createAccounts([20n], donor);367 });368 });369370 itEth('Returns collection name', async ({helper}) => {371 const caller = helper.eth.createAccount();372 const tokenPropertyPermissions = [{373 key: 'URI',374 permission: {375 mutable: true,376 collectionAdmin: true,377 tokenOwner: false,378 },379 }];380 const collection = await helper.rft.mintCollection(381 alice,382 {383 name: 'Leviathan',384 tokenPrefix: '11',385 properties: [{key: 'ERC721Metadata', value: '1'}],386 tokenPropertyPermissions,387 },388 );389390 const contract = helper.ethNativeContract.collectionById(collection.collectionId, 'rft', caller);391 const name = await contract.methods.name().call();392 expect(name).to.equal('Leviathan');393 });394395 itEth('Returns symbol name', async ({helper}) => {396 const caller = await helper.eth.createAccountWithBalance(donor);397 const tokenPropertyPermissions = [{398 key: 'URI',399 permission: {400 mutable: true,401 collectionAdmin: true,402 tokenOwner: false,403 },404 }];405 const {collectionId} = await helper.rft.mintCollection(406 alice,407 {408 name: 'Leviathan',409 tokenPrefix: '12',410 properties: [{key: 'ERC721Metadata', value: '1'}],411 tokenPropertyPermissions,412 },413 );414415 const contract = helper.ethNativeContract.collectionById(collectionId, 'rft', caller);416 const symbol = await contract.methods.symbol().call();417 expect(symbol).to.equal('12');418 });419});tests/src/eth/reFungibleAbi.jsondiffbeforeafterboth--- a/tests/src/eth/reFungibleAbi.json
+++ b/tests/src/eth/reFungibleAbi.json
@@ -278,34 +278,6 @@
{
"inputs": [
{ "internalType": "address", "name": "to", "type": "address" },
- { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }
- ],
- "name": "mintBulk",
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- { "internalType": "address", "name": "to", "type": "address" },
- {
- "components": [
- { "internalType": "uint256", "name": "field_0", "type": "uint256" },
- { "internalType": "string", "name": "field_1", "type": "string" }
- ],
- "internalType": "struct Tuple6[]",
- "name": "tokens",
- "type": "tuple[]"
- }
- ],
- "name": "mintBulkWithTokenURI",
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- { "internalType": "address", "name": "to", "type": "address" },
{ "internalType": "string", "name": "tokenUri", "type": "string" }
],
"name": "mintWithTokenURI",