Skip to content
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

Performance improvements #64

Draft
wants to merge 4 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 8 additions & 8 deletions schema.graphql
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
type User @entity {
"Trade event order owner"
id: ID!
id: Bytes!
"Owner's address"
address: Bytes!
"First trade block timestamp"
Expand All @@ -23,7 +23,7 @@ type User @entity {

type Token @entity {
"Token address to hexString"
id: ID!
id: Bytes!
"Token address"
address: Bytes!
"First token trade block timestamp"
Expand Down Expand Up @@ -56,7 +56,7 @@ type Token @entity {

type Order @entity {
"Trade's OrderUid to hex string"
id: ID!
id: Bytes!
"Trade's owner or presign User"
owner: User
"block's timestamp on trade event"
Expand All @@ -73,7 +73,7 @@ type Order @entity {
isValid: Boolean
}

type Trade @entity {
type Trade @entity(immutable: true) {
"This Id is composed using orderId|txHashString|eventIndex"
id: ID!
"Block's timestamp"
Expand Down Expand Up @@ -110,7 +110,7 @@ type Trade @entity {
sellAmountUsd: BigDecimal
}

type Settlement @entity {
type Settlement @entity(immutable: true) {
"TxHash"
id: ID!
"Transaction hash"
Expand Down Expand Up @@ -141,7 +141,7 @@ type Bundle @entity {

type UniswapPool @entity {
"Pool address"
id: ID!
id: Bytes!
"Token0"
token0: UniswapToken!
"Token1"
Expand All @@ -162,7 +162,7 @@ type UniswapPool @entity {

type UniswapToken @entity {
"Token address to hexString"
id: ID!
id: Bytes!
"Token address"
address: Bytes!
"Token name fetched by ERC20 contract call"
Expand Down Expand Up @@ -310,7 +310,7 @@ type TokenHourlyTotal @entity {
averagePrice: BigDecimal!
}

type TokenTradingEvent @entity {
type TokenTradingEvent @entity(immutable: true) {
"Id built using token-timestamp"
id: ID!
"Token"
Expand Down
18 changes: 8 additions & 10 deletions src/mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export function handleInteraction(event: Interaction): void { }

export function handleOrderInvalidated(event: OrderInvalidated): void {

let orderId = event.params.orderUid.toHexString()
let orderId = event.params.orderUid
let timestamp = event.block.timestamp.toI32()

let order = orders.invalidateOrder(orderId, timestamp)
Expand All @@ -26,26 +26,24 @@ export function handleOrderInvalidated(event: OrderInvalidated): void {

export function handlePreSignature(event: PreSignature): void {

let orderUid = event.params.orderUid.toHexString()
let orderUid = event.params.orderUid
let ownerAddress = event.params.owner
let owner = ownerAddress.toHexString()
let timestamp = event.block.timestamp.toI32()
let signed = event.params.signed

let order = orders.setPresignature(orderUid, owner, timestamp, signed)
let order = orders.setPresignature(orderUid, ownerAddress, timestamp, signed)

order.save()

users.getOrCreateSigner(owner, ownerAddress)
users.getOrCreateSigner(ownerAddress)
}

export function handleSettlement(event: Settlement): void { }


export function handleTrade(event: Trade): void {
let orderId = event.params.orderUid.toHexString()
let orderId = event.params.orderUid
let ownerAddress = event.params.owner
let owner = ownerAddress.toHexString()
let sellTokenAddress = event.params.sellToken
let buyTokenAddress = event.params.buyToken
let sellAmount = event.params.sellAmount
Expand Down Expand Up @@ -77,8 +75,8 @@ export function handleTrade(event: Trade): void {
buyToken.priceEth = buyTokenPrices.get("eth")
}
} else {
let sellUniToken = UniswapToken.load(sellTokenAddress.toHexString())
let buyUniToken = UniswapToken.load(buyTokenAddress.toHexString())
let sellUniToken = UniswapToken.load(sellTokenAddress)
let buyUniToken = UniswapToken.load(buyTokenAddress)
if (sellUniToken) {
sellToken.priceUsd = sellUniToken.priceUsd ? sellUniToken.priceUsd : null
sellToken.priceEth = sellUniToken.priceEth ? sellUniToken.priceEth : null
Expand Down Expand Up @@ -131,7 +129,7 @@ export function handleTrade(event: Trade): void {
sellToken.save()
buyToken.save()

let order = orders.getOrCreateOrderForTrade(orderId, timestamp, owner)
let order = orders.getOrCreateOrderForTrade(orderId, timestamp, ownerAddress)

sellToken.save()
buyToken.save()
Expand Down
12 changes: 6 additions & 6 deletions src/modules/orders.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import { log } from "@graphprotocol/graph-ts"
import { Bytes, log } from "@graphprotocol/graph-ts"
import { BigInt } from "@graphprotocol/graph-ts"
import { Order } from "../../generated/schema"
import { totals } from "./totals"


export namespace orders {

export function invalidateOrder(orderId: string, timestamp: i32): Order {
export function invalidateOrder(orderId: Bytes, timestamp: i32): Order {

let order = Order.load(orderId)

if (!order) {
order = new Order(orderId)
log.info('Order {} was not found. It was created for being invalidated', [orderId])
log.info('Order {} was not found. It was created for being invalidated', [orderId.toHexString()])
}

order.isValid = false
Expand All @@ -21,7 +21,7 @@ export namespace orders {
return order as Order
}

export function setPresignature(orderId: string, owner: string, timestamp: i32, signed: boolean): Order {
export function setPresignature(orderId: Bytes, owner: Bytes, timestamp: i32, signed: boolean): Order {

// check if makes sense to count orders (in totals) that are coming from here
let order = getOrCreateOrder(orderId, owner, timestamp)
Expand All @@ -32,15 +32,15 @@ export namespace orders {
return order as Order
}

export function getOrCreateOrderForTrade(orderId: string, timestamp: i32, owner: string): Order {
export function getOrCreateOrderForTrade(orderId: Bytes, timestamp: i32, owner: Bytes): Order {

let order = getOrCreateOrder(orderId, owner, timestamp)
order.tradesTimestamp = timestamp

return order as Order
}

function getOrCreateOrder(orderId: string, owner: string, timestamp: i32): Order {
function getOrCreateOrder(orderId: Bytes, owner: Bytes, timestamp: i32): Order {

let order = Order.load(orderId)

Expand Down
28 changes: 13 additions & 15 deletions src/modules/pairs.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { BigInt, BigDecimal, Address } from "@graphprotocol/graph-ts";
import { BigInt, BigDecimal, Address, Bytes } from "@graphprotocol/graph-ts";
import { PairDaily, PairHourly, Pair } from "../../generated/schema";
import { ZERO_BD, ZERO_BI } from "../utils/constants";
import { getDayTotalTimestamp, getHourTotalTimestamp } from "../utils/timeframeTimestamp";

export namespace pairs {

export class TokenProps {
token: string
token: Bytes
volume: BigInt
price: BigDecimal | null
relativePrice: BigDecimal
constructor(
_token: string,
_token: Bytes,
_volume: BigInt,
_price: BigDecimal | null,
_relativePrice: BigDecimal
Expand All @@ -23,7 +23,7 @@ export namespace pairs {
}
}

export function createOrUpdatePair(timestamp: i32, buyTokenId: string, sellTokenId: string, buyAmount: BigInt, sellAmount: BigInt,
export function createOrUpdatePair(timestamp: i32, buyTokenId: Bytes, sellTokenId: Bytes, buyAmount: BigInt, sellAmount: BigInt,
sellAmountEth: BigDecimal | null, sellAmountUsd: BigDecimal | null, buyTokenPriceUsd: BigDecimal | null, sellTokenPriceUsd: BigDecimal | null,
buyAmountDecimals: BigDecimal, sellAmountDecimals: BigDecimal): void {
let canonicalMarket = getCanonicalMarket(buyTokenId, sellTokenId, buyAmount, sellAmount, buyTokenPriceUsd, sellTokenPriceUsd, buyAmountDecimals, sellAmountDecimals)
Expand All @@ -50,13 +50,11 @@ export namespace pairs {
sellAmountEth, sellAmountUsd)
}

function getCanonicalMarket(buyTokenId: string, sellTokenId: string, buyAmount: BigInt, sellAmount: BigInt,
function getCanonicalMarket(buyTokenId: Bytes, sellTokenId: Bytes, buyAmount: BigInt, sellAmount: BigInt,
buyTokenPriceUsd: BigDecimal | null, sellTokenPriceUsd: BigDecimal | null,
buyAmountDecimals: BigDecimal, sellAmountDecimals: BigDecimal): Map<string, TokenProps> {
let buyTokenAddress = Address.fromString(buyTokenId)
let sellTokenAddress = Address.fromString(sellTokenId)
let buyTokenNumber = BigInt.fromUnsignedBytes(buyTokenAddress)
let sellTokenNumber = BigInt.fromUnsignedBytes(sellTokenAddress)
let buyTokenNumber = BigInt.fromUnsignedBytes(buyTokenId)
let sellTokenNumber = BigInt.fromUnsignedBytes(sellTokenId)
let value = new Map<string, TokenProps>()

let buyTokenExpressedOnSellToken = ZERO_BD
Expand Down Expand Up @@ -144,8 +142,8 @@ export namespace pairs {
}


function getOrCreatePair(token0: string, token1: string): Pair {
let id = token0 + "-" + token1
function getOrCreatePair(token0: Bytes, token1: Bytes): Pair {
let id = token0.toHexString() + "-" + token1.toHexString()
let pairTotal = Pair.load(id)

if (!pairTotal) {
Expand All @@ -161,9 +159,9 @@ export namespace pairs {
return pairTotal as Pair
}

function getOrCreatePairDaily(token0: string, token1: string, timestamp: i32): PairDaily {
function getOrCreatePairDaily(token0: Bytes, token1: Bytes, timestamp: i32): PairDaily {
let dailyTimestamp = getDayTotalTimestamp(timestamp)
let id = token0 + "-" + token1 + "-" + dailyTimestamp.toString()
let id = token0.toHexString() + "-" + token1.toHexString() + "-" + dailyTimestamp.toString()
let pairDailyTotal = PairDaily.load(id)

if (!pairDailyTotal) {
Expand All @@ -181,9 +179,9 @@ export namespace pairs {

}

function getOrCreatePairHourly(token0: string, token1: string, timestamp: i32): PairHourly {
function getOrCreatePairHourly(token0: Bytes, token1: Bytes, timestamp: i32): PairHourly {
let hourlyTimestamp = getHourTotalTimestamp(timestamp)
let id = token0 + "-" + token1 + "-" + hourlyTimestamp.toString()
let id = token0.toHexString() + "-" + token1.toHexString() + "-" + hourlyTimestamp.toString()
let pairHourlyTotal = PairHourly.load(id)

if (!pairHourlyTotal) {
Expand Down
10 changes: 6 additions & 4 deletions src/modules/settlements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { getEthPriceInUSD } from "../utils/pricing"

export namespace settlements {

export function getOrCreateSettlement(txHash: Bytes, tradeTimestamp: i32, solver: Address, txGasPrice: BigInt, feeAmountUsd: BigDecimal): void {
export function getOrCreateSettlement(txHash: Bytes, tradeTimestamp: i32, solver: Address, txGasPrice: BigInt, feeAmountUsd: BigDecimal | null): void {

let settlementId = txHash.toHexString()
let network = dataSource.network()
Expand All @@ -29,15 +29,17 @@ export namespace settlements {
settlement = new Settlement(settlementId)
settlement.txHash = txHash
settlement.firstTradeTimestamp = tradeTimestamp
settlement.solver = solver.toHexString()
settlement.solver = solver
settlement.txCostUsd = txCostUsd
settlement.txCostNative = txCostNative
settlement.aggregatedFeeAmountUsd = ZERO_BD
settlement.profitability = ZERO_BD
totals.addSettlementCount(tradeTimestamp)
}
let prevFeeAmountUsd = settlement.aggregatedFeeAmountUsd
settlement.aggregatedFeeAmountUsd = prevFeeAmountUsd.plus(feeAmountUsd)
if(feeAmountUsd) {
let prevFeeAmountUsd = settlement.aggregatedFeeAmountUsd
settlement.aggregatedFeeAmountUsd = prevFeeAmountUsd.plus(feeAmountUsd)
}
settlement.profitability = settlement.aggregatedFeeAmountUsd.minus(settlement.txCostUsd)
settlement.save()
}
Expand Down
26 changes: 12 additions & 14 deletions src/modules/tokens.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Address, BigDecimal, BigInt, dataSource } from "@graphprotocol/graph-ts"
import { Address, BigDecimal, BigInt, Bytes, dataSource } from "@graphprotocol/graph-ts"
import { ERC20 } from "../../generated/GPV2Settlement/ERC20"
import { Token, TokenDailyTotal, TokenHourlyTotal, TokenTradingEvent } from "../../generated/schema"
import { ZERO_BD, ZERO_BI, MINUS_ONE_BD, ONE_BI } from "../utils/constants"
Expand All @@ -11,14 +11,13 @@ let DEFAULT_DECIMALS = 18
export namespace tokens {

export function getOrCreateToken(tokenAddress: Address, timestamp: i32): Token {
let tokenId = tokenAddress.toHexString()
let token = Token.load(tokenId)
let token = Token.load(tokenAddress)
let network = dataSource.network()

// check if token exists
if (!token) {
// creates a new token and fill properites
token = new Token(tokenId)
token = new Token(tokenAddress)
token.address = tokenAddress
token.firstTradeTimestamp = timestamp ? timestamp : 0

Expand Down Expand Up @@ -70,8 +69,7 @@ export namespace tokens {
}

export function getTokenDecimals(tokenAddress: Address): number {
let tokenId = tokenAddress.toHexString()
let token = Token.load(tokenId)
let token = Token.load(tokenAddress)

if (token) {
return token.decimals
Expand All @@ -83,8 +81,8 @@ export namespace tokens {
return tokenDecimals.reverted ? DEFAULT_DECIMALS : tokenDecimals.value
}

export function createTokenTradingEvent(timestamp: i32, tokenId: string, tradeId: string, amount: BigInt, amountEth: BigDecimal | null, amountUsd: BigDecimal | null, tokenPrice: BigDecimal | null): void {
let id = tokenId + timestamp.toString()
export function createTokenTradingEvent(timestamp: i32, tokenId: Bytes, tradeId: string, amount: BigInt, amountEth: BigDecimal | null, amountUsd: BigDecimal | null, tokenPrice: BigDecimal | null): void {
let id = tokenId.toHexString() + timestamp.toString()
let tradingEvent = new TokenTradingEvent(id)
tradingEvent.token = tokenId
tradingEvent.trade = tradeId
Expand All @@ -96,10 +94,10 @@ export namespace tokens {
updateTokenHourlyTotal(timestamp, tokenId, amount, amountEth, amountUsd, tokenPrice)
}

function getOrCreateTokenDailyTotal(tokenId: string, timestamp: i32): TokenDailyTotal {
function getOrCreateTokenDailyTotal(tokenId: Bytes, timestamp: i32): TokenDailyTotal {

let dailyTimestamp = getDayTotalTimestamp(timestamp)
let dailyTimestampId = tokenId + "-" + dailyTimestamp.toString()
let dailyTimestampId = tokenId.toHexString() + "-" + dailyTimestamp.toString()
let total = TokenDailyTotal.load(dailyTimestampId)

if (!total) {
Expand All @@ -120,10 +118,10 @@ export namespace tokens {
return total as TokenDailyTotal
}

function getOrCreateTokenHourlyTotal(tokenId: string, timestamp: i32): TokenHourlyTotal {
function getOrCreateTokenHourlyTotal(tokenId: Bytes, timestamp: i32): TokenHourlyTotal {

let hourlyTimestamp = getHourTotalTimestamp(timestamp)
let hourlyTimestampId = tokenId + "-" + hourlyTimestamp.toString()
let hourlyTimestampId = tokenId.toHexString() + "-" + hourlyTimestamp.toString()
let total = TokenHourlyTotal.load(hourlyTimestampId)

if (!total) {
Expand All @@ -144,7 +142,7 @@ export namespace tokens {
return total as TokenHourlyTotal
}

function updateTokenDailyTotal(timestamp: i32, tokenId: string, amount: BigInt, amountEth: BigDecimal | null, amountUsd: BigDecimal | null, tokenPrice: BigDecimal | null): void {
function updateTokenDailyTotal(timestamp: i32, tokenId: Bytes, amount: BigInt, amountEth: BigDecimal | null, amountUsd: BigDecimal | null, tokenPrice: BigDecimal | null): void {

let total = getOrCreateTokenDailyTotal(tokenId, timestamp)

Expand Down Expand Up @@ -200,7 +198,7 @@ export namespace tokens {
let denominator = prevVolumeBD.plus(currentVolumeBD)
return numerator.div(denominator) as BigDecimal
}
function updateTokenHourlyTotal(timestamp: i32, tokenId: string, amount: BigInt, amountEth: BigDecimal | null, amountUsd: BigDecimal | null, tokenPrice: BigDecimal | null): void {
function updateTokenHourlyTotal(timestamp: i32, tokenId: Bytes, amount: BigInt, amountEth: BigDecimal | null, amountUsd: BigDecimal | null, tokenPrice: BigDecimal | null): void {

let total = getOrCreateTokenHourlyTotal(tokenId, timestamp)

Expand Down
Loading