From 404bee459f3eda39e74ae748939d85bd2385c2b0 Mon Sep 17 00:00:00 2001 From: Ed Noepel Date: Fri, 18 Aug 2023 16:59:53 -0400 Subject: [PATCH 1/3] enable querying lends by bucketId --- schema.graphql | 2 ++ src/erc-20-pool.ts | 8 ++++---- src/erc-721-pool.ts | 10 +++++----- src/mappings/base/base-pool.ts | 12 ++++++------ src/position-manager.ts | 4 ++-- src/utils/pool/lend.ts | 5 +++-- tests/position-manager.test.ts | 3 ++- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/schema.graphql b/schema.graphql index 7601163..c773bb6 100644 --- a/schema.graphql +++ b/schema.graphql @@ -161,6 +161,8 @@ type Lend @entity { id: Bytes! # bucket to which a lend was made bucket: Bucket! + # index of the bucket, for querying + bucketIndex: Int! # pool address poolAddress: String! # address of the lender diff --git a/src/erc-20-pool.ts b/src/erc-20-pool.ts index 4c18ff1..93066f9 100644 --- a/src/erc-20-pool.ts +++ b/src/erc-20-pool.ts @@ -108,7 +108,7 @@ export function handleAddCollateral(event: AddCollateralEvent): void { // update lend state const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, addCollateral.actor) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, addCollateral.actor) lend.depositTime = addCollateral.blockTimestamp lend.lpb = lend.lpb.plus(addCollateral.lpAwarded) lend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, lend.lpb) @@ -323,7 +323,7 @@ export function handleBucketTake(event: BucketTakeEvent): void { const lpAwardedId = event.transaction.hash.concatI32(event.logIndex.toI32() - 1); const bucketTakeLpAwarded = BucketTakeLPAwarded.load(lpAwardedId)! const kickerLendId = getLendId(bucketId, bucketTakeLpAwarded.kicker) - const kickerLend = loadOrCreateLend(bucketId, kickerLendId, pool.id, bucketTakeLpAwarded.kicker) + const kickerLend = loadOrCreateLend(bucketId, kickerLendId, pool.id, bucket.bucketIndex, bucketTakeLpAwarded.kicker) kickerLend.depositTime = bucketTake.blockTimestamp kickerLend.lpb = kickerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedTaker) kickerLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, kickerLend.lpb) @@ -336,7 +336,7 @@ export function handleBucketTake(event: BucketTakeEvent): void { // update lend state for taker const takerLendId = getLendId(bucketId, bucketTakeLpAwarded.taker) - const takerLend = loadOrCreateLend(bucketId, takerLendId, pool.id, bucketTakeLpAwarded.taker) + const takerLend = loadOrCreateLend(bucketId, takerLendId, pool.id, bucket.bucketIndex, bucketTakeLpAwarded.taker) takerLend.depositTime = bucketTake.blockTimestamp takerLend.lpb = takerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedTaker) takerLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, takerLend.lpb) @@ -611,7 +611,7 @@ export function handleRemoveCollateral(event: RemoveCollateralEvent): void { // update lend state const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, removeCollateral.claimer) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, removeCollateral.claimer) if (removeCollateral.lpRedeemed.le(lend.lpb)) { lend.lpb = lend.lpb.minus(removeCollateral.lpRedeemed) } else { diff --git a/src/erc-721-pool.ts b/src/erc-721-pool.ts index 0a55b3e..df15fa0 100644 --- a/src/erc-721-pool.ts +++ b/src/erc-721-pool.ts @@ -255,7 +255,7 @@ export function handleAddCollateralNFT(event: AddCollateralNFTEvent): void { // update lend state const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, addCollateralNFT.actor) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, addCollateralNFT.actor) lend.depositTime = addCollateralNFT.blockTimestamp lend.lpb = lend.lpb.plus(addCollateralNFT.lpAwarded) lend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, lend.lpb) @@ -374,7 +374,7 @@ export function handleRemoveCollateral(event: RemoveCollateralEvent): void { account.txCount = account.txCount.plus(ONE_BI) const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, removeCollateral.claimer) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, removeCollateral.claimer) if (removeCollateral.lpRedeemed.le(lend.lpb)){ lend.lpb = lend.lpb.minus(removeCollateral.lpRedeemed) } else { @@ -467,7 +467,7 @@ export function handleMergeOrRemoveCollateralNFT( // update lend state const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, event.params.actor) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, event.params.actor) lend.depositTime = mergeOrRemove.blockTimestamp lend.lpb = wadToDecimal(getLenderInfoERC721Pool(pool.id, index, event.params.actor).lpBalance) lend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, lend.lpb) @@ -773,7 +773,7 @@ export function handleBucketTake(event: BucketTakeEvent): void { const lpAwardedId = event.transaction.hash.concatI32(event.logIndex.toI32() - 1); const bucketTakeLpAwarded = BucketTakeLPAwarded.load(lpAwardedId)! const kickerLendId = getLendId(bucketId, bucketTakeLpAwarded.kicker) - const kickerLend = loadOrCreateLend(bucketId, kickerLendId, pool.id, bucketTakeLpAwarded.kicker) + const kickerLend = loadOrCreateLend(bucketId, kickerLendId, pool.id, bucket.bucketIndex, bucketTakeLpAwarded.kicker) kickerLend.depositTime = bucketTake.blockTimestamp kickerLend.lpb = kickerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedTaker) kickerLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, kickerLend.lpb) @@ -786,7 +786,7 @@ export function handleBucketTake(event: BucketTakeEvent): void { // update lend state for taker const takerLendId = getLendId(bucketId, bucketTakeLpAwarded.taker) - const takerLend = loadOrCreateLend(bucketId, takerLendId, pool.id, bucketTakeLpAwarded.taker) + const takerLend = loadOrCreateLend(bucketId, takerLendId, pool.id, bucket.bucketIndex, bucketTakeLpAwarded.taker) takerLend.depositTime = bucketTake.blockTimestamp takerLend.lpb = takerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedTaker) takerLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, takerLend.lpb) diff --git a/src/mappings/base/base-pool.ts b/src/mappings/base/base-pool.ts index bbb3396..fb3722f 100644 --- a/src/mappings/base/base-pool.ts +++ b/src/mappings/base/base-pool.ts @@ -104,7 +104,7 @@ export function _handleAddQuoteToken(erc20Event: AddQuoteTokenERC20Event | null, // update lend state const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, addQuoteToken.lender) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, addQuoteToken.lender) lend.depositTime = blockTimestamp lend.lpb = lend.lpb.plus(addQuoteToken.lpAwarded) lend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, lend.lpb) @@ -211,7 +211,7 @@ export function _handleMoveQuoteToken(erc20Event: MoveQuoteTokenERC20Event | nul // update from bucket lend state const fromBucketLendId = getLendId(fromBucketId, lender) - const fromBucketLend = loadOrCreateLend(fromBucketId, fromBucketLendId, pool.id, moveQuoteToken.lender) + const fromBucketLend = loadOrCreateLend(fromBucketId, fromBucketLendId, pool.id, fromBucket.bucketIndex, moveQuoteToken.lender) if (moveQuoteToken.lpRedeemedFrom.le(fromBucketLend.lpb)) { fromBucketLend.lpb = fromBucketLend.lpb.minus(moveQuoteToken.lpRedeemedFrom) } else { @@ -223,7 +223,7 @@ export function _handleMoveQuoteToken(erc20Event: MoveQuoteTokenERC20Event | nul // update to bucket lend state const toBucketLendId = getLendId(toBucketId, lender) - const toBucketLend = loadOrCreateLend(toBucketId, toBucketLendId, pool.id, moveQuoteToken.lender) + const toBucketLend = loadOrCreateLend(toBucketId, toBucketLendId, pool.id, toBucket.bucketIndex, moveQuoteToken.lender) toBucketLend.depositTime = getDepositTime(fromBucketLend.depositTime, toBucketLend) toBucketLend.lpb = toBucketLend.lpb.plus(wadToDecimal(lpAwardedTo)) toBucketLend.lpbValueInQuote = lpbValueInQuote(pool.id, toBucket.bucketIndex, toBucketLend.lpb) @@ -327,7 +327,7 @@ export function _handleRemoveQuoteToken(erc20Event: RemoveQuoteTokenERC20Event | // update lend state const lendId = getLendId(bucketId, accountId) - const lend = loadOrCreateLend(bucketId, lendId, pool.id, removeQuote.lender) + const lend = loadOrCreateLend(bucketId, lendId, pool.id, bucket.bucketIndex, removeQuote.lender) if (removeQuote.lpRedeemed.le(lend.lpb)) { lend.lpb = lend.lpb.minus(removeQuote.lpRedeemed) } else { @@ -425,7 +425,7 @@ export function _handleTransferLP(erc20Event: TransferLPERC20Event | null, erc72 // event does not reveal LP amounts transferred for each bucket, so query the pool and update // remove old lend - const oldLend = loadOrCreateLend(bucketId, oldLendId, pool.id, transferLP.owner) + const oldLend = loadOrCreateLend(bucketId, oldLendId, pool.id, bucketIndex.toU32(), transferLP.owner) oldLend.lpb = wadToDecimal(getLenderInfo(pool.id, bucketIndex, owner).lpBalance) oldLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, oldLend.lpb) oldLend.save() @@ -433,7 +433,7 @@ export function _handleTransferLP(erc20Event: TransferLPERC20Event | null, erc72 updateBucketLends(bucket, oldLendId) // add new lend - const newLend = loadOrCreateLend(bucketId, newLendId, pool.id, transferLP.newOwner) + const newLend = loadOrCreateLend(bucketId, newLendId, pool.id, bucketIndex.toU32(), transferLP.newOwner) const newLendInfo = getLenderInfo(pool.id, bucketIndex, newOwner) newLend.depositTime = newLendInfo.depositTime newLend.lpb = wadToDecimal(newLendInfo.lpBalance) diff --git a/src/position-manager.ts b/src/position-manager.ts index e8dd775..8f0084c 100644 --- a/src/position-manager.ts +++ b/src/position-manager.ts @@ -156,10 +156,10 @@ export function handleMoveLiquidity(event: MoveLiquidityEvent): void { const bucketIdFrom = getBucketId(moveLiquidity.pool, moveLiquidity.fromIndex) const lendIdFrom = getLendId(bucketIdFrom, moveLiquidity.lender) - const lendFrom = loadOrCreateLend(bucketIdFrom, lendIdFrom, moveLiquidity.pool, moveLiquidity.lender) + const lendFrom = loadOrCreateLend(bucketIdFrom, lendIdFrom, moveLiquidity.pool, moveLiquidity.fromIndex, moveLiquidity.lender) const bucketIdTo = getBucketId(moveLiquidity.pool, moveLiquidity.toIndex) const lendIdTo = getLendId(bucketIdTo, moveLiquidity.lender) - const lendTo = loadOrCreateLend(bucketIdTo, lendIdTo, moveLiquidity.pool, moveLiquidity.lender) + const lendTo = loadOrCreateLend(bucketIdTo, lendIdTo, moveLiquidity.pool, moveLiquidity.toIndex, moveLiquidity.lender) const lendToInfo = getLenderInfo(moveLiquidity.pool, event.params.toIndex, Address.fromBytes(lendTo.lender)) lendTo.depositTime = lendToInfo.depositTime diff --git a/src/utils/pool/lend.ts b/src/utils/pool/lend.ts index dcdf91c..6b3e45a 100644 --- a/src/utils/pool/lend.ts +++ b/src/utils/pool/lend.ts @@ -1,5 +1,5 @@ import { Address, BigDecimal, BigInt, Bytes, dataSource } from "@graphprotocol/graph-ts" -import { Lend } from "../../../generated/schema" +import { Bucket, Lend } from "../../../generated/schema" import { PoolInfoUtils } from "../../../generated/templates/ERC20Pool/PoolInfoUtils" import { poolInfoUtilsAddressTable, ZERO_BD, ZERO_BI } from "../constants" @@ -14,13 +14,14 @@ export function getLendId(bucketId: Bytes, accountId: Bytes): Bytes { return bucketId.concat(Bytes.fromUTF8('|').concat(accountId)) } -export function loadOrCreateLend(bucketId: Bytes, lendId: Bytes, poolId: Bytes, lender: Bytes): Lend { +export function loadOrCreateLend(bucketId: Bytes, lendId: Bytes, poolId: Bytes, bucketIndex: u32, lender: Bytes): Lend { let lend = Lend.load(lendId) if (lend == null) { // create new lend if one already been stored lend = new Lend(lendId) as Lend lend.bucket = bucketId + lend.bucketIndex = bucketIndex lend.depositTime = ZERO_BI lend.lender = lender lend.pool = poolId diff --git a/tests/position-manager.test.ts b/tests/position-manager.test.ts index 18c4bf6..d8b7124 100644 --- a/tests/position-manager.test.ts +++ b/tests/position-manager.test.ts @@ -15,7 +15,7 @@ import { assertPosition, createApprovalEvent, createBurnEvent, createMemorialize import { bigIntToBytes, wadToDecimal } from "../src/utils/convert" import { create721Pool, mockGetLPBValueInQuote, mockGetLenderInfo, mockGetPoolKey, mockGetTokenName, mockGetTokenSymbol } from "./utils/common" import { Lend } from "../generated/schema" -import { getLendId, loadOrCreateLend } from "../src/utils/pool/lend" +import { getLendId } from "../src/utils/pool/lend" import { getBucketId } from "../src/utils/pool/bucket" import { FIVE_PERCENT_BI, ZERO_BI } from "../src/utils/constants" @@ -277,6 +277,7 @@ describe("Describe entity assertions", () => { const bucketId = getBucketId(pool, fromIndex.toU32()) const lend = new Lend(getLendId(bucketId, lender)) lend.bucket = bucketId + lend.bucketIndex = fromIndex.toU32() lend.depositTime = BigInt.fromI32(1000) lend.lender = lender lend.pool = pool From aefe9769862e5b808b0aa3f8d123fcf996fc1187 Mon Sep 17 00:00:00 2001 From: Ed Noepel Date: Fri, 18 Aug 2023 21:39:25 -0400 Subject: [PATCH 2/3] award kicker LP to kicker --- src/erc-20-pool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/erc-20-pool.ts b/src/erc-20-pool.ts index 93066f9..9022c56 100644 --- a/src/erc-20-pool.ts +++ b/src/erc-20-pool.ts @@ -325,7 +325,7 @@ export function handleBucketTake(event: BucketTakeEvent): void { const kickerLendId = getLendId(bucketId, bucketTakeLpAwarded.kicker) const kickerLend = loadOrCreateLend(bucketId, kickerLendId, pool.id, bucket.bucketIndex, bucketTakeLpAwarded.kicker) kickerLend.depositTime = bucketTake.blockTimestamp - kickerLend.lpb = kickerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedTaker) + kickerLend.lpb = kickerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedKicker) kickerLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, kickerLend.lpb) updateBucketLends(bucket, kickerLendId) From 8f46dfe0e357d6c1599f1f99e367de0049eed02a Mon Sep 17 00:00:00 2001 From: Ed Noepel Date: Fri, 18 Aug 2023 22:04:04 -0400 Subject: [PATCH 3/3] same fix for nft pools --- src/erc-721-pool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/erc-721-pool.ts b/src/erc-721-pool.ts index df15fa0..1c20453 100644 --- a/src/erc-721-pool.ts +++ b/src/erc-721-pool.ts @@ -775,7 +775,7 @@ export function handleBucketTake(event: BucketTakeEvent): void { const kickerLendId = getLendId(bucketId, bucketTakeLpAwarded.kicker) const kickerLend = loadOrCreateLend(bucketId, kickerLendId, pool.id, bucket.bucketIndex, bucketTakeLpAwarded.kicker) kickerLend.depositTime = bucketTake.blockTimestamp - kickerLend.lpb = kickerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedTaker) + kickerLend.lpb = kickerLend.lpb.plus(bucketTakeLpAwarded.lpAwardedKicker) kickerLend.lpbValueInQuote = lpbValueInQuote(pool.id, bucket.bucketIndex, kickerLend.lpb) updateBucketLends(bucket, kickerLendId)