Skip to content

Commit

Permalink
feat: Add data rotation to tvl cache by date (#9379)
Browse files Browse the repository at this point in the history
<!--
Before opening a pull request, please read the [contributing
guidelines](https://github.com/pancakeswap/pancake-frontend/blob/develop/CONTRIBUTING.md)
first
-->


<!-- start pr-codex -->

---

## PR-Codex overview
This PR updates the `handleScheduled` function in
`subgraphPoolBackup.ts` to improve error handling and data saving logic.

### Detailed summary
- Refactored the `handleScheduled` function to improve error handling
and data saving logic
- Added a new `logRejectedActions` function for logging rejected actions
- Updated the saving of pools data based on scheduled events

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your
question}`

<!-- end pr-codex -->
  • Loading branch information
chefjackson authored Mar 21, 2024
1 parent efd1cc5 commit 014cd24
Showing 1 changed file with 61 additions and 46 deletions.
107 changes: 61 additions & 46 deletions apis/routing/src/subgraphPoolBackup.ts
Original file line number Diff line number Diff line change
@@ -1,68 +1,83 @@
import { SmartRouter } from '@pancakeswap/smart-router'
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'

import { v3SubgraphProvider } from './provider'
import { SUPPORTED_CHAINS } from './constants'
import { getPoolsObjectName, getPoolsTvlObjectName, getPoolsTvlObjectNameByDate } from './pools'

dayjs.extend(utc)

// eslint-disable-next-line consistent-return
async function handleScheduled(event: ScheduledEvent) {
switch (event.cron) {
case '*/30 * * * *':
logRejectedActions(
await Promise.allSettled(
SUPPORTED_CHAINS.map(async (chainId) => {
const pools = await SmartRouter.getAllV3PoolsFromSubgraph({ chainId, provider: v3SubgraphProvider })
const serializedPools = pools.map((p) => ({
...SmartRouter.Transformer.serializePool(p),
tvlUSD: p.tvlUSD.toString(),
}))
const poolsTvl = pools.map((p) => ({
address: p.address,
tvlUSD: p.tvlUSD.toString(),
}))
await Promise.all([
SUBGRAPH_POOLS.put(getPoolsObjectName(chainId), JSON.stringify(serializedPools), {
httpMetadata: {
contentType: 'application/json',
},
}),
SUBGRAPH_POOLS.put(getPoolsTvlObjectName(chainId), JSON.stringify(poolsTvl), {
httpMetadata: {
contentType: 'application/json',
},
}),
])
}),
),
)
break

case '0 0 * * *': {
for (const chainId of SUPPORTED_CHAINS) {
try {
// eslint-disable-next-line no-await-in-loop
const pools = await SmartRouter.getAllV3PoolsFromSubgraph({ chainId, provider: v3SubgraphProvider })
const serializedPools = pools.map((p) => ({
...SmartRouter.Transformer.serializePool(p),
tvlUSD: p.tvlUSD.toString(),
}))
const poolsTvl = pools.map((p) => ({
address: p.address,
tvlUSD: p.tvlUSD.toString(),
}))
// eslint-disable-next-line no-await-in-loop
await Promise.all([
SUBGRAPH_POOLS.put(getPoolsObjectName(chainId), JSON.stringify(serializedPools), {
httpMetadata: {
contentType: 'application/json',
},
}),
SUBGRAPH_POOLS.put(getPoolsTvlObjectName(chainId), JSON.stringify(poolsTvl), {
httpMetadata: {
contentType: 'application/json',
},
}),
isUTCMidnight(event.scheduledTime)
? SUBGRAPH_POOLS.put(
getPoolsTvlObjectNameByDate(chainId, event.scheduledTime),
JSON.stringify(poolsTvl),
{
httpMetadata: {
contentType: 'application/json',
},
logRejectedActions(
await Promise.allSettled(
SUPPORTED_CHAINS.map(async (chainId) => {
const save = async () => {
const pools = await SmartRouter.getAllV3PoolsFromSubgraph({ chainId, provider: v3SubgraphProvider })
const poolsTvl = pools.map((p) => ({
address: p.address,
tvlUSD: p.tvlUSD.toString(),
}))
await SUBGRAPH_POOLS.put(
getPoolsTvlObjectNameByDate(chainId, event.scheduledTime),
JSON.stringify(poolsTvl),
{
httpMetadata: {
contentType: 'application/json',
},
)
: Promise.resolve(),
])
} catch (e) {
console.error(e)
}
}
},
)
}
const cleanup = () =>
SUBGRAPH_POOLS.delete(
getPoolsTvlObjectNameByDate(chainId, dayjs(event.scheduledTime).subtract(11, 'days').toDate()),
)
logRejectedActions(await Promise.allSettled([save(), cleanup()]))
}),
),
)
break
}
default:
break
}
}

function isUTCMidnight(timestamp: number) {
const date = dayjs(timestamp).utc()
return date.hour() === 0 && date.minute() === 0 && date.second() === 0 && date.millisecond() === 0
function logRejectedActions(results: PromiseSettledResult<any>[]) {
for (const result of results) {
if (result.status === 'rejected') {
console.error(result.reason)
}
}
}

export function setupPoolBackupCrontab() {
Expand Down

0 comments on commit 014cd24

Please sign in to comment.