如何解决交易因错误退出状态 0
我正在尝试使用 solidity 和 truffle 中的脚本在币安测试网上进行一些交易。合约只是 pancakeswap 的一个克隆。我的脚本基本上为池增加了流动性。我能够成功编译并执行一次脚本。当我尝试在路由器和工厂的不同地址上再次执行此操作时,它给了我以下错误:
StatusError: Transaction: 0xc94424b8c6037e75e0eaf5f21982e2f73f88e71e18e0e5e783c642d6210e686f exited with an error (status 0).
at module.exports (D:\Blockchain\pancake\createpool\scripts\deploypool.js:18:18)
at runMicrotasks (<anonymous>)
at processticksAndRejections (internal/process/task_queues.js:97:5) {
tx: '0xc94424b8c6037e75e0eaf5f21982e2f73f88e71e18e0e5e783c642d6210e686f',receipt: {
blockHash: '0xc4bea040096811e809c18216d85fc82813b60db9545d4e1bf6ab7c4dd344fe87',blockNumber: 8023495,contractAddress: null,cumulativeGasUsed: 699140,from: '0xe95745a8f4e3cdb1cf5bffd4a94f0b249e99f489',gasUsed: 29046,logs: [],logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',status: false,to: '0x7632ae832440032fb4ca93e56873a92a01b06e13',transactionHash: '0xc94424b8c6037e75e0eaf5f21982e2f73f88e71e18e0e5e783c642d6210e686f',transactionIndex: 2,rawLogs: []
},reason: undefined,hijackedStack: 'StatusError: Transaction: 0xc94424b8c6037e75e0eaf5f21982e2f73f88e71e18e0e5e783c642d6210e686f exited with an error (status 0). \n' +
' Please check that the transaction:\n' +
' - satisfies all conditions set by solidity `require` statements.\n' +
' - does not trigger a solidity `revert` statement.\n' +
'\n' +
' at Object.receipt (C:\\Users\\DELL\\AppData\\Roaming\\npm\\node_modules\\truffle\\build\\webpack:\\packages\\contract\\lib\\handlers.js:124:1)\n' +
' at runMicrotasks (<anonymous>)\n' +
' at processticksAndRejections (internal/process/task_queues.js:97:5)\n' +
' at Function.start (C:\\Users\\DELL\\AppData\\Roaming\\npm\\node_modules\\truffle\\build\\webpack:\\packages\\contract\\lib\\override.js:49:1)'
我的truffle-config.js:
//SPDX-License-Identifier: MIT
require('dotenv').config();
var HDWalletProvider = require("truffle-hdwallet-provider");
const infuraKey = process.env.infuraKey;
const mnemonic = process.env.mnemonic;
module.exports = {
networks: {
// Useful for testing. The `development` name is special - truffle uses it by default
// if it's defined here and no other network is specified at the command line.
// You should run a client (like ganache-cli,geth or parity) in a separate terminal
// tab if you use this network and you must also set the `host`,`port` and `network_id`
// options below to some value.
//
development: {
host: "127.0.0.1",// Localhost (default: none)
port: 8545,// Standard Ethereum port (default: none)
network_id: "*",// Any network (default: none)
},rinkeby: {
provider: function () {
return new HDWalletProvider(mnemonic,"https://rinkeby.infura.io/v3/" + infuraKey);
},network_id: 4,gas: 4500000,gasPrice: 10000000000,},bscTestnet: {
provider: () => new HDWalletProvider(
mnemonic,'https://data-seed-prebsc-1-s1.binance.org:8545'
),from: '0xe95745a8F4E3cDb1cF5bfFD4A94F0B249e99f489',network_id: 97,skipDryRun: true
},mainnet: {
provider: () => new HDWalletProvider(
mnemonic,'https://bsc-dataseed.binance.org/'
),network_id: 56,skipDryRun: true
}
},mocha: {
// timeout: 100000
},// Configure your compilers
compilers: {
solc: {
version: "0.8.0",// Fetch exact version from solc-bin (default: truffle's version)
// docker: true,// Use "0.5.1" you've installed locally with docker (default: false)
// settings: { // See the solidity docs for advice about optimization and evmVersion
// optimizer: {
// enabled: false,// runs: 200
// },// evmVersion: "byzantium"
// }
},};
合约中的流动性函数
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,address tokenB,uint amountADesired,uint amountBDesired,uint amountAMin,uint amountBMin
) private returns (uint amountA,uint amountB) {
// create the pair if it doesn't exist yet
if (INiftFactory(factory).getPair(tokenA,tokenB) == address(0)) {
INiftFactory(factory).createPair(tokenA,tokenB);
}
(uint reserveA,uint reserveB) = NiftLibrary.getReserves(factory,tokenA,tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA,amountB) = (amountADesired,amountBDesired);
} else {
uint amountBOptimal = NiftLibrary.quote(amountADesired,reserveA,reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin,'NiftRouter: INSUFFICIENT_B_AMOUNT');
(amountA,amountBOptimal);
} else {
uint amountAOptimal = NiftLibrary.quote(amountBDesired,reserveB,reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin,'NiftRouter: INSUFFICIENT_A_AMOUNT');
(amountA,amountB) = (amountAOptimal,amountBDesired);
}
}
}
function addLiquidity(
address tokenA,uint amountBMin,address to,uint deadline
) external override ensure(deadline) returns (uint amountA,uint amountB,uint liquidity) {
(amountA,amountB) = _addLiquidity(tokenA,tokenB,amountADesired,amountBDesired,amountAMin,amountBMin);
address pair = NiftLibrary.pairFor(factory,tokenB);
TransferHelper.safeTransferFrom(tokenA,msg.sender,pair,amountA);
TransferHelper.safeTransferFrom(tokenB,amountB);
liquidity = INiftPair(pair).mint(to);
}
我的deploypool.js 脚本:
const Factory = artifacts.require('Factory.sol');
const Router = artifacts.require('Router.sol');
const Pair = artifacts.require('Pair.sol');
const Token1 = artifacts.require('token1.sol');
const Token2 = artifacts.require('token2.sol');
module.exports = async done => {
try {
//const [admin,_] = await web3.eth.getAccounts();
const factory = await Factory.at('0x78A47245BC7BDaa0DB7c19b7B6116E1E11e9fE20');
const router = await Router.at('0xE1672640636a56E2905B8a303224b65A605286CF');
const token1 = await Token1.new();
const token2 = await Token2.new();
const pairAddress = await factory.createPair.call(token1.address,token2.address);
const tx = await factory.createPair(token1.address,token2.address);
await token1.approve(router.address,10000);
await token2.approve(router.address,10000);
await router.addLiquidity(
token1.address,token2.address,9000,10000,myMetamaskaddress,Math.floor(Date.Now() / 1000) + 60 * 10
);
const pair = await Pair.at(pairAddress);
const balance = await pair.balanceOf("0xe95745a8F4E3cDb1cF5bfFD4A94F0B249e99f489");
console.log(`balance LP: ${balance.toString()}`);
} catch (e) {
console.log(e);
}
done();
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。