# 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 ](/swisstronik-docs/development/guides/contract-deployment-hardhat/1.-setting-up-the-hardhat-environment.md)
{% 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 🎉


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.swisstronik.com/swisstronik-docs/development/swisstronikjs-sdk/transaction-code-sample.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
