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

[WIP] Add formula fields in position snapshot #35

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
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
40 changes: 40 additions & 0 deletions sushiswap-farms/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,9 @@ type PositionSnapshot @entity {
outputTokenBalance: BigInt!
inputTokenBalances: [String!]! # TokenBalance string format
rewardTokenBalances: [String!]! # TokenBalance string format
outputTokenBalanceFormula: String
inputTokenBalanceFormula: [String!]
rewardTokenBalanceFormula: [String!]
transferredTo: [String!]! # TokenBalance string format
}

Expand Down Expand Up @@ -224,6 +227,12 @@ type SushiFarmSnapshot @entity {
" total amount of LP tokens provided to farm "
totalSupply: BigInt!

" last block number where sushi distribution occurs. "
lastRewardBlock: BigInt!

" accumulated amount of sushi per share"
accSushiPerShare: BigInt!

" snapshot timestamp "
timestamp: BigInt!

Expand Down Expand Up @@ -257,6 +266,35 @@ type UserInfo @entity {
rewardDebt: BigInt!
}

type UserInfoSnapshot @entity {
" UserInfo.id-trasactionHash-logIndex "
id: ID!

" UserInfo for which the snapshot is taken "
userInfo: UserInfo!

" LP token amount the user has provided "
amount: BigInt!

" amount of SUSHI entitled to the user "
rewardDebt: BigInt!

" snapshot timestamp "
timestamp: BigInt!

" block number in which snapshot is taken "
blockNumber: BigInt!

" transaction in which snapshot is taken "
transactionHash: String!

" index of transaction in block "
transactionIndexInBlock: BigInt!

" snapshot log index "
logIndex: BigInt!
}

type FarmDeposit @entity {
" transactionHash-logIndex "
id: ID!
Expand Down Expand Up @@ -358,6 +396,8 @@ type MasterChef @entity {

" bonus muliplier for early sushi makers "
bonusMultiplier: BigInt

precision: BigInt!
}

type Rewarder @entity {
Expand Down
49 changes: 36 additions & 13 deletions sushiswap-farms/src/library/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@ export function updateMarket(
inputTokenBalances: TokenBalance[],
outputTokenTotalSupply: BigInt
): MarketSnapshot {
market.inputTokenTotalBalances = inputTokenBalances.map<string>((tb) => tb.toString());
market.outputTokenTotalSupply = outputTokenTotalSupply;
market.save();

let transactionHash = event.transaction.hash.toHexString();
let id = transactionHash.concat("-").concat(event.logIndex.toHexString());
let marketSnapshot = MarketSnapshot.load(id);
Expand All @@ -191,10 +195,6 @@ export function updateMarket(
marketSnapshot.logIndex = event.logIndex;
marketSnapshot.save();

market.inputTokenTotalBalances = inputTokenBalances.map<string>((tb) => tb.toString());
market.outputTokenTotalSupply = outputTokenTotalSupply;
market.save();

return marketSnapshot as MarketSnapshot;
}

Expand Down Expand Up @@ -332,21 +332,40 @@ export class TokenBalance {
}
}

export class TokenBalanceFormula {
output: string;
input: string[];
reward: string[];

constructor(output: string, input: string[], reward: string[]) {
this.output = output;
this.input = input;
this.reward = reward;
}
}

/**
* Create snapshot of user's position at certain block
*
* @param {Position} position Position to create snapshot of
* @param {Transaction} transaction Transaction which triggered the change in position
* @return {*} {PositionSnapshot} PositionSnapshot entity
*/
function createPositionSnapshot(position: Position, transaction: Transaction): PositionSnapshot {
function createPositionSnapshot(
position: Position,
transaction: Transaction,
tokenBalanceFormula: TokenBalanceFormula | null
): PositionSnapshot {
let newCounter = position.historyCounter.plus(BigInt.fromI32(1));
let newSnapshot = new PositionSnapshot(position.id.concat("-").concat(newCounter.toString()));
newSnapshot.position = position.id;
newSnapshot.transaction = transaction.id;
newSnapshot.outputTokenBalance = position.outputTokenBalance;
newSnapshot.inputTokenBalances = position.inputTokenBalances;
newSnapshot.rewardTokenBalances = position.rewardTokenBalances;
newSnapshot.outputTokenBalanceFormula = tokenBalanceFormula.output;
newSnapshot.inputTokenBalanceFormula = tokenBalanceFormula.input;
newSnapshot.rewardTokenBalanceFormula = tokenBalanceFormula.reward;
newSnapshot.transferredTo = position.transferredTo;
position.blockNumber = transaction.blockNumber;
position.timestamp = transaction.timestamp;
Expand Down Expand Up @@ -387,7 +406,8 @@ export function investInMarket(
outputTokenBalance: BigInt,
inputTokenBalances: TokenBalance[],
rewardTokenBalances: TokenBalance[],
transferredFrom: string | null
transferredFrom: string | null,
tokenBalanceFormula: TokenBalanceFormula | null
): Position {
// Create marketSnapshot for transaction
let marketSnapshot = createMarketSnapshot(event, market);
Expand Down Expand Up @@ -423,7 +443,6 @@ export function investInMarket(
transaction.save();

let position = getOrCreateOpenPosition(event, account, market, PositionType.INVESTMENT);
let positionSnapshot = createPositionSnapshot(position, transaction);

position.inputTokenBalances = inputTokenBalances.map<string>((tb) => tb.toString());
position.outputTokenBalance = outputTokenBalance;
Expand All @@ -435,6 +454,7 @@ export function investInMarket(
}

position.save();
let positionSnapshot = createPositionSnapshot(position, transaction, tokenBalanceFormula);

return position;
}
Expand Down Expand Up @@ -468,7 +488,8 @@ export function redeemFromMarket(
outputTokenBalance: BigInt,
inputTokenBalances: TokenBalance[],
rewardTokenBalances: TokenBalance[],
transferredTo: string | null
transferredTo: string | null,
tokenBalanceFormula: TokenBalanceFormula | null
): Position {
// Create marketSnapshot for transaction
let marketSnapshot = createMarketSnapshot(event, market);
Expand Down Expand Up @@ -504,7 +525,6 @@ export function redeemFromMarket(
transaction.save();

let position = getOrCreateOpenPosition(event, account, market, PositionType.INVESTMENT);
let postionSnapshot = createPositionSnapshot(position, transaction);

// No change in investment amount as no new investment has been made
position.inputTokenBalances = inputTokenBalances.map<string>((tb) => tb.toString());
Expand All @@ -527,6 +547,7 @@ export function redeemFromMarket(
}

position.save();
let postionSnapshot = createPositionSnapshot(position, transaction, tokenBalanceFormula);

return position;
}
Expand Down Expand Up @@ -556,7 +577,8 @@ export function borrowFromMarket(
rewardTokenAmounts: TokenBalance[],
outputTokenBalance: BigInt,
inputTokenBalances: TokenBalance[],
rewardTokenBalances: TokenBalance[]
rewardTokenBalances: TokenBalance[],
tokenBalanceFormula: TokenBalanceFormula | null
): Position {
// Create marketSnapshot for transaction
let marketSnapshot = createMarketSnapshot(event, market);
Expand Down Expand Up @@ -587,7 +609,6 @@ export function borrowFromMarket(
transaction.save();

let position = getOrCreateOpenPosition(event, account, market, PositionType.DEBT);
let positionSnapshot = createPositionSnapshot(position, transaction);

position.inputTokenBalances = inputTokenBalances.map<string>((tb) => tb.toString());
position.outputTokenBalance = outputTokenBalance;
Expand All @@ -599,6 +620,7 @@ export function borrowFromMarket(
}

position.save();
let positionSnapshot = createPositionSnapshot(position, transaction, tokenBalanceFormula);

return position;
}
Expand Down Expand Up @@ -629,7 +651,8 @@ export function repayToMarket(
rewardTokenAmounts: TokenBalance[],
outputTokenBalance: BigInt,
inputTokenBalances: TokenBalance[],
rewardTokenBalances: TokenBalance[]
rewardTokenBalances: TokenBalance[],
tokenBalanceFormula: TokenBalanceFormula | null
): Position {
// Create marketSnapshot for transaction
let marketSnapshot = createMarketSnapshot(event, market);
Expand Down Expand Up @@ -660,7 +683,6 @@ export function repayToMarket(
transaction.save();

let position = getOrCreateOpenPosition(event, account, market, PositionType.DEBT);
let postionSnapshot = createPositionSnapshot(position, transaction);

// Loan amount is not changed on repayment
position.inputTokenBalances = inputTokenBalances.map<string>((tb) => tb.toString());
Expand All @@ -673,6 +695,7 @@ export function repayToMarket(
}

position.save();
let postionSnapshot = createPositionSnapshot(position, transaction, tokenBalanceFormula);

return position;
}
45 changes: 43 additions & 2 deletions sushiswap-farms/src/library/masterChefUtils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BigInt } from "@graphprotocol/graph-ts";
import { BigInt, ethereum } from "@graphprotocol/graph-ts";

import { UserInfo } from "../../generated/schema";
import { SushiFarm, SushiFarmSnapshot, UserInfo, UserInfoSnapshot } from "../../generated/schema";

/**
* Create UserInfo entity which tracks how many LP tokens user provided and how many Sushi rewards he claimed
Expand All @@ -23,3 +23,44 @@ export function getOrCreateUserInfo(user: string, farmId: string): UserInfo {

return userInfo;
}

export function updateUserInfo(event: ethereum.Event, userInfo: UserInfo, amount: BigInt, rewardDebt: BigInt): UserInfo {
userInfo.amount = amount;
userInfo.rewardDebt = rewardDebt;
userInfo.save();

let id = userInfo.id + "-" + event.transaction.hash.toHexString() + "-" + event.logIndex.toHexString();
let userInfoSnapshot = new UserInfoSnapshot(id);

userInfoSnapshot.userInfo = userInfo.id;
userInfoSnapshot.amount = userInfo.amount;
userInfoSnapshot.rewardDebt = userInfo.rewardDebt;
userInfoSnapshot.timestamp = event.block.timestamp;
userInfoSnapshot.transactionHash = event.transaction.hash.toHexString();
userInfoSnapshot.transactionIndexInBlock = event.transaction.index;
userInfoSnapshot.blockNumber = event.block.number;
userInfoSnapshot.logIndex = event.logIndex;

userInfoSnapshot.save();

return userInfo;
}

export function createFarmSnapshot(event: ethereum.Event, farm: SushiFarm): SushiFarmSnapshot {
let snapshotId = event.transaction.hash.toHexString() + "-" + event.logIndex.toHexString();
let farmSnapshot = new SushiFarmSnapshot(snapshotId);
farmSnapshot.farmPid = farm.farmPid;
farmSnapshot.sushiFarm = farm.id;
farmSnapshot.allocPoint = farm.allocPoint;
farmSnapshot.totalSupply = farm.totalSupply;
farmSnapshot.accSushiPerShare = farm.accSushiPerShare;
farmSnapshot.lastRewardBlock = farm.lastRewardBlock;
farmSnapshot.timestamp = event.block.timestamp;
farmSnapshot.transactionHash = event.transaction.hash.toHexString();
farmSnapshot.transactionIndexInBlock = event.transaction.index;
farmSnapshot.blockNumber = event.block.number;
farmSnapshot.logIndex = event.logIndex;
farmSnapshot.save();

return farmSnapshot;
}
Loading