# Transaction - code sample

{% hint style="info" %}
The full repository for this code sample can be found here <https://github.com/SigmaGmbH/swisstronik-tutorials/tree/main/ERC20_interaction>
{% endhint %}

### Sending Transactions in Swisstronik

Let's implement a function called `sendShieldedTransaction` to send a transaction to a smart contract, using SwisstronikJS.

{% hint style="info" %}
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)`
{% endhint %}

1. Open your Hardhat project and run  `npm i @swisstronik/utils` it from the main directory.

{% hint style="warning" %}
NOTE: If you don't know how to set up a Hardhat project, please review the [Contract deployment - Hardhat ](https://docs.swisstronik.com/swisstronik-docs/development/guides/contract-deployment-hardhat/1.-setting-up-the-hardhat-environment)
{% endhint %}

2. Create a file `transfer.js` within the scripts folder in your Hardhat project, this file will contain the code to run the transfer.
3. Import SwisstronikJS & Hardhat in the `transfer.js` script

{% code lineNumbers="true" %}

```javascript
const hre = require("hardhat");
const { encryptDataField } = require("@swisstronik/utils");
```

{% endcode %}

4. Let's add the code to implement a function called `sendShieldedTransaction` to use `encryptDataField()`

{% hint style="success" %}
You can reuse this `sendShieldedTransaction` code snippet to interact with any smart contracts in the Swisstronik blockchain.
{% endhint %}

{% code lineNumbers="true" %}

```javascript
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,
  });
};
```

{% endcode %}

5. Let's add the `main` function to use the `sendShieldedTransaction` to send a transaction that calls`function transfer(address recipient, uint256 amount)` in the smart contract.

{% hint style="success" %}
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
{% endhint %}

{% code lineNumbers="true" %}

```javascript
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;
});
```

{% endcode %}

6. Run `npx hardhat run scripts/transfer.js --network swisstronik`
7. You should see the transaction receipt object printed in your console 🎉
