Implemente un código de bytes precompilado usando la API de implementación de migraciones de trufas

Sep 16 2020

Quiero implementar un código de bytes de Smart Contract precompilado mediante migraciones de Truffle. Específicamente, es el contrato de Uniswap V2 Factory.

En la documentación de Uniswap V2 hay un cliffhanger, donde mencionan usar:

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

Y luego impleméntelo usando Truffle (pero no incluya un ejemplo). Sin embargo, no puedo hacer que la implementación funcione. Aquí está mi script de migración:

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

Tenga en cuenta que el UniswapV2Factoryconstructor requiere una _feeToSetterdirección, por lo que paso accounts[0]como parámetro.

Cuando ejecuto usando truffle migrate --resetel siguiente error se devuelve:

TypeError: contract.detectNetwork is not a function

¿Alguien puede ayudar a señalar una solución para que esto funcione?

Respuestas

7 DarrenJensen Sep 16 2020 at 21:38

Una solución parece ser instalar un @truffle/contractpaquete así:

npm install @truffle/contract

Luego, en el archivo de migración, deberá obtener el JSON del contrato completo (no solo el código de bytes como se menciona en la pregunta) y usarlo @truffle/contractpara crear una instancia de contrato a partir del JSON. También deberá configurar el proveedor manualmente y configurar la cuenta del implementador también manualmente.

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

Dados todos los obstáculos adicionales para superar, este podría no ser el mejor enfoque, pero produce lo que buscaba: una instancia del contrato implementado en mi entorno de desarrollo.

SergioGaitan Apr 07 2021 at 07:02

Mi solución fue copiar el UniswapV2Factoryarchivo JSON del contrato en la build/contractscarpeta. Luego lo usé como cualquier otro artefacto con artifacts.require("UniswapV2Factory");.