# index.js Implementation

The file `index.js` that is found in the top-level directory of your unique ID is the main entry point of your lambda function. This file should contain the majority of your JavaScript logic.

### Mandatory exports

The file must export in [CommonJs format](https://nodejs.org/docs/latest/api/modules.html#moduleexports) the function `register` which registers the [execution triggers](/v3/orbs-lambda/step-by-step-overview/index.js-implementation/execution-triggers.md) that the lambda function is listening on.

```javascript
module.exports.register = function(engine) {
  // register all triggers here
}
```

### Importing dependencies

The file may import additional `.js` and `.json` dependencies that must be found in the same directory as the file `index.js` itself (or under a subdirectory next to it).

Importing must use the [CommonJs](https://nodejs.org/docs/latest/api/modules.html#requireid) `require()` syntax.

NPM packages may also be imported, subject to being in the [allowed list](/v3/orbs-lambda/step-by-step-overview/index.js-implementation/allowed-packages.md).

```javascript
const { ContractAbi } = require("./abi.js");

const Config = require("./config.json");

const BigNumber = require("bignumber.js");
```

### Async await

Asynchronous code can and should use the modern `async await` syntax directly.

```javascript
async function doSomething(web3) {
  const contract = new web3.eth.Contract(abi, address);
  const res = await contract.methods.readState();
}
```

## Complete example

The following example monitors an [Aave](https://aave.com/) borrowing position every 10 minutes and if the position is close to liquidation, closes it using a contract that was deployed in advance for this lambda.

```javascript
const BigNumber = require("bignumber.js");

// config
const aaveAbi = [{/* ... */}];
const closingAbi = [{/* ... */}];
const positionAddress = "0xe93C0f419AF19297D320563214Adbb2f28EF4C0c";

// globals
let aaveContract; // the standard Aave contract
let closingContract; // contract for closing Aave positions, deployed for this lambda

async function checkAavePosition(args) {
  if (!aaveContract) aaveContract = new args.web3.eth.Contract(aaveAbi, "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9");
  if (!closingContract) closingContract = new args.web3.eth.Contract(aaveAbi, "0xBB51bD166d68c3DC5860190844Dfe1056Cea3122");
  const position = await aaveContract.methods.getPositionData(positionAddress).call();
  if (new BigNumber(position.healthFactor).dividedBy("1e18").toNumber() < 1.05) {
    await closingContract.methods.closePosition(positionAddress).send();
  }
}

module.exports.register = function(engine) {
  engine.onInterval(checkAavePosition, {
    interval: "10m", 
    network: "ethereum"
  });
}
```


---

# 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.orbs.network/v3/orbs-lambda/step-by-step-overview/index.js-implementation.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.
