Solidity
Uniswap 路由器部署錯誤:“UniswapV2Router02”——無法創建 UniswapV2Router02 的實例;地址 0xxxxxxxxx 處沒有程式碼
我正在嘗試分叉 Uniswap 並在 Ropsten 測試網上部署以用於教育和測試目的。從我收集的資訊來看,我們似乎需要先部署 UniswapV2Factory 合約,然後再部署 UniswapV2Router02 合約。我分別從這里和 這里複製。我沒有對程式碼進行任何更改。我可以使用松露很好地部署工廠契約。但是,在部署路由器契約時出現以下錯誤:
錯誤:*** 部署失敗 ***
“UniswapV2Router02” – 無法創建 UniswapV2Router02 的實例;地址 0xXXXXXXXXXXXXXXX 處沒有程式碼。
這是我用來部署 UniswapV2Factory 的腳本:
const Factory = artifacts.require("UniswapV2Factory.sol"); module.exports = async function (deployer, network, addresses) { await deployer.deploy(Factory, addresses[0]); };
以及部署 UniswapV2Router02 的程式碼:
const Router = artifacts.require('UniswapV2Router02.sol'); module.exports = async function (deployer, network, addresses) { const WETH_ADDRESS = '0x0a180a76e4466bf68a7f86fb029bed3cccfaaac5'; const FACTORY_ADDRESS = '{factory address}'; await deployer.deploy(Router, FACTORY_ADDRESS, WETH_ADDRESS); }
我已將solidity 編譯器版本更改為工廠的0.5.16 和路由器的0.6.6。
我在部署時也遇到了同樣的問題。當檢查在區塊鏈瀏覽器中返回錯誤的 tx 雜湊時,我得到了這個:-
這表示原因是“超出了最大程式碼大小”。
uniswapV2Router02 是一個龐大的程式碼,這就是它無法部署的原因。tx 無法通過,他們試圖在該地址創建一個實例,但無法成功。所以返回了一個錯誤。您可能會看到錯誤消息中的合約地址與失敗的 tx 中的合約地址相同。
使固定:-
我通過註釋掉不經常使用的部分智能合約來解決這個問題。我註釋掉(選擇程式碼然後(cntrl + /))程式碼中的整個部分,從這個開始=>
**** SWAP (supporting fee-on-transfer tokens) ****
如果您想要此功能,最好將其複製到單獨的solidity 文件中,然後將其導入到Router solidity 程式碼中。
我找到了解決方案(感謝來自 openzeppelin 論壇的 jamestran)。
jamestran解決方案:
compilers: { solc: { version: "0.6.6", // 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: true, runs: 999999 }, evmVersion: "istanbul", outputSelection: { "*": { "": [ "ast" ], "*": [ "evm.bytecode.object", "evm.deployedBytecode.object", "abi", "evm.bytecode.sourceMap", "evm.deployedBytecode.sourceMap", "metadata" ] }, } } }, },
P/S 設置為您的松露配置。