Web3js

如何在不送出到區塊鏈的情況下在本地模擬購買/交易交易?

  • February 25, 2022

我正在學習一些關於區塊鏈的知識,並且有些東西我被困住了。

我正在使用來自 BSC 網路的貨幣對,如果可以在實際進行交易之前購買和出售代幣,我想獲得一些資訊。為此,我正在嘗試執行這些交易,甚至不將它們送出到區塊鏈(以了解狀態是否可能是 TRANSFER_FROM_FAILED 出售)。

據我了解,如果我在不送出區塊鏈的情況下實際執行這些交易,我們可以在不支付任何費用的情況下獲得操作結果。

我的程式碼如下:

console.log(`Checking for ${address}`);

let contract = new web3.eth.Contract(require('../../../services/pcsAbi'), PANCAKESWAP_ROUTER_ADDRESS);
let tokenContract = new web3.eth.Contract(require('../../../services/abi.json'), address);

// Below are the steps to execute the batch

// First step: Execute a buy for specific token. Since I don't want to send that transaction to blockchain, I'm just calling that function and see its result
const batch = new web3.eth.BatchRequest();
batch.add(
   contract.methods.swapExactETHForTokens(
       web3.utils.toHex(100),
       [WBNB_ADDRESS, address],
       MY_ADDRESS,
       web3.utils.toHex(Math.round(Date.now()/1000)+60*20)
   )
   .call
   .request({
       gasLimit: 10000000,  
       gasPrice: web3.utils.toWei('100', 'Gwei'), 
       value: web3.utils.toWei('1', 'ether'),
       nonce: 0
   }, 'latest', callback)
);

// Second step. Get balance for the token. I was supposed here to get the balance bought above, but anyway it's returning 0 and I don't know why
tokenContract.methods.balanceOf(MY_ADDRESS).call.request({
   gasLimit: 10000000,  
   gasPrice: web3.utils.toWei('100', 'Gwei'), 
   value: web3.utils.toWei('1', 'ether'),
   nonce: 1
}, 'latest', callbackBalance)

// Third step. I tries to sell the token back. If a token is honeypot, it will fail with TRANSFER_FROM_FAILED state or execution reverted.
batch.add(
   contract.methods.swapExactTokensForETH(
       1,
       1,
       // web3.utils.toHex(1),
       // web3.utils.toHex(10),
       [address, WBNB_ADDRESS],
       MY_ADDRESS,
       web3.utils.toHex(Math.round(Date.now()/1000)+60*20)
   )
   .call
   .request({
       gasLimit: 800000,  
       gasPrice: web3.utils.toWei('10', 'Gwei'), 
       value: web3.utils.toWei('1', 'Ether')  
   }, 'latest', callback2)
);

執行步驟 1,我得到輸出(數量數組)。第 2 步返回 0 作為餘額。第 3 步甚至不起作用,它總是說執行已恢復,我想那是因為我什至沒有代幣出售!

謝謝你的幫助!

如果您編寫新合約,您可以使用單元測試在 Solidity 中模擬不同的程式碼路徑。

您可以使用eth_callRPC 方法。它呼叫合約,在區塊鏈目前狀態的上下文中執行它,並返回合約執行的值。此方法不會返回發出的事件,而只會返回返回值。

但是在使用呼叫時,您將無法保留不同呼叫之間的狀態。第一步swapExactETHForTokens完成後,事務可能模擬的所有狀態更改都不適用於第二步balanceOf。這可能就是為什麼你把它作為零餘額。

如果要在單個事務中模擬多個呼叫,可以使用 miltcall 函式。在這裡,本質上,您將使用多重呼叫合約在單個事務中對您的合約進行多次呼叫。您可以通過在返回語句中獲得所需的所有資訊的方式來製作多路呼叫請求。

您可以在此處閱讀有關多路呼叫的更多資訊。

引用自:https://ethereum.stackexchange.com/questions/110903