Stellen Sie vorkompilierten Bytecode mithilfe der Deployer-API für Trüffelmigrationen bereit

Sep 16 2020

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

7 DarrenJensen Sep 16 2020 at 21:38

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.

SergioGaitan Apr 07 2021 at 07:02

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");.