Let's implement a function called sendShieldedTransaction to send a transaction to a smart contract, using SwisstronikJS.
For this example, we have deployed an ERC20 token at 0x7D804090e7a1FF0709d743d115bccE6757Bbe208. Let's create the code to send a transaction to call the function transfer(address, amount)
Open your Hardhat project and run npm i @swisstronik/utils it from the main directory.
Create a file transfer.js within the scripts folder in your Hardhat project, this file will contain the code to run the transfer.
Import SwisstronikJS & Hardhat in the transfer.js script
const hre = require("hardhat");
const { encryptDataField } = require("@swisstronik/utils");
Let's add the code to implement a function called sendShieldedTransaction to use encryptDataField()
You can reuse this sendShieldedTransaction code snippet to interact with any smart contracts in the Swisstronik blockchain.
const hre = require("hardhat");
const { encryptDataField } = require("@swisstronik/utils");
/**
* Send a shielded transaction to the Swisstronik blockchain.
*
* @param {object} signer - The signer object for sending the transaction.
* @param {string} destination - The address of the contract to interact with.
* @param {string} data - Encoded data for the transaction.
* @param {number} value - Amount of value to send with the transaction.
*
* @returns {Promise} - The transaction object.
*/
const sendShieldedTransaction = async (signer, destination, data, value) => {
// Get the RPC link from the Hardhat network configuration
const rpcLink = hre.network.config.url;
// Encrypt transaction data
const [encryptedData] = await encryptDataField(rpcLink, data);
// Construct and sign the transaction with encrypted data
return await signer.sendTransaction({
from: signer.address,
to: destination,
data: encryptedData,
value,
});
};
Let's add the main function to use the sendShieldedTransaction to send a transaction that callsfunction transfer(address recipient, uint256 amount) in the smart contract.
You can reuse this script to execute transactions in Swisstronik (as long as it's a writing function), just make sure to replace the variables marked with the replace_ prefix with your own values in the main function
const hre = require("hardhat");
const { encryptDataField } = require("@swisstronik/utils");
/**
* Send a shielded transaction to the Swisstronik blockchain.
*
* @param {object} signer - The signer object for sending the transaction.
* @param {string} destination - The address of the contract to interact with.
* @param {string} data - Encoded data for the transaction.
* @param {number} value - Amount of value to send with the transaction.
*
* @returns {Promise} - The transaction object.
*/
const sendShieldedTransaction = async (signer, destination, data, value) => {
// Get the RPC link from the Hardhat network configuration
const rpcLink = hre.network.config.url;
// Encrypt transaction data
const [encryptedData] = await encryptDataField(rpcLink, data);
// Construct and sign the transaction with encrypted data
return await signer.sendTransaction({
from: signer.address,
to: destination,
data: encryptedData,
value,
});
};
async function main() {
// Address of the deployed contract
const replace_contractAddress = "0x7D804090e7a1FF0709d743d115bccE6757Bbe208";
// Get the signer (your account)
const [signer] = await hre.ethers.getSigners();
// Create a contract instance
const replace_contractFactory = await hre.ethers.getContractFactory("TestToken");
const contract = replace_contractFactory.attach(replace_contractAddress);
// Send a shielded transaction to execute a transaction in the contract
const replace_functionName = "transfer";
const replace_functionArgs = ["0x87Ea036731B7Bef166b6bC76943EC64848eB2492", "100"];
const transaction = await sendShieldedTransaction(signer, replace_contractAddress, contract.interface.encodeFunctionData(replace_functionName, replace_functionArgs), 0);
await transaction.wait();
// It should return a TransactionResponse object
console.log("Transaction Response: ", transaction);
}
// Using async/await pattern to handle errors properly
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
Run npx hardhat run scripts/transfer.js --network swisstronik
You should see the transaction receipt object printed in your console 🎉