-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontract_interaction.js
157 lines (138 loc) · 4.9 KB
/
contract_interaction.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
require("dotenv").config();
const {
AccountBalanceQuery,
AccountId,
Client,
ContractCallQuery,
ContractExecuteTransaction,
ContractFunctionParameters,
ContractId,
Hbar,
PrivateKey,
} = require("@hashgraph/sdk");
const { exit } = require("process");
const fs = require("fs");
const MAX_GAS = 3000000;
const MAX_QUERY_HBARS = 100;
const HBAR_TO_TINYBAR = 100000000;
// Grab your Hedera testnet account ID and private key from .env file
const accountId = AccountId.fromString(process.env.ACCOUNT_ID);
const privateKey = PrivateKey.fromString(process.env.PRIVATE_KEY);
// Set the client with your account ID and private key
const client = Client.forTestnet().setOperator(accountId, privateKey);
client.setMaxQueryPayment(new Hbar(MAX_QUERY_HBARS));
async function main() {
///////////////////////////////////////////
// Get SC address from contract_address.txt
const contractIdString = fs.readFileSync("contract_address.txt");
const contractId = ContractId.fromString(contractIdString);
//////////////////////////////////////////////////////////////
// Get account's balance before submitting setter transactions
const balanceQuery = new AccountBalanceQuery().setAccountId(accountId);
const accountBalanceBeforeTx = await balanceQuery.execute(client);
////////////////////////////////////////////
// Update this account's age via deployed SC
const setAgeTx = new ContractExecuteTransaction()
.setContractId(contractId)
.setGas(MAX_GAS)
.setFunction("setAge", new ContractFunctionParameters().addUint256(27));
await executeInConsole(
setAgeTx,
"Setting account's age via deployed SC...",
client
);
/////////////////////////////////////////////////////////
// Update this account's name and surname via deployed SC
const setNameTx = new ContractExecuteTransaction()
.setContractId(contractId)
.setGas(MAX_GAS)
.setFunction("setName", new ContractFunctionParameters().addString("John"));
await executeInConsole(
setNameTx,
"Setting account's name via deployed SC...",
client
);
const setSurnameTx = new ContractExecuteTransaction()
.setContractId(contractId)
.setGas(MAX_GAS)
.setFunction(
"setSurname",
new ContractFunctionParameters().addString("Doe")
);
await executeInConsole(
setSurnameTx,
"Setting account's surname via deployed SC...",
client
);
//////////////////////////////////////////
// Log average fee for setter transactions
const accountBalanceAfterTx = await balanceQuery.execute(client);
console.log(
"Average fee for setter transactions " +
(
(accountBalanceBeforeTx.hbars.toTinybars() -
accountBalanceAfterTx.hbars.toTinybars()) /
HBAR_TO_TINYBAR /
3
).toFixed(2) +
" ℏ \n"
);
/////////////////////////////////////////////////
// Query age, name and surname of current account
const accountBalanceBeforeQuery = await balanceQuery.execute(client);
const ageQuery = new ContractCallQuery()
.setContractId(contractId)
.setGas(MAX_GAS)
.setFunction(
"getAge",
new ContractFunctionParameters().addAddress(accountId.toSolidityAddress())
);
const ageQuerySubmit = await ageQuery.execute(client);
const ageQueryResult = ageQuerySubmit.getUint256(0);
console.log("Here's the age you've asked for: " + ageQueryResult);
const nameQuery = new ContractCallQuery()
.setContractId(contractId)
.setGas(MAX_GAS)
.setFunction(
"getName",
new ContractFunctionParameters().addAddress(accountId.toSolidityAddress())
);
const nameQuerySubmit = await nameQuery.execute(client);
const nameQueryResult = nameQuerySubmit.getString(0);
console.log("Here's the name you've asked for: " + nameQueryResult);
const surnameQuery = new ContractCallQuery()
.setContractId(contractId)
.setGas(MAX_GAS)
.setFunction(
"getSurname",
new ContractFunctionParameters().addAddress(accountId.toSolidityAddress())
);
const surnameQuerySubmit = await surnameQuery.execute(client);
const surnameQueryResult = surnameQuerySubmit.getString(0);
console.log("Here's the surname you've asked for: " + surnameQueryResult);
//////////////////////////////////////////
// Log average fee for query transactions
const accountBalanceAfterQuery = await balanceQuery.execute(client);
console.log(
"\nAverage fee for query transactions " +
(
(accountBalanceBeforeQuery.hbars.toTinybars() -
accountBalanceAfterQuery.hbars.toTinybars()) /
HBAR_TO_TINYBAR /
3
).toFixed(2) +
" ℏ \n"
);
exit();
}
async function executeInConsole(tx, msg, client) {
console.log(msg);
const timeBeforeTx = performance.now();
const receipt = await (await tx.execute(client)).getReceipt(client);
const timeAfterTx = performance.now();
console.log(
`...${receipt.status}! in ${Math.round(timeAfterTx - timeBeforeTx)} ms\n`
);
return receipt;
}
main();