# Deploy Smart Contracts with Foundry

#### Prerequisites

* Install **Foundry**:

  ```bash
  curl -L <https://foundry.paradigm.xyz> | bash
  foundryup
  ```
* **Node.js & npm** (for optional frontend)
* **Hela Node/Web3 Gateway** running locally or using testnet RPC URL
* **Wallet (Metamask)** configured to connect to Hela RPC

**Check the version:**

```jsx
forge --version
```

### Initialize Foundry Project:

Let’s create a new project:

```bash
forge init hello-hela
cd hello-hela
```

Inside this folder, you now have:

* `src/` → your contracts
* `test/` → your tests

## Write the Smart Contract:

We’ll create a simple **SplitWise app,** a contract where friends can track and settle debts.

Create :(`src/SplitWise.sol`)

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract SplitWise {
    mapping(address => mapping(address => int256)) public debts;

    event ExpenseAdded(address indexed payer, address indexed to, uint256 amount);
    event DebtCleared(address indexed from, address indexed to, uint256 amount);

    // Record an expense
    function addExpense(address friend, uint256 amount) public {
        debts[friend][msg.sender] -= int256(amount);
        debts[msg.sender][friend] += int256(amount);

        emit ExpenseAdded(msg.sender, friend, amount);
    }

    // Check balance between two friends
    function checkBalance(address friend) public view returns (int256) {
        return debts[msg.sender][friend];
    }

    // Clear a debt
    function clearDebt(address friend, uint256 amount) public {
        require(debts[msg.sender][friend] >= int256(amount), "Not enough debt!");
        debts[msg.sender][friend] -= int256(amount);
        debts[friend][msg.sender] += int256(amount);

        emit DebtCleared(msg.sender, friend, amount);
    }
}
```

### Write a Simple Test  (`test/SplitWise.t.sol`)

Tests are super important to confirm things work before spending gas.

```solidity
pragma solidity ^0.8.9;

import "forge-std/Test.sol";
import "../src/SplitWise.sol";

contract SplitWiseTest is Test {
    SplitWise splitwise;
    address alice = address(1);
    address bob = address(2);

    function setUp() public {
        splitwise = new SplitWise();
    }

    function testAddExpense() public {
        vm.prank(alice);
        splitwise.addExpense(bob, 100);

        int256 balance = splitwise.checkBalance(bob);
        assertEq(balance, 100);
    }
}
```

Run the tests:

```bash
forge test
```

***

### Deploy to HeLa

Open `foundry.toml` and add your Hela testnet endpoint:

```toml
[rpc_endpoints]
hela = "<https://rpc.testnet.hela.xyz>"  # replace with actual endpoint
```

Deploy with:

```bash
forge create --rpc-url hela --private-key <YOUR_PRIVATE_KEY> src/SplitWise.sol:SplitWise
```

#### Interact with Your Contract

* Add an expense:

  ```bash
  cast send <CONTRACT_ADDRESS> "addExpense(address,uint256)" <FRIEND_ADDR> 100 --rpc-url hela --private-key <KEY>

  ```
* Check balance:

  ```bash
  cast call <CONTRACT_ADDRESS> "checkBalance(address)" <FRIEND_ADDR> --rpc-url hela

  ```

You’ll see a number:

* Positive → your friend owes you
* Negative → you owe them

## Support :&#x20;

If you encounter any issues during setup or require assistance, please join the [**HeLa Developer Community**](https://discord.gg/NEBtTztJCj) for direct support and guidance.


---

# 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.helalabs.com/build-on-hela/build-on-testnet/deploy-smart-contracts-with-foundry.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.
