From 233c54626a70e6ed6792a1ba646297d3f0b568b9 Mon Sep 17 00:00:00 2001 From: lza_menace Date: Fri, 18 Nov 2022 00:51:43 -0800 Subject: [PATCH] updating gas calcs --- src/App.svelte | 2 +- src/Contracts.svelte | 88 +++++++++++++++++++++++--------------------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/src/App.svelte b/src/App.svelte index 484b43c..4b24568 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -15,7 +15,7 @@

A bulk NFT transfer utility made for transferring ERC-721 and ERC-1155 tokens between accounts easily.
- Made by lza_menace and the Art101 team. + Made by lza_menace and the Art101 team.

diff --git a/src/Contracts.svelte b/src/Contracts.svelte index e30b0e4..d1d454f 100644 --- a/src/Contracts.svelte +++ b/src/Contracts.svelte @@ -5,34 +5,39 @@ import IERC1155 from '@openzeppelin/contracts/build/contracts/IERC1155.json'; import SendIt from './lib/sendit.json'; + const sendit = '0x0165878A594ca255338adfa4d48449f69242Eb8F'; let errorMessage = ''; let successMessage = ''; let contractAddress = ''; let contractApproved = true; let checked = false; + let gasCalculation = ''; let selectedStandard = 1; let tokenStandards = [ { id: 1, text: 'ERC-721' }, { id: 2, text: 'ERC-1155' } ] - // 0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 - const sendit = '0x0165878A594ca255338adfa4d48449f69242Eb8F'; - // const to = '0x7c83E906aDD18C093B4B01ED40b6BCb25d348ED9'; - let amt = 10; let gasLimit = 0; let si_gasLimit = 0; - // evm.attachContract('nft', contractAddress, IERC721.abi); - // evm.attachContract('sendit', sendit, SendIt.abi); + evm.attachContract('sendit', sendit, SendIt.abi); const approveSendIt = async () => { await $contracts.nft.methods.setApprovalForAll(sendit, true).send({from: $selectedAccount}); } + const isApproved = async () => { + return await $contracts.nft.methods.isApprovedForAll($selectedAccount, sendit).call({from: $selectedAccount}); + // if (!i) { + // await $contracts.nft.methods.setApprovalForAll(sendit, true).send({from: $selectedAccount}); + // } + } + const performCheck = async () => { let tokenIds = []; + let recipients = []; errorMessage = ''; // Determine ABI @@ -50,8 +55,6 @@ return; } - - // Check textarea syntax let info = document.getElementById('recipientInfo').value; let lines = info.split(/(\s+)/); @@ -62,7 +65,8 @@ let recipient = line[0]; let tokenId = line[1]; try { - $web3.utils.toChecksumAddress(recipient) + $web3.utils.toChecksumAddress(recipient); + recipients.push(recipient); } catch { errorMessage = `Invalid recipient address supplied (line ${i + 1})`; return; @@ -90,11 +94,10 @@ return; } } - } } - + // Check approval on the contract try { let approved = await $contracts.nft.methods.isApprovedForAll($selectedAccount, sendit).call(); @@ -107,41 +110,38 @@ errorMessage = 'Unable to check contract approvals'; return; } - + // Check gas consumption forecasts + await estimateGas(recipients, tokenIds); + // Show results } - // const estimateCBT = async () => { - // si_gasLimit = 0; - // let tokenIndexes = []; - // let recipients = []; - // for (let i = 0; i < amt; i++) { - // tokenIndexes[i] = i + 1; - // recipients[i] = to; - // } - // let i = await $contracts.nft.methods.isApprovedForAll($selectedAccount, sendit).call({from: $selectedAccount}); - // if (!i) { - // await $contracts.nft.methods.setApprovalForAll(sendit, true).send({from: $selectedAccount}); - // } - // await $contracts.sendit.methods.contractBulkTransfer(nft, tokenIndexes, recipients, false).estimateGas({from: $selectedAccount}, function(err, gas){ - // si_gasLimit += gas; - // }); - // } - - // const estimateSTF = async () => { - // gasLimit = 0; - // for (let i = 0; i < amt; i++) { - // await $contracts.nft.methods.safeTransferFrom($selectedAccount, to, i + 1).estimateGas({from: $selectedAccount}, function(err, gas){ - // gasLimit += gas; - // }); - // } - // } - - // function estimateGas() { - // estimateCBT(); - // estimateSTF(); - // } + async function estimateCBT(recipients, tokens) { + si_gasLimit = 0; + await $contracts.sendit.methods.contractBulkTransfer(contractAddress, tokens, recipients, false).estimateGas({from: $selectedAccount}, function(err, gas){ + si_gasLimit += gas; + }); + } + + async function estimateSTF(recipients, tokens) { + gasLimit = 0; + for (let i = 0; i < recipients.length; i++) { + await $contracts.nft.methods.safeTransferFrom($selectedAccount, recipients[i], tokens[i]).estimateGas({from: $selectedAccount}, function(err, gas){ + gasLimit += gas; + }); + } + } + + async function estimateGas(recipients, tokens) { + if (recipients.length != tokens.length) { errorMessage = 'Invalid recipient/token IDs provided; please review'; return; } + await estimateCBT(recipients, tokens); + await estimateSTF(recipients, tokens); + let gasPrice = await $web3.eth.getGasPrice(); + let gasCostEth = await $web3.utils.fromWei((gasPrice * gasLimit).toString()); + let si_gasCostEth = await $web3.utils.fromWei((gasPrice * si_gasLimit).toString()); + gasCalculation = `Transferring each token individual would require ${gasLimit} gas (${gasCostEth} Ξ). SendIt can do it for ${si_gasLimit} gas (${si_gasCostEth} Ξ).`; + } @@ -180,6 +180,10 @@ {/if} +{#if gasCalculation} +

{gasCalculation}

+{/if} + {#if errorMessage}

{errorMessage}

{/if}