Distribuisci bytecode precompilato utilizzando l'API deployer di truffle migrations
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
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.
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");.