Skip to content

Commit

Permalink
return distinct collateral types with no limit
Browse files Browse the repository at this point in the history
update v3 route schema and table names

add routes for multi-collateral

feat: added votes parsing

ref: using alpine

.

Delete redis.env

done

add mainnet

typo

feat: added votes parsing

Delete api.env

Delete redis.env

ref: updated git ignore

add mainnet

typo

ref: reset docker dev file

feat: added example files

ref: renaming router

return distinct collateral types with no limit

update v3 route schema and table names

update v3 route schema and table names

add routes for multi-collateral

feat: added votes parsing

ref: using alpine

.

Delete redis.env

done

add mainnet

typo

feat: added votes parsing

Delete api.env

Delete redis.env

ref: updated git ignore

add mainnet

typo

ref: reset docker dev file

feat: added example files

ref: renaming router
  • Loading branch information
jmzwar authored and MrX-SNX committed Aug 29, 2024
1 parent 9653f6f commit ed2923a
Show file tree
Hide file tree
Showing 6 changed files with 210 additions and 32 deletions.
File renamed without changes.
1 change: 0 additions & 1 deletion redis.env

This file was deleted.

1 change: 1 addition & 0 deletions redis.envexample
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
REDIS_HOST_PASSWORD=
62 changes: 31 additions & 31 deletions src/routes/v3/mainnet/sc-pool-apy-all.js
Original file line number Diff line number Diff line change
Expand Up @@ -167,39 +167,39 @@ async function fetchDataFromPostgres() {
log.debug('[v3EthSCPoolAPYAll] Fetching data from postgres..');
const queryResult = await postgresClient.query(
`WITH latest_records AS (
SELECT DISTINCT ON (collateral_type)
ts,
pool_id,
collateral_type,
collateral_value,
debt,
hourly_issuance,
hourly_pnl,
cumulative_pnl,
cumulative_issuance,
rewards_usd,
hourly_pnl_pct,
hourly_rewards_pct,
apr_24h,
apy_24h,
apr_7d,
apy_7d,
apr_28d,
apy_28d,
apr_24h_pnl,
apy_24h_pnl,
apr_7d_pnl,
apy_7d_pnl,
apr_28d_pnl,
apy_28d_pnl,
apr_24h_rewards,
apy_24h_rewards,
apr_7d_rewards,
apy_7d_rewards,
apr_28d_rewards,
SELECT DISTINCT ON (collateral_type)
ts,
pool_id,
collateral_type,
collateral_value,
debt,
hourly_issuance,
hourly_pnl,
cumulative_pnl,
cumulative_issuance,
rewards_usd,
hourly_pnl_pct,
hourly_rewards_pct,
apr_24h,
apy_24h,
apr_7d,
apy_7d,
apr_28d,
apy_28d,
apr_24h_pnl,
apy_24h_pnl,
apr_7d_pnl,
apy_7d_pnl,
apr_28d_pnl,
apy_28d_pnl,
apr_24h_rewards,
apy_24h_rewards,
apr_7d_rewards,
apy_7d_rewards,
apr_28d_rewards,
apy_28d_rewards
FROM prod_eth_mainnet.fct_core_apr_eth_mainnet
WHERE pool_id = 1
WHERE pool_id = 1
ORDER BY collateral_type, ts DESC
)
SELECT * FROM latest_records
Expand Down
175 changes: 175 additions & 0 deletions src/routes/v3/snax-testnet/votes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
const express = require('express');
const router = express.Router();
const { log, postgresClient, getCache, setCache } = require('../../../utils');

const cacheKey = 'snax-votes';

fetchDataFromPostgres();
const cacheTime =
((process.env.CACHE_TIME =
typeof process.env.CACHE_TIME === 'string'
? parseInt(process.env.CACHE_TIME)
: process.env.CACHE_TIME) -
30) *
1000;
setInterval(fetchDataFromPostgres, cacheTime < 30000 ? 30000 : cacheTime);

/**
* @openapi
* /v3/snax-testnet/votes:
* get:
* tags:
* - v3
* description: Returns SNX buyback details on Base.
* responses:
* 200:
* description: Successful response.
* content:
* application/json:
* schema:
* type: array
* items:
* type: object
* properties:
* eventName:
* type: string
* example: "VoteRecorded"
* chainId:
* type: number
* example: "13001"
* epochId:
* type: number
* example: "1"
* voter:
* type: string
* example: "0xc3Cf311e04c1f8C74eCF6a795Ae760dc6312F345"
* blockTimestamp:
* type: number
* example: "1231231231"
* id:
* type: string
* example: "093890428092342034-dsfb3-000000"
* transactionHash:
* type: string
* example: "0xbb9982fbae46a551f5e503a059251b51fdb2bc5b06c13ca15db8a61785b8d095"
* votingPower:
* type: string
* example: "10"
* blockNumber:
* type: number
* example: "580095"
* candidates:
* type: array
* items:
* type: string
* example: ["0x98591879709e2e3106941C818CBD94eD29475d1f"]
* contract:
* type: string
* example: "0xbc85f11300a8ef619592fd678418ec4ef26fbdfd"
* 401:
* description: Unauthorized.
* 403:
* description: You have been banned by WAF.
* 429:
* description: Too many requests, you're being rate-limited.
* 5XX:
* description: Service unavailable.
* default:
* description: Unexpected error.
*/

router.get('/', async (req, res, next) => {
try {
log.debug('Checking cache..');
const cachedResponse = await getCache(cacheKey);
if (cachedResponse) {
log.debug('Cache found');
res.json(cachedResponse);
} else {
log.debug('Cache not found, executing..');
const responseData = await fetchDataFromPostgres();
res.json(responseData);
}
} catch (error) {
log.error(`[v3SnaxVote] Error: ${error.message}`);
next(error);
}
});

module.exports = router;

async function fetchDataFromPostgres() {
log.debug('[v3SnaxVote] Fetching data from postgres..');
const queryResultVotesCasted = await postgresClient.query(
`select *
from prod_raw_snax_testnet.gov_vote_recorded_snax_testnet;`,
);

const queryResultVotesWithdrawn = await postgresClient.query(
`select *
from prod_raw_snax_testnet.gov_vote_withdrawn_snax_testnet;`,
);

const votesCasted = queryResultVotesCasted.rows.map(parseAndRenameKeys);
const votesWithdrawn = queryResultVotesWithdrawn.rows.map(parseAndRenameKeys);

const allVotes = votesCasted
.concat(votesWithdrawn)
.sort((a, b) => a.blockNumber - b.blockNumber)
.reduce((cur, next) => {
if (cur[next.epochId]) {
if (next.eventName === 'VoteWithdrawn') {
const previousVoteIndex = cur[next.epochId].findIndex((vote) => {
return vote.contract === next.contract && vote.voter === next.voter;
});
if (previousVoteIndex !== -1) {
cur[next.epochId].splice(previousVoteIndex, 1);
} else {
console.error(
'Could not find previous vote',
cur[next.epochId],
next,
);
}
} else {
const previousVoteIndex = cur[next.epochId].findIndex(
(vote) =>
vote.contract === next.contract && vote.voter === next.voter,
);
if (previousVoteIndex !== -1) {
cur[next.epochId].splice(previousVoteIndex, 1);
}
cur[next.epochId].push(next);
}
} else {
cur[next.epochId] = [next];
}
return cur;
}, {});

const responseData = allVotes;
log.debug('[v3SnaxVote] Setting cache..');
await setCache(cacheKey, responseData, 60);
return responseData;
}

function toCamelCase(str) {
return str.replace(/([-_][a-z])/gi, (group) =>
group.toUpperCase().replace('-', '').replace('_', ''),
);
}

function parseAndRenameKeys(obj) {
const newObj = {};
for (const key in obj) {
const camelCaseKey = toCamelCase(key);
if (key === 'block_timestamp') {
newObj[camelCaseKey] = Date.parse(obj[key]);
} else if (key === 'epoch_id' || key === 'chain_id') {
newObj[camelCaseKey] = Number(obj[key]);
} else {
newObj[camelCaseKey] = obj[key];
}
}
return newObj;
}
3 changes: 3 additions & 0 deletions src/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ redisClient.on('ready', () => {
const v3MainnetScPoolAPYAllRouter = require('./routes/v3/mainnet/sc-pool-apy-all.js');
app.use('/v3/mainnet/sc-pool-apy-all', v3MainnetScPoolAPYAllRouter);

const v3SnaxTestnetVotesRouter = require('./routes/v3/snax-testnet/votes.js');
app.use('/v3/snax-testnet/votes', v3SnaxTestnetVotesRouter);

log.debug('[Express] Starting server..');
const port =
typeof process.env.API_PORT === 'string'
Expand Down

0 comments on commit ed2923a

Please sign in to comment.