Skip to main content

8. Create snapshot tests

Overview

The final step is to create tests to validate the adapter's results and ensure future changes don't cause issues. Within your protocol's folder, you'll find a tests directory and a file /packages/adapters-library/src/adapters/<protocol-id>/tests/testCases.ts that exports an array of test cases.

For each test case, you must specify the chain and method. Optionally, you can include a key to identify the test case, but this is only necessary if you're writing multiple tests for the same method and chain. For more details, refer to the following sub-sections.

After completing your testCases.ts file, run the following command to generate the snapshots for those tests.

npm run build-snapshots -- -p <protocol-id>

You can then verify the validity of those snapshots by running:

npm run test:integration --protocol=protocol-id

Positions

To get a snapshot of the positions, you need to set method: 'positions' and provide an input field with the userAddress. Optionally, you can specify a blockNumber, but this is not required, and the latest will be used and recorded if it's left empty. This will run for all the products of this protocol.

For instance:

{
chainId: Chain.Ethereum,
method: "positions",
input: {
userAddress: "0x161D61e30284A33Ab1ed227beDcac6014877B3DE",
},
}

Profits

To get a snapshot of the profits, you need to set method: 'profits' and provide an input field with the userAddress and, optionally, timePeriod, which will default to one day if left empty. Optionally, you can specify a blockNumber, but this is not required, and the latest will be used and recorded if it's left empty. This will run for all the products of this protocol.

For instance:

{
chainId: Chain.Ethereum,
method: "deposits",
input: {
fromBlock: 198188138,
toBlock: 200597430,
userAddress: "0xbc0a54c02a1e80c8e25e8173a8a80baf116205b5",
protocolTokenAddress: "0x3bAa857646e5A0B475E75a1dbD38E7f0a6742058",
productId: "supply",
},
}

Deposits/Withdrawals/Repays/Borrows

To get a snapshot of any of these methods, set method: 'deposits' | 'withdrawals' | 'repays' | 'borrows'. The input field of these methods requires additional parameters to work, including userAddress, fromBlock, toBlock, protocolTokenAddress, and productId.

For instance:

{
chainId: Chain.Ethereum,
method: "deposits",
input: {
fromBlock: 198188138,
toBlock: 200597430,
userAddress: "0xbc0a54c02a1e80c8e25e8173a8a80baf116205b5",
protocolTokenAddress: "0x3bAa857646e5A0B475E75a1dbD38E7f0a6742058",
productId: "supply",
},
}

TVL

To get a snapshot of the TVL implementation, set method: 'tvl' and specify the protocol tokens with filterProtocolToken: ['protocol-token-address1', 'protocol-token-address2']. Optionally, you can specify a blockNumber`, but this is not required, and the latest will be used and recorded if it's left empty. This will run for all the products of this protocol.

For instance:

{
chainId: Chain.Ethereum,
method: "tvl",
filterProtocolTokens: ["0x3bAa857646e5A0B475E75a1dbD38E7f0a6742058"],
}