Distribuisci bytecode precompilato utilizzando l'API deployer di truffle migrations

Sep 16 2020

Voglio distribuire il bytecode Smart Contract precompilato utilizzando le migrazioni di Truffle. Nello specifico, è il contratto Uniswap V2 Factory.

Nella documentazione di Uniswap V2 c'è un cliffhanger, dove menzionano di usare:

const UniswapV2FactoryBytecode = require('@uniswap/v2-core/build/UniswapV2Factory.json').bytecode

E poi distribuiscilo usando Truffle (ma non includere un esempio). Tuttavia, non riesco a far funzionare la distribuzione. Ecco il mio script di migrazione:

const UniswapV2FactoryBytecode = require('@uniswap/v2-core/build/UniswapV2Factory.json').bytecode
module.exports = function(_deployer, network, accounts) {
    _deployer.deploy(UniswapV2FactoryBytecode, accounts[0])
};

Nota che il UniswapV2Factorycostruttore richiede un _feeToSetterindirizzo ed è per questo che passo accounts[0]come parametro.

Quando eseguo utilizzando truffle migrate --resetil seguente errore viene restituito:

TypeError: contract.detectNetwork is not a function

Qualcuno può aiutare a indicare una soluzione per farlo funzionare?

Risposte

7 DarrenJensen Sep 16 2020 at 21:38

Una soluzione sembra essere installare il @truffle/contractpacchetto in questo modo:

npm install @truffle/contract

Quindi nel file di migrazione dovrai prendere il JSON del contratto completo (non solo il bytecode come menzionato nella domanda) e utilizzare il @truffle/contractper creare un'istanza del contratto da JSON. Sarà inoltre necessario impostare manualmente il provider e impostare manualmente anche l'account del deployer.

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]})
};

Dati tutti i cerchi in più per saltare attraverso questo potrebbe non essere l'approccio migliore, ma produce ciò che stavo cercando: un'istanza del contratto distribuito nel mio ambiente di sviluppo.

SergioGaitan Apr 07 2021 at 07:02

La mia soluzione è stata copiare il UniswapV2Factoryfile JSON del contratto nella build/contractscartella. Poi l'ho usato come qualsiasi altro artefatto con artifacts.require("UniswapV2Factory");.