Skip to content

Commit

Permalink
Merge pull request #111 from Synthetixio/dev
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
MrX-SNX authored Aug 29, 2024
2 parents 9653f6f + ed2923a commit cd80df6
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 cd80df6

Please sign in to comment.