Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor & add perps support #10

Merged
merged 2 commits into from
Jul 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 18 additions & 106 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,112 +1,24 @@
## Title:
<!--please follow this pattern for PR title "protocol_name : protocol_category : other comments". Example - "uniswap: dex : tvl by user"-->
- [ ] Pattern for PR title "protocol_name : protocol_category : other comments". Example - "uniswap: dex : tvl by user"
# Protocol Checklist

## Checklist before requesting a review
1. **index.ts file**
Welcome! Thank you for submitting a PR with your protocol data. The [README](../README.md) should serve as a general guide for you. But please follow this checklist to ensure you have everything.

- [ ] **Contains function**
- [ ] Read the [README](../README.md) and explore the other adapters (see `adapters/example`)
- [ ] See the schema that we are requesting based on your protocol type (currently supporting, lending and perps)
- [ ] Submit a PR with progress with a new folder containing your adapter (in `adapter/{protocol-name}`)
- [ ] Build your adapter
- [ ] Ensure your `package.json` has a `start` command that executes the proper code
- [ ] Follow the schema/output format, standard input file format, and standard function inputs
- [ ] Ensure the adapter runs and executes in the proper workflow (see: `How to execute this project?` in [README](../README.md))
- [ ] QA your data
- [ ] Notify our team when you are ready for a review!

```export const getUserTVLByBlock = async (blocks: BlockData) => {
const { blockNumber, blockTimestamp } = blocks
// Retrieve data using block number and timestamp
// YOUR LOGIC HERE

return csvRows
## Protocol Notes

};
```
- [ ] **getUserTVLByBlock function takes input with this schema**

```
interface BlockData {
blockNumber: number;
blockTimestamp: number;
}
```
- [ ] **getUserTVLByBlock function returns output in this schema**
### Adapter Logic Flow
<!--- Please note the high level flow / architecture of your adapter -->

```
const csvRows: OutputDataSchemaRow[] = [];
### QA Notes
<!--- Please provide any notes or unique cases from your QA -->

type OutputDataSchemaRow = {
block_number: number; //block_number which was given as input
timestamp: number; // block timestamp which was given an input, epoch format
user_address: string; // wallet address, all lowercase
token_address: string; // token address all lowercase
token_balance: bigint; // token balance, raw amount. Please dont divide by decimals
token_symbol: string; //token symbol should be empty string if it is not available
usd_price: number; //assign 0 if not available
};
```
- [ ] **contains function**

```
const readBlocksFromCSV = async (filePath: string): Promise<BlockData[]> => {
const blocks: BlockData[] = [];

await new Promise<void>((resolve, reject) => {
fs.createReadStream(filePath)
.pipe(csv()) // Specify the separator as '\t' for TSV files
.on('data', (row) => {
const blockNumber = parseInt(row.number, 10);
const blockTimestamp = parseInt(row.timestamp, 10);
if (!isNaN(blockNumber) && blockTimestamp) {
blocks.push({ blockNumber: blockNumber, blockTimestamp });
}
})
.on('end', () => {
resolve();
})
.on('error', (err) => {
reject(err);
});
});

return blocks;
};

```
- [ ] **has this code**

```
readBlocksFromCSV('hourly_blocks.csv').then(async (blocks: any[]) => {
console.log(blocks);
const allCsvRows: any[] = [];

for (const block of blocks) {
try {
const result = await getUserTVLByBlock(block);
allCsvRows.push(...result);
} catch (error) {
console.error(`An error occurred for block ${block}:`, error);
}
}
await new Promise((resolve, reject) => {
const ws = fs.createWriteStream(`outputData.csv`, { flags: 'w' });
write(allCsvRows, { headers: true })
.pipe(ws)
.on("finish", () => {
console.log(`CSV file has been written.`);
resolve;
});
});

}).catch((err) => {
console.error('Error reading CSV file:', err);
});
```
- [ ] **Your code is handling Pagination to make sure all data for a given block is returned**

2. **Output data**
- [ ] Created a folder test on the same level as src and put sample outputData.csv with 15-20 records generated by your code
- [ ] Data is returned for underlying tokens only. Not for special tokens (lp/veTokens etc)
- [ ] Follows the exact sequence mentioned in OutputDataSchemaRow . This is needed as we want same column ordering in output csv
- Value of each field is :
- [ ] block_number *is same as input block number. This signifies TVL is as of this block_number.*
- [ ] timestamp is same as input timestamp. This signifies TVL is as of this timestamp. It is in epoch format.
- [ ] user_address is in lowercase
- [ ] token_address is in lowercase
- [ ] token_balance is in raw amount. Please dont divide by decimals.
- [ ] token_symbol value if present, empty string if value is not available.
- [ ] usd_price if value is available, 0 if value is not available.
### General Notes
<!--- Please dictate anything we should know about your adapter -->
Loading
Loading