# Direct Contract Interaction

### Prerequisites

Ensure that Node.js and npm are installed on your machine.

### Step 1: Install Ethers.js

Use `npm` to install `ethers.js`:

```bash
npm install ethers
```

### Step 2: Connect to the Network that You'd Like to Add Liquidity to

Connect to Ethereum, for example. You can do this using a default provider from ethers, which automatically connects to the Ethereum mainnet:

```javascript
const ethers = require('ethers');
const provider = ethers.getDefaultProvider();
```

### Step 3: Import the Contract ABI and Address

The contract ABI and address will enable `ethers.js` to interact with the contract. Import these values:

```javascript
const contractABI = [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "deposit",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ]; 
const contractAddress = ''  // fill with the relay contract address
```

### Step 4: Create a Contract Instance

Now, using the provider, the contract ABI, and the contract address, you can create a contract instance:

```javascript
const contract = new ethers.Contract(contractAddress, contractABI, provider);
```

### Step 5: Create a Signer

In order to modify the blockchain state, transactions need to be signed. Create a signer from a private key:

```javascript
const privateKey = 'your-private-key';
const wallet = new ethers.Wallet(privateKey);
const signer = wallet.connect(provider);
```

Make sure to replace `'your-private-key'` with your actual private key.

### Step 6: Connect Contract to Signer

Connect the contract instance to the signer:

```javascript
const contractWithSigner = contract.connect(signer);
```

### Step 7: Interact with the Contract

Now that you have a contract instance connected to a signer, you can interact with the contract's functions.

#### Deposit:

```javascript
async function deposit(amount) {
    const transaction = await contractWithSigner.deposit(amount, { value: value });
    const receipt = await transaction.wait();
    console.log(receipt);
}
```

#### Withdraw:

```javascript
async function withdraw(amount) {
    const transaction = await contractWithSigner.withdraw(amount);
    const receipt = await transaction.wait();
    console.log(receipt);
}
```

### ❗️❗️ Please review the following information before implementation❗️❗️&#x20;

* Remember to approve `contract` before `deposit` if you're about to deposit ERC20 token.
* Remember to replace `amount` with the amount you want to deposit or withdraw.
* Remember to set `value` with the same amount as `amount` if you're about to deposit native token.
