Tengo el archivo MyContract.json de algún contrato (supongamos que no tengo su código fuente). En el archivo .json, hay abi y bytecode. Si quiero implementar dicho contrato (a través de web3js), me enfrento a los siguientes problemas. Sin embargo, esta pregunta se vuelve más compleja, cuando hay miles de contratos, que es mi tarea final. Pero aquí estoy, solo me limito a un solo contrato para comprender el propósito.
Para la pregunta No. 1; Estoy compartiendo aquí mi código para su implementación. Es válido y funciona si el contrato tiene un constructor que toma la dirección del propietario en su parámetro. Este código se prueba en algún contrato conocido con código fuente. Sin embargo, si el constructor no toma parámetros o diferentes parámetros o muchos otros parámetros, este código no se implementará , porque debo pasar una cantidad válida de parámetros y valores válidos.
var compiledContract = require('./build/MyContract.json');
async function deployCon() {
const contract = new web3.eth.Contract(compiledContract.abi);
const params = {
data: '0x' + compiledContract.bytecode,
arguments: [account1]
};
const transaction = contract.deploy(params);
const options = {
data: transaction.encodeABI(),
gas: await transaction.estimateGas({from: account1})
};
// console.log(options)
const signed = await web3.eth.accounts.signTransaction(options, privateKey1);
receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction);
console.log(`Contract deployed at address: ${receipt.contractAddress}`);
return receipt;
}
Para la pregunta No. 2; Estoy totalmente ciego sobre cómo llamar a las funciones del contrato que se muestran aquí como ??????? (que llegará a saber a través de abi del archivo .json junto con los parámetros).
var myContAddr = receipt.contractAddress;
var myContractAbiDefenition = compiledContract.abi;
var myContractInstance = new web3.eth.Contract(myContractAbiDefenition, myContAddr);
await myContractInstance.methods.???????.send({from: account1, value: web3.utils.toWei(amount, 'ether')})
Para su pregunta No. 1: Busca "type": "constructor"
en tu ABI
. Desde este objeto, puede ver el inputs
que tiene una matriz de parámetros junto con su nombre y tipo. Ejemplo:
{
"inputs": [
{
"internalType": "uint256",
"name": "_ff",
"type": "uint256"
},
{
"internalType": "string",
"name": "_name",
"type": "string"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
}
En el ejemplo anterior, puede ver que el constructor tiene dos parámetros: _ff
y name
de tipo uint256
y string
respectivamente.
Para la pregunta No. 2 : una vez que se instancia el contrato, puede registrar todos los métodos, así como la variable de estado público, utilizando console.log(myContractInstance.methods)
.
De lo contrario, puede buscar ABI
dónde está type function
. Pero esta puede ser una forma más compleja.
Actualizado:
let abi = JSON ABI;
for (let item of abi) {
// this will return an array of constructor parameters along with their name and type
if (item.type === "constructor") console.log(item.inputs);
// result [{internalType: "uint256", name: "_ff", type: "uint256"}, {internalType: "string", name: "_name", type: "string"}]
// this will return only the names
// you can push the names into array
// then iterate over the array to call them
if (item.type === "function") console.log(item.name);
}
Espero que ayude
Amir Alí
yahya
Amir Alí
yahya
setTotalSupply
, simplemente llámelo comomyContractInstance.methods.setTotalSupply().call()
.Amir Alí
yahya
var methods = myContractInstance.methods
esto no solo guardará los nombres de las funciones, sino también las firmas de las funciones. tambiénvar methods
será un objeto. Entonces puede obtener una matriz usandoObject.keys(methods)
. Pero esta matriz contendrá nombres de funciones y firmas. Una vez que solo tenga nombres de funciones, puede iterar sobre la matriz.Amir Alí
yahya