Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
d2c1415
Add the 2 tables for slashing withdrawal
surbhit14 Jan 15, 2025
2021b72
Add seedLogsSlashingWithdrawalQueued
surbhit14 Jan 15, 2025
991fa57
Add seedLogsSlashingWithdrawalCompleted
surbhit14 Jan 15, 2025
4227d05
Add seedLogsSlashingWithdrawalQueued and seedLogsSlashingWithdrawalCo…
surbhit14 Jan 15, 2025
cafa47a
Remove the older migration file
surbhit14 Jan 20, 2025
6c720b7
Modify the WithdrawalQueued schema
surbhit14 Jan 20, 2025
8510418
Modify seedQueuedWithdrawals for additional fields
surbhit14 Jan 20, 2025
e0587cd
Add seedQueuedSlashingWithdrawals
surbhit14 Jan 20, 2025
d9b7ab7
Add seedCompletedSlashingWithdrawals
surbhit14 Jan 20, 2025
69b62cd
Add seedQueuedSlashingWithdrawals and seedCompletedSlashingWithdrawal…
surbhit14 Jan 20, 2025
396657d
Add contract for Allocation Manager
surbhit14 Jan 23, 2025
75d99ff
Add schema with new Allocation Manager Event Logs
surbhit14 Jan 23, 2025
38decab
Include the Allocation Manager
surbhit14 Jan 23, 2025
2f9302c
Add the Allocation Manager Event log seeders
surbhit14 Jan 23, 2025
af6682d
Merge branch 'dev' into 329-feat-index-new-eventlogs
surbhit14 Jan 28, 2025
bc785f2
Merge pull request #332 from EigenExplorer/329-feat-index-new-eventlogs
uditdc Jan 31, 2025
a72522d
Add beaconChainSlashingFactor and its event log
surbhit14 Feb 3, 2025
f12f0a7
Add seedLogsBeaconChainSlashingFactor
surbhit14 Feb 3, 2025
c04560c
Add beaconChainSlashingFactor to seedPods
surbhit14 Feb 3, 2025
33f4686
Add seedBeaconChainSlashingFactor
surbhit14 Feb 3, 2025
134fc6b
Add the util functions
surbhit14 Feb 4, 2025
dbb8c73
Modify the withdrawal endpoints
surbhit14 Feb 4, 2025
647dd90
Add seedBeaconChainSlashingFactor and seedLogsBeaconChainSlashingFactor
surbhit14 Feb 4, 2025
a4eb2c1
Modify the log content
surbhit14 Feb 4, 2025
3250b17
Modify the data type
surbhit14 Feb 7, 2025
dc0ad80
Accomodate changes for slashing in withdrawal metrics
surbhit14 Feb 7, 2025
a2ba6b6
Merge pull request #349 from EigenExplorer/slashing/update-api-endpoi…
uditdc Feb 11, 2025
dbbff98
Update the existing event logs
surbhit14 Feb 17, 2025
76f21e4
Add seedLogsAVSOperatorSetOperators
surbhit14 Feb 18, 2025
47236f1
Add seedLogsOperatorSetStrategies
surbhit14 Feb 18, 2025
45dad0e
Schema for OperatorSet and Slashing
surbhit14 Feb 18, 2025
8a5b25c
Add operator foreign key to AvsAllocation
surbhit14 Feb 21, 2025
17b072f
Add seedAllocationDelay
surbhit14 Feb 21, 2025
9238eef
Add seedOperatorSet and seedOperatorSetStrategies
surbhit14 Feb 21, 2025
0f10a56
Add the migration file
surbhit14 Feb 21, 2025
7400bb5
Add avsRegistrar and seeder for it
surbhit14 Feb 24, 2025
be25152
Add seedAvsOperatorSets
surbhit14 Feb 24, 2025
e0a96a2
Add seedOperatorSlashed
surbhit14 Feb 24, 2025
ceab868
Modify the indexes in schema
surbhit14 Feb 24, 2025
483ff6f
Add seedAvsAllocation
surbhit14 Feb 24, 2025
eecd696
Add seeders to index.ts
surbhit14 Feb 24, 2025
2a36aa2
Add seedLogsOperatorMagnitudeUpdated
surbhit14 Feb 26, 2025
f9a8866
Add OperatorStrategyMagnitude to schema
surbhit14 Feb 26, 2025
4011a4e
Modify indexes for eventLogs
surbhit14 Feb 26, 2025
e6abae4
Modify index.ts
surbhit14 Feb 26, 2025
5df3b2e
Add seedOperatorMagnitude
surbhit14 Feb 26, 2025
5f9f79d
Update the DEALLOCATION_DELAY values
surbhit14 Feb 27, 2025
b2a9440
Add sorting by effectBlock
surbhit14 Feb 27, 2025
30f4e39
Merge pull request #353 from EigenExplorer/330-feat---new-data-tables
uditdc Feb 27, 2025
bb1d328
Remove the unnecessary log
surbhit14 Mar 3, 2025
4050e07
Add created/updated field to model OperatorStrategyMagnitude
surbhit14 Mar 3, 2025
b005008
Modify seeder for new created/updated fields added to schema
surbhit14 Mar 3, 2025
62b6d72
Add use of dbTransactions for AVS creation
surbhit14 Mar 4, 2025
e68e0ca
Add routes for AVS
surbhit14 Mar 4, 2025
08fa606
Add rotues for Operators
surbhit14 Mar 4, 2025
414eb2e
Add the OperatorSet Schemas
surbhit14 Mar 4, 2025
183103a
Add the avs route functions
surbhit14 Mar 4, 2025
51738c9
Add the operator functions
surbhit14 Mar 4, 2025
73e1f8c
Optimise the relevant seeders
surbhit14 Mar 6, 2025
d6e4e86
Merge pull request #357 from EigenExplorer/354-feat---api-routes-for-…
uditdc Mar 6, 2025
cd5941d
Add AllocationManager to eigenContracts
surbhit14 Mar 6, 2025
9a41b82
Merge pull request #359 from EigenExplorer/fix-slashing/types
uditdc Mar 6, 2025
42626bc
Fix metrics type undefined checks
uditdc Mar 6, 2025
c25eddf
Fix the allocation-delay fk issue
surbhit14 Mar 10, 2025
05f0476
Merge pull request #360 from EigenExplorer/patch/allocation-delay-fk-…
uditdc Mar 10, 2025
ba979eb
Update schema for Slashing shares update
surbhit14 Mar 10, 2025
e0b6cbc
Add the relevant event logs seeders
surbhit14 Mar 10, 2025
f799b71
Add depositScalingFactor to seedStakers
surbhit14 Mar 11, 2025
4f29a06
Add slashedShares to seedOperatorShares
surbhit14 Mar 11, 2025
2ed58e2
Add patch for avsRegistrar
surbhit14 Mar 11, 2025
60a3bb4
Add slashedShares to response
surbhit14 Mar 11, 2025
461e7d0
Merge pull request #363 from EigenExplorer/patch/seeder
uditdc Mar 11, 2025
4f3364d
Add calculation for scaledShares
surbhit14 Mar 11, 2025
c3b562c
Add withdrawableShares calculation for Stakers
surbhit14 Mar 11, 2025
2f82076
Rename depositShares to shares
surbhit14 Mar 11, 2025
20f8fbb
Add the previous changes to documentation
surbhit14 Mar 12, 2025
65a2345
Add route for getAvsOperatorSetOperators
surbhit14 Mar 19, 2025
f221b0c
Add changes for initial release
surbhit14 Mar 19, 2025
3be2dda
Merge pull request #368 from EigenExplorer/add-maxInt-case-to-endpoints
uditdc Mar 19, 2025
62807cf
Merge pull request #365 from EigenExplorer/include-previous-doc-changes
uditdc Mar 19, 2025
33c57f3
Change operator-set to operator-sets in routes
surbhit14 Mar 21, 2025
29aaf75
Merge pull request #369 from EigenExplorer/fix-the-route-path
uditdc Mar 21, 2025
92306a1
Modify the query schemas
surbhit14 Mar 21, 2025
2419fa8
Add the response schemas
surbhit14 Mar 22, 2025
5a6e422
Add the avs sub-routes
surbhit14 Mar 22, 2025
6fe604d
Add the operator sub-routes
surbhit14 Mar 22, 2025
ed06944
Modify openApi
surbhit14 Mar 22, 2025
4edf747
Merge pull request #370 from EigenExplorer/add-new-routes-to-docs
uditdc Mar 25, 2025
7b81a64
Add currentMagnitude and pendingDiff
surbhit14 Mar 25, 2025
13307ae
Add support for currentMagnitude and pendingDiff
surbhit14 Mar 27, 2025
5054631
Add support for updateAvsAllocationMagnitudes seeder
surbhit14 Mar 27, 2025
e742e0a
Code cleanup
surbhit14 Mar 28, 2025
c317bc1
Change operatorSetId type to BigInt
surbhit14 Apr 4, 2025
dc4fec5
Modify the seeders for changing operatorSetId to bigInt
surbhit14 Apr 4, 2025
0dbbddb
Add new migration file
surbhit14 Apr 4, 2025
89401a8
Add the new line
surbhit14 Apr 4, 2025
c2ad344
Merge pull request #379 from EigenExplorer/fix-type-of-operatorSet-id
uditdc Apr 15, 2025
48b835a
Merge pull request #361 from EigenExplorer/358-feat---shares-update-p…
uditdc Apr 15, 2025
8de2316
Merge branch 'feature/slashing-upgrade-phase-2' into add-support-for-…
uditdc Apr 15, 2025
0788486
Merge pull request #371 from EigenExplorer/add-support-for-pendingDiff
uditdc Apr 15, 2025
a0c7de5
Merge pull request #392 from EigenExplorer/feature/slashing-upgrade-p…
uditdc May 6, 2025
e2ac2a4
Merge branch 'dev' into feature/slashing-upgrade
uditdc May 15, 2025
188374a
Avs allocation operator id check fix
uditdc May 15, 2025
1cab18c
Merge pull request #405 from EigenExplorer/hotfix/avs-allocation-oper…
uditdc May 15, 2025
120eb33
Modify seeding frequency slashing branch
uditdc May 15, 2025
0db540b
Merge pull request #406 from EigenExplorer/fix/modify-seeding-frequen…
uditdc May 15, 2025
113fff7
Consolidate eigen full data and logs
uditdc May 15, 2025
61d7569
Merge pull request #407 from EigenExplorer/fix/modify-seeding-frequen…
uditdc May 15, 2025
ee03691
Merge branch 'dev' into feature/slashing-upgrade
uditdc Jul 28, 2025
a104ac8
Fix async forEach bug in withdrawal metrics seeder
uditdc Jul 28, 2025
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
352 changes: 352 additions & 0 deletions packages/api/src/routes/avs/avsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ import {
RewardsEventQuerySchema
} from '../../schema/zod/schemas/eventSchemas'
import { MinTvlQuerySchema } from '../../schema/zod/schemas/minTvlQuerySchema'
import {
AvsAllocationQuerySchema,
AvsOperatorSetParamsSchema,
AvsOperatorSetQuerySchema
} from '../../schema/zod/schemas/operatorSetSchemas'
import {
AvsAdditionalInfoSchema,
AvsAdditionalInfoKeys,
Expand Down Expand Up @@ -973,6 +978,353 @@ export async function getAvsRegistrationEvents(req: Request, res: Response) {
}

/**
* Function for route /avs/:avsAddress/operator-sets
* Fetches and returns a list of Operator Sets under an AVS
* @param req
* @param res
* @returns
*/
export async function getAvsOperatorSets(req: Request, res: Response) {
const paramCheck = EthereumAddressSchema.safeParse(req.params.address)
if (!paramCheck.success) return handleAndReturnErrorResponse(req, res, paramCheck.error)

const queryCheck = PaginationQuerySchema.safeParse(req.query)

if (!queryCheck.success) {
return handleAndReturnErrorResponse(req, res, queryCheck.error)
}

try {
const { address } = req.params
const { skip, take } = queryCheck.data

const operatorSets = await prisma.operatorSet.findMany({
where: { avsAddress: address.toLowerCase() },
skip,
take
})

const operatorSetCount = await prisma.operatorSet.count({
where: {
avsAddress: address.toLowerCase()
}
})

res.send({
data: operatorSets,
meta: {
total: operatorSetCount,
skip,
take
}
})
} catch (error) {
handleAndReturnErrorResponse(req, res, error)
}
}

/**
* Function for route /avs/:avsAddress/operator-set/:operatorSetId
* Fetches and returns details for a specific Operator Set
* @param req
* @param res
* @returns
*/
export async function getAvsOperatorSetDetails(req: Request, res: Response) {
const paramCheck = AvsOperatorSetParamsSchema.safeParse(req.params)
if (!paramCheck.success) return handleAndReturnErrorResponse(req, res, paramCheck.error)

try {
const { address, operatorSetId } = req.params

if (operatorSetId === '4294967295') {
const avs = await prisma.avs.findUnique({
where: { address: address.toLowerCase() },
select: { totalStakers: true, totalOperators: true, restakeableStrategies: true }
})

if (!avs) {
throw new EigenExplorerApiError({
code: 'unprocessable_entity',
message: 'invalid_string: Invalid AVS Address'
})
}

return res.send({
avsAddress: address.toLowerCase(),
operatorSetId,
strategies: avs.restakeableStrategies ?? [],
totalOperators: avs.totalOperators,
totalStakers: avs.totalStakers,
createdAtBlock: null,
updatedAtBlock: null,
createdAt: null,
updatedAt: null,
allocations: null
})
}

let totalOperators = 0
let totalStakers = 0

const operatorSet = await prisma.operatorSet.findUnique({
where: {
avsAddress_operatorSetId: { avsAddress: address, operatorSetId: Number(operatorSetId) }
},
include: { allocations: true }
})

if (!operatorSet) {
throw new EigenExplorerApiError({
code: 'unprocessable_entity',
message: 'invalid_string: Invalid Operator Set ID'
})
}

totalOperators = await prisma.avsOperatorSet.count({
where: { avsAddress: address, operatorSetId: Number(operatorSetId), registered: true }
})

const operators = await prisma.operator.findMany({
where: {
avsOperatorSets: {
some: { avsAddress: address, operatorSetId: Number(operatorSetId), registered: true }
}
},
select: { totalStakers: true }
})

totalStakers = operators.reduce((sum, operator) => sum + operator.totalStakers, 0)

res.send({
...operatorSet,
totalOperators,
totalStakers,
allocations: operatorSet.allocations.map(
({
avsAddress,
operatorSetId,
createdAtBlock,
updatedAtBlock,
createdAt,
updatedAt,
...allocation
}) => ({
...allocation
})
)
})
} catch (error) {
handleAndReturnErrorResponse(req, res, error)
}
}

/**
* Function for route /avs/:avsAddress/operator-set/:operatorSetId/operators
* Fetches and returns details of operators for a specific Operator Set
* @param req
* @param res
* @returns
*/
export async function getAvsOperatorSetOperators(req: Request, res: Response) {
const paramCheck = AvsOperatorSetParamsSchema.safeParse(req.params)
if (!paramCheck.success) return handleAndReturnErrorResponse(req, res, paramCheck.error)

const queryCheck = PaginationQuerySchema.safeParse(req.query)
if (!queryCheck.success) {
return handleAndReturnErrorResponse(req, res, queryCheck.error)
}

try {
const { address, operatorSetId } = req.params
const { skip, take } = queryCheck.data

const avs = await prisma.avs.findUnique({
where: { address: address.toLowerCase() },
include: { operators: { where: { isActive: true } } }
})

if (!avs) {
throw new EigenExplorerApiError({
code: 'unprocessable_entity',
message: 'invalid_string: Invalid AVS Address'
})
}

let operatorAddresses: string[] = []

if (operatorSetId === '4294967295') {
operatorAddresses = avs.operators.map((o) => o.operatorAddress)
} else {
const operatorSet = await prisma.operatorSet.findUnique({
where: {
avsAddress_operatorSetId: { avsAddress: address, operatorSetId: Number(operatorSetId) }
},
include: { avsOperatorSets: true }
})

if (!operatorSet) {
throw new EigenExplorerApiError({
code: 'unprocessable_entity',
message: 'invalid_string: Invalid Operator Set ID'
})
}

operatorAddresses = operatorSet.avsOperatorSets
.filter((o) => o.registered)
.map((o) => o.operatorAddress)
}

const total = await prisma.operator.count({
where: { address: { in: operatorAddresses } }
})

const operatorsRecords = await prisma.operator.findMany({
where: { address: { in: operatorAddresses } },
skip,
take
})

const data = operatorsRecords.map((operator) => ({
...operator,
shares: [],
tvl: {},
stakers: undefined,
metadataUrl: undefined,
isMetadataSynced: undefined,
tvlEth: undefined,
sharesHash: undefined
}))

res.send({
data,
meta: {
total,
skip,
take
}
})
} catch (error) {
handleAndReturnErrorResponse(req, res, error)
}
}

/**
* Function for route /avs/:avsAddress/allocations
* Fetches and returns Allocations under an AVS.
* @param req
* @param res
* @returns
*/
export async function getAvsAllocations(req: Request, res: Response) {
const paramCheck = EthereumAddressSchema.safeParse(req.params.address)
if (!paramCheck.success) return handleAndReturnErrorResponse(req, res, paramCheck.error)

const queryCheck = PaginationQuerySchema.and(AvsAllocationQuerySchema).safeParse(req.query)

if (!queryCheck.success) {
return handleAndReturnErrorResponse(req, res, queryCheck.error)
}

try {
const { address } = req.params
const { skip, take } = queryCheck.data

const { operatorAddress, operatorSetId, strategyAddress } = queryCheck.data
const allocations = await prisma.avsAllocation.findMany({
where: {
avsAddress: address.toLowerCase(),
...(operatorAddress && { operatorAddress: operatorAddress.toLowerCase() }),
...(operatorSetId && { operatorSetId }),
...(strategyAddress && { strategyAddress: strategyAddress.toLowerCase() })
},
skip,
take
})

const allocationCount = await prisma.avsAllocation.count({
where: {
avsAddress: address.toLowerCase(),
...(operatorAddress && { operatorAddress: operatorAddress.toLowerCase() }),
...(operatorSetId && { operatorSetId }),
...(strategyAddress && { strategyAddress: strategyAddress.toLowerCase() })
}
})

res.send({
data: allocations,
meta: {
total: allocationCount,
skip,
take
}
})
} catch (error) {
handleAndReturnErrorResponse(req, res, error)
}
}

/**
* Function for route /avs/:address/slashed
* Fetches and returns slashing events for an AVS
* @param req
* @param res
* @returns
*/
export async function getAvsSlashed(req: Request, res: Response) {
const paramCheck = EthereumAddressSchema.safeParse(req.params.address)
if (!paramCheck.success) {
return handleAndReturnErrorResponse(req, res, paramCheck.error)
}

const queryCheck = PaginationQuerySchema.and(AvsOperatorSetQuerySchema).safeParse(req.query)
if (!queryCheck.success) {
return handleAndReturnErrorResponse(req, res, queryCheck.error)
}

try {
const { address } = req.params
const { skip, take, operatorAddress, operatorSetId } = queryCheck.data

const slashingRecords = await prisma.avsOperatorSlashed.findMany({
where: {
avsAddress: address.toLowerCase(),
...(operatorAddress && { operatorAddress: operatorAddress.toLowerCase() }),
...(operatorSetId && { operatorSetId })
},
skip,
take
})

const data = slashingRecords.map(({ id, ...event }) => ({
...event,
id: undefined
}))

const total = await prisma.avsOperatorSlashed.count({
where: {
avsAddress: address.toLowerCase(),
...(operatorAddress && { operatorAddress: operatorAddress.toLowerCase() }),
...(operatorSetId && { operatorSetId })
}
})

res.send({
data,
meta: {
total,
skip,
take
}
})
} catch (error) {
handleAndReturnErrorResponse(req, res, error)
}
}

/**
* Function for route /avs/:address/invalidate-metadata
* Protected route to invalidate the metadata of a given AVS
* Function for route /avs/:address/get-metadata
* Protected route to return a given Avs metadata from the new `AvsAdditionalInfo`, instead of from the legacy `AvsCuratedMetadata`
* Differs from using `withMetadata` flag -- returns Avs regardless of `isVisible` or existence of `curatedMetadata`
Expand Down
Loading