Stellen Sie vorkompilierten Bytecode mithilfe der Deployer-API für Trüffelmigrationen bereit
Ich möchte vorkompilierten Smart Contract-Bytecode mithilfe von Trüffelmigrationen bereitstellen. Insbesondere handelt es sich um den Uniswap V2 Factory-Vertrag.
In der Uniswap V2-Dokumentation gibt es einen Cliffhanger, in dem Folgendes erwähnt wird:
const UniswapV2FactoryBytecode = require('@uniswap/v2-core/build/UniswapV2Factory.json').bytecode
Stellen Sie es dann mit Trüffel bereit (fügen Sie jedoch kein Beispiel hinzu). Ich kann die Bereitstellung jedoch nicht zum Laufen bringen. Hier ist mein Migrationsskript:
const UniswapV2FactoryBytecode = require('@uniswap/v2-core/build/UniswapV2Factory.json').bytecode
module.exports = function(_deployer, network, accounts) {
_deployer.deploy(UniswapV2FactoryBytecode, accounts[0])
};
Beachten Sie, dass der UniswapV2FactoryKonstruktor eine _feeToSetterAdresse benötigt, weshalb ich accounts[0]als Parameter übergebe.
Wenn ich mit truffle migrate --resetfolgendem Fehler laufe, wird Folgendes zurückgegeben:
TypeError: contract.detectNetwork is not a function
Kann jemand helfen, auf eine Lösung hinzuweisen, damit dies funktioniert?
Antworten
Eine Lösung scheint darin zu bestehen, das @truffle/contractPaket wie folgt zu installieren :
npm install @truffle/contract
Dann müssen Sie in der Migrationsdatei den vollständigen Vertrags-JSON (nicht nur den in der Frage erwähnten Bytecode) abrufen und den verwenden @truffle/contract, um eine Vertragsinstanz aus dem JSON zu erstellen. Sie müssen den Anbieter auch manuell und das Bereitstellungskonto auch manuell festlegen.
const json = require('@uniswap/v2-core/build/UniswapV2Factory.json')
const contract = require('@truffle/contract');
const UniswapV2Factory = contract(json);
UniswapV2Factory.setProvider(this.web3._provider);
module.exports = function(_deployer, network, accounts) {
_deployer.deploy(UniswapV2Factory, accounts[0], {from: accounts[0]})
};
Angesichts all der zusätzlichen Rahmen, die erforderlich sind, um durch diesen zu springen, ist dies möglicherweise nicht der beste Ansatz, aber er liefert das, wonach ich gesucht habe - eine Instanz des Vertrags, der in meiner Entwicklungsumgebung bereitgestellt wird.
Meine Lösung bestand darin, die UniswapV2FactoryJSON-Datei des Vertrags in einen build/contractsOrdner zu kopieren . Dann habe ich es einfach wie jedes andere Artefakt verwendet artifacts.require("UniswapV2Factory");.