From 2e1cabd3ad66b20399792ccb2bcb1b3007f7acc3 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Fri, 05 Nov 2021 22:47:14 +0000 Subject: [PATCH] feat: configure min gas price --- --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -243,7 +243,8 @@ pub struct FixedFee; impl FeeCalculator for FixedFee { fn min_gas_price() -> U256 { - 1.into() + // Targeting 0.15 UNQ per transfer + (1 * MICROUNIQUE).into() } } --- a/tests/src/creditFeesToTreasury.test.ts +++ b/tests/src/creditFeesToTreasury.test.ts @@ -14,6 +14,7 @@ createItemExpectSuccess, getGenericResult, transferExpectSuccess, + UNIQUE, } from './util/helpers'; import {default as waitNewBlocks} from './substrate/wait-new-blocks'; @@ -169,12 +170,11 @@ const aliceBalanceBefore: bigint = (await api.query.system.account(alicesPublicKey)).data.free.toBigInt(); await transferExpectSuccess(collectionId, tokenId, alice, bob, 1, 'NFT'); const aliceBalanceAfter: bigint = (await api.query.system.account(alicesPublicKey)).data.free.toBigInt(); - const fee = aliceBalanceBefore - aliceBalanceAfter; + const fee = Number(aliceBalanceBefore - aliceBalanceAfter) / Number(UNIQUE); - // console.log(fee.toString()); const expectedTransferFee = 0.1; const tolerance = 0.001; - expect(Number(fee) / 1e15 - expectedTransferFee).to.be.lessThan(tolerance); + expect(Number(fee) / Number(UNIQUE) - expectedTransferFee).to.be.lessThan(tolerance); }); }); --- a/tests/src/eth/base.test.ts +++ b/tests/src/eth/base.test.ts @@ -1,7 +1,9 @@ -import {createEthAccount, createEthAccountWithBalance, deployFlipper, ethBalanceViaSub, GAS_ARGS, itWeb3, recordEthFee} from './util/helpers'; +import {collectionIdToAddress, createEthAccount, createEthAccountWithBalance, deployFlipper, ethBalanceViaSub, GAS_ARGS, itWeb3, recordEthFee} from './util/helpers'; import {expect} from 'chai'; -import {UNIQUE} from '../util/helpers'; +import {createCollectionExpectSuccess, createItemExpectSuccess, UNIQUE} from '../util/helpers'; +import nonFungibleAbi from './nonFungibleAbi.json'; +import privateKey from '../substrate/privateKey'; describe('Contract calls', () => { itWeb3('Call of simple contract fee is less than 0.2 UNQ', async ({web3, api}) => { @@ -19,4 +21,26 @@ const cost = await recordEthFee(api, userA, () => web3.eth.sendTransaction({from: userA, to: userB, value: '1000000', ...GAS_ARGS})); expect(cost - await ethBalanceViaSub(api, userB) < BigInt(0.2 * Number(UNIQUE))).to.be.true; }); + + itWeb3('NFT transfer is close to 0.15 UNQ', async ({web3, api}) => { + const caller = await createEthAccountWithBalance(api, web3); + const receiver = createEthAccount(web3); + + const alice = privateKey('//Alice'); + const collection = await createCollectionExpectSuccess({ + mode: {type: 'NFT'}, + }); + const itemId = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: caller}); + + const address = collectionIdToAddress(collection); + const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS}); + + const cost = await recordEthFee(api, caller, () => contract.methods.transfer(receiver, itemId).send(caller)); + + const fee = Number(cost) / Number(UNIQUE); + const expectedFee = 0.15; + const tolerance = 0.002; + + expect(Math.abs(fee - expectedFee) < tolerance).to.be.true; + }); }); --- a/tests/src/eth/fungible.test.ts +++ b/tests/src/eth/fungible.test.ts @@ -95,12 +95,12 @@ const alice = privateKey('//Alice'); const owner = createEthAccount(web3); - await transferBalanceToEth(api, alice, owner, 999999999999999); + await transferBalanceToEth(api, alice, owner); await createFungibleItemExpectSuccess(alice, collection, {Value: 200n}, {Ethereum: owner}); const spender = createEthAccount(web3); - await transferBalanceToEth(api, alice, spender, 999999999999999); + await transferBalanceToEth(api, alice, spender); const receiver = createEthAccount(web3); @@ -153,12 +153,12 @@ const alice = privateKey('//Alice'); const owner = createEthAccount(web3); - await transferBalanceToEth(api, alice, owner, 999999999999999); + await transferBalanceToEth(api, alice, owner); await createFungibleItemExpectSuccess(alice, collection, {Value: 200n}, {Ethereum: owner}); const receiver = createEthAccount(web3); - await transferBalanceToEth(api, alice, receiver, 999999999999999); + await transferBalanceToEth(api, alice, receiver); const address = collectionIdToAddress(collection); const contract = new web3.eth.Contract(fungibleAbi as any, address, {from: owner, ...GAS_ARGS}); --- a/tests/src/eth/marketplace/marketplace.test.ts +++ b/tests/src/eth/marketplace/marketplace.test.ts @@ -38,8 +38,8 @@ // Ask { - await executeEthTxOnSub(api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId)); - await executeEthTxOnSub(api, seller, matcher, m => m.setAsk(PRICE, '0x0000000000000000000000000000000000000000', evmCollection.options.address, tokenId, 1)); + await executeEthTxOnSub(web3, api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId)); + await executeEthTxOnSub(web3, api, seller, matcher, m => m.setAsk(PRICE, '0x0000000000000000000000000000000000000000', evmCollection.options.address, tokenId, 1)); } // Token is transferred to matcher @@ -49,7 +49,7 @@ { const sellerBalanceBeforePurchase = await getBalanceSingle(api, seller.address); // There is two functions named 'buy', so we should provide full signature - await executeEthTxOnSub(api, alice, matcher, m => m['buy(address,uint256)'](evmCollection.options.address, tokenId), {value: PRICE}); + await executeEthTxOnSub(web3, api, alice, matcher, m => m['buy(address,uint256)'](evmCollection.options.address, tokenId), {value: PRICE}); expect(await getBalanceSingle(api, seller.address) - sellerBalanceBeforePurchase === PRICE); } @@ -95,8 +95,8 @@ // Ask { - await executeEthTxOnSub(api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId)); - await executeEthTxOnSub(api, seller, matcher, m => m.setAsk(PRICE, evmFungible.options.address, evmCollection.options.address, tokenId, 1)); + await executeEthTxOnSub(web3, api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId)); + await executeEthTxOnSub(web3, api, seller, matcher, m => m.setAsk(PRICE, evmFungible.options.address, evmCollection.options.address, tokenId, 1)); } // Token is transferred to matcher @@ -107,9 +107,9 @@ const sellerBalanceBeforePurchase = BigInt(await evmFungible.methods.balanceOf(subToEth(seller.address)).call()); const buyerBalanceBeforePurchase = BigInt(await evmFungible.methods.balanceOf(subToEth(alice.address)).call()); - await executeEthTxOnSub(api, alice, evmFungible, m => m.approve(matcher.options.address, PRICE)); + await executeEthTxOnSub(web3, api, alice, evmFungible, m => m.approve(matcher.options.address, PRICE)); // There is two functions named 'buy', so we should provide full signature - await executeEthTxOnSub(api, alice, matcher, m => + await executeEthTxOnSub(web3, api, alice, matcher, m => m['buy(address,uint256,address,uint256)'](evmCollection.options.address, tokenId, evmFungible.options.address, PRICE)); // Approved price is removed from buyer balance, and added to seller @@ -158,8 +158,8 @@ // Ask { - await executeEthTxOnSub(api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId)); - await executeEthTxOnSub(api, seller, matcher, m => m.setAsk(PRICE, ksmToken, evmCollection.options.address, tokenId, 1)); + await executeEthTxOnSub(web3, api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId)); + await executeEthTxOnSub(web3, api, seller, matcher, m => m.setAsk(PRICE, ksmToken, evmCollection.options.address, tokenId, 1)); } // Token is transferred to matcher @@ -173,7 +173,7 @@ expect(await matcher.methods.escrowBalance(ksmToken, subToEth(seller.address)).call()).to.be.equal('0'); expect(await matcher.methods.escrowBalance(ksmToken, subToEth(alice.address)).call()).to.be.equal(PRICE.toString()); - await executeEthTxOnSub(api, alice, matcher, m => m.buy(evmCollection.options.address, tokenId)); + await executeEthTxOnSub(web3, api, alice, matcher, m => m.buy(evmCollection.options.address, tokenId)); // Price is removed from buyer balance, and added to seller expect(await matcher.methods.escrowBalance(ksmToken, subToEth(alice.address)).call()).to.be.equal('0'); --- a/tests/src/eth/nonFungible.test.ts +++ b/tests/src/eth/nonFungible.test.ts @@ -203,7 +203,7 @@ const alice = privateKey('//Alice'); const owner = createEthAccount(web3); - await transferBalanceToEth(api, alice, owner, 999999999999999); + await transferBalanceToEth(api, alice, owner); const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: owner}); @@ -213,7 +213,7 @@ const contract = new web3.eth.Contract(nonFungibleAbi as any, address); { - const result = await contract.methods.approve(spender, tokenId).send({from: owner, gas: '0x1000000', gasPrice: '0x01'}); + const result = await contract.methods.approve(spender, tokenId).send({from: owner, ...GAS_ARGS}); const events = normalizeEvents(result.events); expect(events).to.be.deep.equal([ @@ -237,12 +237,12 @@ const alice = privateKey('//Alice'); const owner = createEthAccount(web3); - await transferBalanceToEth(api, alice, owner, 999999999999999); + await transferBalanceToEth(api, alice, owner); const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: owner}); const spender = createEthAccount(web3); - await transferBalanceToEth(api, alice, spender, 999999999999999); + await transferBalanceToEth(api, alice, spender); const receiver = createEthAccount(web3); @@ -285,12 +285,12 @@ const alice = privateKey('//Alice'); const owner = createEthAccount(web3); - await transferBalanceToEth(api, alice, owner, 999999999999999); + await transferBalanceToEth(api, alice, owner); const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: owner}); const receiver = createEthAccount(web3); - await transferBalanceToEth(api, alice, receiver, 999999999999999); + await transferBalanceToEth(api, alice, receiver); const address = collectionIdToAddress(collection); const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: owner, ...GAS_ARGS}); --- a/tests/src/eth/payable.test.ts +++ b/tests/src/eth/payable.test.ts @@ -32,7 +32,7 @@ contract.methods.giveMoney().encodeABI(), '10000', GAS_ARGS.gas, - GAS_ARGS.gasPrice, + await web3.eth.getGasPrice(), null, ); const events = await submitTransactionAsync(alice, tx); --- a/tests/src/eth/proxy/nonFungibleProxy.test.ts +++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts @@ -224,7 +224,7 @@ const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: contract.options.address}); { - const result = await contract.methods.approve(spender, tokenId).send({from: caller, gas: '0x1000000', gasPrice: '0x01'}); + const result = await contract.methods.approve(spender, tokenId).send({from: caller, ...GAS_ARGS}); const events = normalizeEvents(result.events); expect(events).to.be.deep.equal([ --- a/tests/src/eth/util/helpers.ts +++ b/tests/src/eth/util/helpers.ts @@ -12,14 +12,14 @@ import usingApi, {submitTransactionAsync} from '../../substrate/substrate-api'; import {IKeyringPair} from '@polkadot/types/types'; import {expect} from 'chai'; -import {getGenericResult} from '../../util/helpers'; +import {getGenericResult, UNIQUE} from '../../util/helpers'; import * as solc from 'solc'; import config from '../../config'; import privateKey from '../../substrate/privateKey'; import contractHelpersAbi from './contractHelpersAbi.json'; import getBalance from '../../substrate/get-balance'; -export const GAS_ARGS = {gas: 0x1000000, gasPrice: '0x01'}; +export const GAS_ARGS = {gas: 1000000}; let web3Connected = false; export async function usingWeb3(cb: (web3: Web3) => Promise | T): Promise { @@ -63,7 +63,7 @@ return account; } -export async function transferBalanceToEth(api: ApiPromise, source: IKeyringPair, target: string, amount = 999999999999999) { +export async function transferBalanceToEth(api: ApiPromise, source: IKeyringPair, target: string, amount = 10000n * UNIQUE) { const tx = api.tx.balances.transfer(evmToAddress(target), amount); const events = await submitTransactionAsync(source, tx); const result = getGenericResult(events); @@ -228,14 +228,14 @@ return new web3.eth.Contract(contractHelpersAbi as any, '0x842899ECF380553E8a4de75bF534cdf6fBF64049', {from: caller, ...GAS_ARGS}); } -export async function executeEthTxOnSub(api: ApiPromise, from: IKeyringPair, to: any, mkTx: (methods: any) => any, {value = 0}: {value?: bigint | number} = { }) { +export async function executeEthTxOnSub(web3: Web3, api: ApiPromise, from: IKeyringPair, to: any, mkTx: (methods: any) => any, {value = 0}: {value?: bigint | number} = { }) { const tx = api.tx.evm.call( subToEth(from.address), to.options.address, mkTx(to.methods).encodeABI(), value, GAS_ARGS.gas, - GAS_ARGS.gasPrice, + await web3.eth.getGasPrice(), null, ); const events = await submitTransactionAsync(from, tx); -- gitstuff