Seal Document
Summary:
The script interacts with a deployed smart contract on the Hedera network by executing a function call and decoding the emitted events. It showcases how to send transactions to the smart contract and parse the resulting event data.
1. Imports and Environment Setup:
const {
Client,
ContractFunctionParameters,
ContractExecuteTransaction,
PrivateKey,
} = require("@hashgraph/sdk");
require('dotenv').config({ path: 'SmartContract_Service/.env' });
const Web3 = require('web3');
const web3 = new Web3;
let abi;
It imports necessary modules from the Hedera JavaScript SDK (
@hashgraph/sdk
), includingClient
,ContractFunctionParameters
,ContractExecuteTransaction
, andPrivateKey
.It also imports the
dotenv
module to load environment variables from a.env
file located in theSmartContract_Service
directory.The script imports the
Web3
module to interact with the Ethereum-like smart contract and creates aweb3
instance.
2. Environment Variables Retrieval and Validation:
const myAccountId = process.env.MY_ACCOUNT_ID;
const myPrivateKey = PrivateKey.fromString(process.env.MY_PRIVATE_KEY);
const contractId = process.env.CONTRACT_ID;
const hash = process.env.HASH;
if (myAccountId == null || myPrivateKey == null) {
throw new Error("Environment variables myAccountId and myPrivateKey must be present");
}
The script retrieves the account ID, private key, contract ID, and hash from the
.env
file.It checks whether these variables are present; otherwise, it throws an error.
3. Client Setup:
const client = Client.forTestnet();
client.setOperator(myAccountId, myPrivateKey);
It creates a client instance for the Hedera testnet and sets the operator account using the user's account ID and private key.
4. Main Function:
async function main() {
// Transaction to update the contract message
const contractExecTx = await new ContractExecuteTransaction()
.setContractId(contractId)
.setGas(100000)
.setFunction("seal", new ContractFunctionParameters().addString(hash));
const submitExecTx = await contractExecTx.execute(client);
const receipt2 = await submitExecTx.getReceipt(client);
console.log("The transaction status is " + receipt2.status.toString());
const record = await submitExecTx.getRecord(client);
record.contractFunctionResult.logs.forEach(log => {
let logStringHex = '0x'.concat(Buffer.from(log.data).toString('hex')));
let logTopics = [];
log.topics.forEach(topic => {
logTopics.push('0x'.concat(Buffer.from(topic).toString('hex')));
});
decodeEvent("DocumentSealed", logStringHex, logTopics.slice(1));
});
process.exit();
}
The
main()
function is the entry point of the script.It creates a transaction to execute a function (
seal
) on the smart contract with the given contract ID and hash parameter.The transaction is executed on the Hedera network, and its receipt is retrieved to confirm the execution status.
Events emitted by the smart contract function call are parsed and decoded using the
decodeEvent
function.
5. Event Decoding Function:
function decodeEvent(eventName, log, topics) {
const abiFile = require("../artifacts/contracts/eseal.sol/Eseal.json");
abi = abiFile.abi;
const eventAbi = abi.find(event => (event.name === eventName && event.type === "event"));
const decodedLog = web3.eth.abi.decodeLog(eventAbi.inputs, log, topics);
console.log(decodedLog);
return decodedLog;
}
The
decodeEvent
function decodes the event contents using the ABI definition of the event.It loads the ABI file of the smart contract and finds the event ABI based on the event name.
The event data is decoded using
web3.eth.abi.decodeLog
.
6. Execution:
main();
This line calls the
main()
function to start the execution of the script.
Last updated
Was this helpful?