8000 Reporter API by martinkersner · Pull Request #432 · Bisonai/orakl · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Reporter API #432

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

Merged
merged 40 commits into from
Mar 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
3bb1f18
feat: Reporter API
martinkersner Mar 22, 2023
9f810c0
feat: Pass tests
martinkersner Mar 22, 2023
d5ce708
feat: Reporter service test
martinkersner Mar 22, 2023
afda0ac
feat: Orakl Network CLI Reporter
martinkersner Mar 22, 2023
61ace09
fix: Update feature list description for reporter
martinkersner Mar 22, 2023
8e33c43
chore: Remove empty lines
martinkersner Mar 22, 2023
ffeb819
fix: eslint listener state
martinkersner Mar 22, 2023
962c5c1
chore: typo comment
martinkersner Mar 22, 2023
0a61db8
feat: Add API layer for Orakl Network Core Reporter
martinkersner Mar 22, 2023
1822f77
fix: Define a RedisClientType in listener state
martinkersner Mar 22, 2023
0da4cc8
feat: Utilize predefiend service names
martinkersner Mar 22, 2023
fb50896
chore: Listener refactoring
martinkersner Mar 22, 2023
0ee84ee
feat: Orakl Reporter state
martinkersner Mar 22, 2023
ca2f828
feat: Remove & refresh reporter state
martinkersner Mar 22, 2023
43564dc
feat: Load reporters by `oracleAddress` in Data Feed
martinkersner Mar 22, 2023
3f9cbba
feat: Define unique name over columns in Reporter
martinkersner Mar 22, 2023
81b6f0d
chore: Move `shouldReport` to Orakl Fetcher
martinkersner Mar 22, 2023
3a1ba3d
chore: Add comments
martinkersner Mar 22, 2023
cffe200
chore: Add comments
martinkersner Mar 23, 2023
2c80856
fix: reporter test
martinkersner Mar 23, 2023
24f68ee
fix: Add await for send transaction in test
martinkersner Mar 23, 2023
3553b5b
Revert "fix: Add await for send transaction in test"
martinkersner Mar 23, 2023
a495f5f
feat: Reporter watchman
martinkersner Mar 23, 2023
a29df9c
feat: Orakl CLI: active, active, deactivate
martinkersner Mar 23, 2023
6c9c549
fix: Access `oracleAddress` from Reporter
martinkersner Mar 23, 2023
d1816f6
feat: Remove deadlock in data feeed
martinkersner Mar 23, 2023
e4a2896
feat: Orakl CLI Reporte `refresh` option
martinkersner Mar 23, 2023
e837db8
fix: Add `await` for listener watchman launch
martinkersner Mar 23, 2023
d86f270
chore: Update comment for `removeDeadlock` function
martinkersner Mar 23, 2023
80041f9
fix: Try KAS node
martinkersner Mar 23, 2023
984d69d
fix: Comment caver test
martinkersner Mar 23, 2023
6b2a974
fix: Send an empty test
martinkersner Mar 23, 2023
01918b0
fix: fake test
martinkersner Mar 23, 2023
a708cd8
fix: another way of faking test
martinkersner Mar 23, 2023
1897e66
fix: Hide another test
martinkersner Mar 23, 2023
4be0a11
fix: run caver test again, remove reporter tests in GA
martinkersner Mar 23, 2023
85a1dcf
chore: Fix comments
martinkersner Mar 23, 2023
bd6ca8c
chore: Remove semicolon
martinkersner Mar 23, 2023
d394e63
fix: Use accountId=1 for VRF demo request
martinkersner Mar 23, 2023
3af7c36
fix: Change naming of RequestResponseConsumerMock
martinkersner Mar 23, 2023
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
17 changes: 17 additions & 0 deletions api/prisma/migrations/20230322020426_reporter/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
-- CreateTable
CREATE TABLE "reporters" (
"reporter_id" BIGSERIAL NOT NULL,
"address" VARCHAR(42) NOT NULL,
"privateKey" VARCHAR(66) NOT NULL,
"oracleAddress" VARCHAR(42) NOT NULL,
"chain_id" BIGINT NOT NULL,
"service_id" BIGINT NOT NULL,

CONSTRAINT "reporters_pkey" PRIMARY KEY ("reporter_id")
);

-- AddForeignKey
ALTER TABLE "reporters" ADD CONSTRAINT "reporters_chain_id_fkey" FOREIGN KEY ("chain_id") REFERENCES "chains"("chain_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "reporters" ADD CONSTRAINT "reporters_service_id_fkey" FOREIGN KEY ("service_id") REFERENCES "services"("service_id") ON DELETE RESTRICT ON UPDATE CASCADE;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
Warnings:

- A unique constraint covering the columns `[address,chain_id,service_id]` on the table `reporters` will be added. If there are existing duplicate values, this will fail.

*/
-- CreateIndex
CREATE UNIQUE INDEX "reporters_address_chain_id_service_id_key" ON "reporters"("address", "chain_id", "service_id");
51 changes: 37 additions & 14 deletions api/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
provider = "prisma-client-js"
provider = "prisma-client-js"
engineType = "binary"
}

Expand All @@ -15,38 +15,44 @@ model Chain {
id BigInt @id @default(autoincrement()) @map("chain_id")
name String @unique
Aggregator Aggregator[]
Listener Listener[]
VrfKey VrfKey[]
Listener Listener[]
VrfKey VrfKey[]
Reporter Reporter[]

@@map("chains")
}

model Service {
id BigInt @id @default(autoincrement()) @map("service_id")
name String @unique
Listener Listener[]
Listener Listener[]
Reporter Reporter[]

@@map("services")
}

model Listener {
id BigInt @id @default(autoincrement()) @map("listener_id")
address String @db.VarChar(42)
eventName String @db.VarChar(255) @map("event_name")
eventName String @map("event_name") @db.VarChar(255)
chain Chain @relation(fields: [chainId], references: [id])
chainId BigInt @map("chain_id")
service Service @relation(fields: [serviceId], references: [id])
serviceId BigInt @map("service_id")

@@map("listeners")
}

model VrfKey {
id BigInt @id @default(autoincrement()) @map("vrf_key_id")
sk String @db.VarChar(64)
pk String @db.VarChar(130)
pkX String @db.VarChar(77) @map("pk_x")
pkY String @db.VarChar(77) @map("pk_y")
keyHash String @db.VarChar(66) @map("key_hash")
pkX String @map("pk_x") @db.VarChar(77)
pkY String @map("pk_y") @db.VarChar(77)
keyHash String @map("key_hash") @db.VarChar(66)
chain Chain @relation(fields: [chainId], references: [id])
chainId BigInt @map("chain_id")

@@map("vrf_keys")
}

Expand All @@ -55,8 +61,9 @@ model Feed {
name String
definition Json
adapter Adapter @relation(fields: [adapterId], references: [id], onDelete: Cascade)
adapterId BigInt @map("adapter_id")
Data Data[]
adapterId BigInt @map("adapter_id")
Data Data[]

@@map("feeds")
}

Expand All @@ -66,7 +73,8 @@ model Adapter {
name String
decimals Int
feeds Feed[]
Aggregator Aggregator[]
Aggregator Aggregator[]

@@map("adapters")
}

Expand All @@ -79,12 +87,12 @@ model Aggregator {
heartbeat Int
threshold Float
absoluteThreshold Float @map("absolute_threshold")
Data Data[]
Data Data[]
adapter Adapter @relation(fields: [adapterId], references: [id])
adapterId BigInt @map("adapter_id")
chain Chain @relation(fields: [chainId], references: [id])
chainId BigInt @map("chain_id")
Aggregate Aggregate[]
Aggregate Aggregate[]

@@unique([aggregatorHash, chainId])
@@map("aggregators")
Expand All @@ -98,7 +106,8 @@ model Data {
aggregatorId BigInt @map("aggregator_id")
feed Feed @relation(fields: [feedId], references: [id])
feedId BigInt @map("feed_id")
@@map("data")

@@map("data")
}

model Aggregate {
Expand All @@ -111,3 +120,17 @@ model Aggregate {
@@index([aggregatorId, timestamp(sort: Desc)])
@@map("aggregates")
}

model Reporter {
id BigInt @id @default(autoincrement()) @map("reporter_id")
address String @db.VarChar(42)
privateKey String @db.VarChar(66)
oracleAddress String @db.VarChar(42)
chain Chain @relation(fields: [chainId], references: [id])
chainId BigInt @map("chain_id")
service Service @relation(fields: [serviceId], references: [id])
serviceId BigInt @map("service_id")

@@unique([address, chainId, serviceId])
@@map("reporters")
}
4 changes: 3 additions & 1 deletion api/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { AggregateModule } from './aggregate/aggregate.module'
import { ServiceModule } from './service/service.module'
import { ListenerModule } from './listener/listener.module'
import { VrfModule } from './vrf/vrf.module'
import { ReporterModule } from './reporter/reporter.module'

@Module({
imports: [
Expand All @@ -22,7 +23,8 @@ import { VrfModule } from './vrf/vrf.module'
AggregateModule,
ServiceModule,
ListenerModule,
VrfModule
VrfModule,
ReporterModule
],
controllers: [AppController],
providers: [AppService, ConfigService]
Expand Down
63 changes: 63 additions & 0 deletions api/src/common/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { HttpStatus, HttpException, Logger } from '@nestjs/common'

/**
* Find chain given `chainName`.
*
* @params {PrismaService.chain} prisma client for chain
* @params {string} chain name
* @params {Logger} NestJS logger
* @return {Chain} chain object represented by a `chainName`
* @exception {HttpException} raise when there is no chain with `chainName`
*/
export async function getChain({
chain,
chainName,
logger
}: {
chain
chainName: string
logger: Logger
}) {
const chainObj = await chain.findUnique({
where: { name: chainName }
})

if (chainObj == null) {
const msg = `chain.name [${chainName}] not found`
logger.error(msg)
throw new HttpException(msg, HttpStatus.NOT_FOUND)
}

return chainObj
}

/**
* Find service given `serviceName`.
*
* @params {PrismaService.service} prisma client for service
* @params {string} service name
* @params {Logger} NestJS logger
* @return {Service} service object represented by a `serviceName`
* @exception {HttpException} raise when there is no service with `serviceName`
*/
export async function getService({
service,
serviceName,
logger
}: {
service
serviceName: string
logger: Logger
}) {
const serviceObj = await service.findUnique({
where: { name: serviceName }
})

if (serviceObj == null) {
const msg = `service.name [${serviceName}] not found`
logger.error(msg)
throw new HttpException(msg, HttpStatus.NOT_FOUND)
}

return serviceObj
}
4 changes: 2 additions & 2 deletions api/src/listener/dto/create-listener.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ export class CreateListenerDto {
eventName: string

@ApiProperty()
chain: string | bigint
chain: string

@ApiProperty()
service: string | bigint
service: string
}
2 changes: 2 additions & 0 deletions api/src/listener/listener.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ describe('ListenerService', () => {
const module: TestingModule = await Test.createTestingModule({
providers: [ListenerService, ServiceService, ChainService, PrismaService]
}).compile()

chain = module.get<ChainService>(ChainService)
service = module.get<ServiceService>(ServiceService)
listener = module.get<ListenerService>(ListenerService)
Expand All @@ -37,6 +38,7 @@ describe('ListenerService', () => {
// Service
const serviceObj = await service.create({ name: 'listener-test-service' })

// Listener
const listenerObj = await listener.create({
address: '0x',
eventName: 'TestEventName',
Expand Down
32 changes: 11 additions & 21 deletions api/src/listener/listener.service.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Injectable, HttpStatus, HttpException, Logger } from '@nestjs/common'
import { Injectable, Logger } from '@nestjs/common'
import { Prisma } from '@prisma/client'
import { PrismaService } from '../prisma.service'
import { CreateListenerDto } from './dto/create-listener.dto'
import { UpdateListenerDto } from './dto/update-listener.dto'
import { flattenListener } from './listener.utils'
import { getChain, getService } from '../common/utils'

@Injectable()
export class ListenerService {
Expand All @@ -13,29 +14,18 @@ export class ListenerService {

async create(createListenerDto: CreateListenerDto) {
// chain
const chainName = createListenerDto.chain.toString()
const chain = await this.prisma.chain.findUnique({
where: { name: chainName }
})

if (chain == null) {
const msg = `chain.name [${chainName}] not found`
this.logger.error(msg)
throw new HttpException(msg, HttpStatus.NOT_FOUND)
}
const chainName = createListenerDto.chain
const chain = await getChain({ chain: this.prisma.chain, chainName, logger: this.logger })

// chain
const serviceName = createListenerDto.service.toString()
const service = await this.prisma.service.findUnique({
where: { name: serviceName }
// service
const serviceName = createListenerDto.service
const service = await getService({
service: this.prisma.service,
serviceName,
logger: this.logger
})

if (service == null) {
const msg = `service.name [${serviceName}] not found`
this.logger.error(msg)
throw new HttpException(msg, HttpStatus.NOT_FOUND)
}

// listener
const data: Prisma.ListenerUncheckedCreateInput = {
address: createListenerDto.address,
eventName: createListenerDto.eventName,
Expand Down
18 changes: 18 additions & 0 deletions api/src/reporter/dto/create-reporter.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ApiProperty } from '@nestjs/swagger'

export class CreateReporterDto {
@ApiProperty()
address: string

@ApiProperty()
privateKey: string

@ApiProperty()
oracleAddress: string

@ApiProperty()
chain: string

@ApiProperty()
service: string
}
12 changes: 12 additions & 0 deletions api/src/reporter/dto/update-reporter.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { ApiProperty } from '@nestjs/swagger'

export class UpdateReporterDto {
@ApiProperty()
address: string

@ApiProperty()
privateKey: string

@ApiProperty()
oracleAddress: string
}
Loading
0