Skip to content

Commit 6df536c

Browse files
Add basic liquid pool graph
1 parent 2ffda89 commit 6df536c

File tree

3 files changed

+220
-0
lines changed

3 files changed

+220
-0
lines changed

subgraphs/liquid_staking/schema.graphql

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,63 @@ type NodeRetired @entity {
3636
timestamp: BigInt!
3737
}
3838

39+
type User @entity {
40+
id: ID!
41+
address: Bytes!
42+
stakedAmount: BigInt!
43+
rewardsDebt: BigInt!
44+
claimedRewards: BigInt!
45+
lastStakeTime: BigInt
46+
lastUnstakeTime: BigInt
47+
lockedWithdraws: BigInt!
48+
}
49+
50+
type Claim @entity {
51+
id: ID!
52+
user: User!
53+
ambAmount: BigInt!
54+
bondAmount: BigInt!
55+
timestamp: BigInt!
56+
}
57+
58+
type Interest @entity {
59+
id: ID!
60+
amount: BigInt!
61+
timestamp: BigInt!
62+
}
63+
64+
type StakeChange @entity {
65+
id: ID!
66+
user: User!
67+
amount: BigInt!
68+
isStake: Boolean!
69+
timestamp: BigInt!
70+
}
71+
72+
type UnstakeFast @entity {
73+
id: ID!
74+
user: User!
75+
amount: BigInt!
76+
penalty: BigInt!
77+
timestamp: BigInt!
78+
}
79+
80+
type UnstakeLocked @entity {
81+
id: ID!
82+
user: User!
83+
amount: BigInt!
84+
unlockTime: BigInt!
85+
creationTime: BigInt!
86+
}
87+
88+
type StakingStats @entity {
89+
id: ID!
90+
totalStaked: BigInt!
91+
totalRewards: BigInt!
92+
totalRewardsDebt: BigInt!
93+
interestRate: BigInt!
94+
interestPeriod: BigInt!
95+
minStakeValue: BigInt!
96+
unstakeLockTime: BigInt!
97+
fastUnstakePenalty: BigInt!
98+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import { BigInt, Address } from "@graphprotocol/graph-ts";
2+
import {
3+
Claim as ClaimEvent,
4+
Interest as InterestEvent,
5+
StakeChanged as StakeChangedEvent,
6+
UnstakeFast as UnstakeFastEvent,
7+
UnstakeLocked as UnstakeLockedEvent
8+
} from "../../generated/LiquidPool/LiquidPool";
9+
import { User, Claim, Interest, StakeChange, UnstakeFast, UnstakeLocked, StakingStats } from "../../generated/schema";
10+
11+
function getOrCreateUser(address: Address): User {
12+
let user = User.load(address.toHexString());
13+
if (!user) {
14+
user = new User(address.toHexString());
15+
user.address = address;
16+
user.stakedAmount = BigInt.fromI32(0);
17+
user.rewardsDebt = BigInt.fromI32(0);
18+
user.claimedRewards = BigInt.fromI32(0);
19+
user.lockedWithdraws = BigInt.fromI32(0);
20+
user.save();
21+
}
22+
return user as User;
23+
}
24+
25+
function getOrCreateStakingStats(): StakingStats {
26+
let stats = StakingStats.load("1");
27+
if (!stats) {
28+
stats = new StakingStats("1");
29+
stats.totalStaked = BigInt.fromI32(0);
30+
stats.totalRewards = BigInt.fromI32(0);
31+
stats.totalRewardsDebt = BigInt.fromI32(0);
32+
stats.interestRate = BigInt.fromI32(0);
33+
stats.interestPeriod = BigInt.fromI32(0);
34+
stats.minStakeValue = BigInt.fromI32(0);
35+
stats.unstakeLockTime = BigInt.fromI32(0);
36+
stats.fastUnstakePenalty = BigInt.fromI32(0);
37+
stats.save();
38+
}
39+
return stats as StakingStats;
40+
}
41+
42+
export function handleClaim(event: ClaimEvent): void {
43+
const user = getOrCreateUser(event.params.account);
44+
const claim = new Claim(event.transaction.hash.toHexString() + "-" + event.logIndex.toString());
45+
claim.user = user.id;
46+
claim.ambAmount = event.params.ambAmount;
47+
claim.bondAmount = event.params.bondAmount;
48+
claim.timestamp = event.block.timestamp;
49+
claim.save();
50+
51+
user.claimedRewards = user.claimedRewards.plus(event.params.ambAmount).plus(event.params.bondAmount);
52+
user.save();
53+
54+
const stats = getOrCreateStakingStats();
55+
stats.totalRewards = stats.totalRewards.plus(event.params.ambAmount).plus(event.params.bondAmount);
56+
stats.save();
57+
}
58+
59+
export function handleInterest(event: InterestEvent): void {
60+
const interest = new Interest(event.transaction.hash.toHexString() + "-" + event.logIndex.toString());
61+
interest.amount = event.params.amount;
62+
interest.timestamp = event.block.timestamp;
63+
interest.save();
64+
65+
const stats = getOrCreateStakingStats();
66+
stats.interestRate = event.params.amount;
67+
stats.save();
68+
}
69+
70+
export function handleStakeChanged(event: StakeChangedEvent): void {
71+
const user = getOrCreateUser(event.params.account);
72+
const stakeChange = new StakeChange(event.transaction.hash.toHexString() + "-" + event.logIndex.toString());
73+
stakeChange.user = user.id;
74+
stakeChange.amount = event.params.amount.abs();
75+
stakeChange.isStake = event.params.amount.gt(BigInt.fromI32(0));
76+
stakeChange.timestamp = event.block.timestamp;
77+
stakeChange.save();
78+
79+
user.stakedAmount = user.stakedAmount.plus(event.params.amount);
80+
if (stakeChange.isStake) {
81+
user.lastStakeTime = event.block.timestamp;
82+
} else {
83+
user.lastUnstakeTime = event.block.timestamp;
84+
}
85+
user.save();
86+
87+
const stats = getOrCreateStakingStats();
88+
stats.totalStaked = stats.totalStaked.plus(event.params.amount);
89+
stats.save();
90+
}
91+
92+
export function handleUnstakeFast(event: UnstakeFastEvent): void {
93+
const user = getOrCreateUser(event.params.account);
94+
const unstakeFast = new UnstakeFast(event.transaction.hash.toHexString() + "-" + event.logIndex.toString());
95+
unstakeFast.user = user.id;
96+
unstakeFast.amount = event.params.amount;
97+
unstakeFast.penalty = event.params.penalty;
98+
unstakeFast.timestamp = event.block.timestamp;
99+
unstakeFast.save();
100+
101+
user.stakedAmount = user.stakedAmount.minus(event.params.amount);
102+
user.lastUnstakeTime = event.block.timestamp;
103+
user.save();
104+
105+
const stats = getOrCreateStakingStats();
106+
stats.totalStaked = stats.totalStaked.minus(event.params.amount);
107+
stats.fastUnstakePenalty = event.params.penalty;
108+
stats.save();
109+
}
110+
111+
export function handleUnstakeLocked(event: UnstakeLockedEvent): void {
112+
const user = getOrCreateUser(event.params.account);
113+
const unstakeLocked = new UnstakeLocked(event.transaction.hash.toHexString() + "-" + event.logIndex.toString());
114+
unstakeLocked.user = user.id;
115+
unstakeLocked.amount = event.params.amount;
116+
unstakeLocked.unlockTime = event.params.unlockTime;
117+
unstakeLocked.creationTime = event.params.creationTime;
118+
unstakeLocked.save();
119+
120+
user.lockedWithdraws = user.lockedWithdraws.plus(event.params.amount);
121+
user.save();
122+
123+
const stats = getOrCreateStakingStats();
124+
stats.unstakeLockTime = event.params.unlockTime.minus(event.params.creationTime);
125+
stats.save();
126+
}

subgraphs/liquid_staking/subgraph.yaml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,37 @@ dataSources:
2929
- event: NodeRetired(indexed uint256,indexed address,uint256)
3030
handler: handleNodeRetired
3131
file: ./src/mapping/liquidNodesManager.ts
32+
- kind: ethereum/contract
33+
name: LiquidPool
34+
network: https://network.ambrosus.io
35+
source:
36+
address: "0x1234567890123456789012345678901234567890"
37+
abi: LiquidPool
38+
mapping:
39+
kind: ethereum/events
40+
apiVersion: 0.0.7
41+
language: wasm/assemblyscript
42+
entities:
43+
- User
44+
- Claim
45+
- Interest
46+
- StakeChange
47+
- UnstakeFast
48+
- UnstakeLocked
49+
- StakingStats
50+
abis:
51+
- name: LiquidPool
52+
file: ./abis/LiquidPool.json
53+
eventHandlers:
54+
- event: Claim(indexed address,uint256,uint256)
55+
handler: handleClaim
56+
- event: Interest(uint256)
57+
handler: handleInterest
58+
- event: StakeChanged(indexed address,int256)
59+
handler: handleStakeChanged
60+
- event: UnstakeFast(indexed address,uint256,uint256)
61+
handler: handleUnstakeFast
62+
- event: UnstakeLocked(indexed address,uint256,uint256,uint256)
63+
handler: handleUnstakeLocked
64+
file: ./src/mapping/liquidPool.ts
65+

0 commit comments

Comments
 (0)