Skip to content

Commit 74bafbf

Browse files
authored
fix: saturate vaultInvestOrders and vaultRedeemOrders at zero (#261)
1 parent 5224e80 commit 74bafbf

3 files changed

Lines changed: 43 additions & 12 deletions

File tree

src/helpers/bigintMath.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Returns the minimum value from a list of bigints.
3+
* @param values - The list of bigints to find the minimum value of.
4+
* @returns The minimum value from the list of bigints.
5+
*/
6+
export function bigintMin(...values: bigint[]) {
7+
return values.reduce((min, value) => (value < min ? value : min), values[0] ?? 0n);
8+
}
9+
10+
/**
11+
* Returns the maximum value from a list of bigints.
12+
* @param values - The list of bigints to find the maximum value of.
13+
* @returns The maximum value from the list of bigints.
14+
*/
15+
export function bigintMax(...values: bigint[]) {
16+
return values.reduce((max, value) => (value > max ? value : max), values[0] ?? 0n);
17+
}

src/services/VaultInvestOrderService.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { VaultInvestOrder } from "ponder:schema";
22
import type { Event } from "ponder:registry";
33
import { Service, mixinCommonStatics } from "./Service";
44
import { serviceLog } from "../helpers/logger";
5+
import { bigintMax } from "../helpers/bigintMath";
56

67
/**
78
* Service class for managing VaultInvestOrder entities.
@@ -23,8 +24,9 @@ export class VaultInvestOrderService extends mixinCommonStatics(
2324
*/
2425
public depositRequest(requestedAssetsAmount: bigint) {
2526
serviceLog(`Adding requested assets amount ${requestedAssetsAmount} to vault invest order`);
26-
this.data.requestedAssetsAmount =
27-
(this.data.requestedAssetsAmount ?? 0n) + requestedAssetsAmount;
27+
const previousRequestedAssetsAmount = this.data.requestedAssetsAmount ?? 0n;
28+
const newRequestedAssetsAmount = previousRequestedAssetsAmount + requestedAssetsAmount;
29+
this.data.requestedAssetsAmount = newRequestedAssetsAmount;
2830
return this;
2931
}
3032

@@ -35,8 +37,9 @@ export class VaultInvestOrderService extends mixinCommonStatics(
3537
*/
3638
public claimableDeposit(claimableAssetsAmount: bigint) {
3739
serviceLog(`Adding claimable assets amount ${claimableAssetsAmount} to vault invest order`);
38-
this.data.claimableAssetsAmount =
39-
(this.data.claimableAssetsAmount ?? 0n) + claimableAssetsAmount;
40+
const previousClaimableAssetsAmount = this.data.claimableAssetsAmount ?? 0n;
41+
const newClaimableAssetsAmount = previousClaimableAssetsAmount + claimableAssetsAmount;
42+
this.data.claimableAssetsAmount = newClaimableAssetsAmount;
4043
return this;
4144
}
4245

@@ -47,8 +50,12 @@ export class VaultInvestOrderService extends mixinCommonStatics(
4750
*/
4851
public deposit(assetsAmount: bigint) {
4952
serviceLog(`Depositing assets amount ${assetsAmount} into vault invest order`);
50-
this.data.requestedAssetsAmount = (this.data.requestedAssetsAmount ?? 0n) - assetsAmount;
51-
this.data.claimableAssetsAmount = (this.data.claimableAssetsAmount ?? 0n) - assetsAmount;
53+
const previousRequestedAssetsAmount = this.data.requestedAssetsAmount ?? 0n;
54+
const newRequestedAssetsAmount = previousRequestedAssetsAmount - assetsAmount;
55+
this.data.requestedAssetsAmount = bigintMax(newRequestedAssetsAmount, 0n);
56+
const previousClaimableAssetsAmount = this.data.claimableAssetsAmount ?? 0n;
57+
const newClaimableAssetsAmount = previousClaimableAssetsAmount - assetsAmount;
58+
this.data.claimableAssetsAmount = bigintMax(newClaimableAssetsAmount, 0n);
5259
return this;
5360
}
5461

src/services/VaultRedeemOrderService.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Event } from "ponder:registry";
22
import { VaultRedeemOrder } from "ponder:schema";
33
import { Service, mixinCommonStatics } from "./Service";
44
import { serviceLog } from "../helpers/logger";
5+
import { bigintMax } from "../helpers/bigintMath";
56

67
/**
78
* Service class for managing VaultRedeem entities.
@@ -23,8 +24,9 @@ export class VaultRedeemOrderService extends mixinCommonStatics(
2324
*/
2425
public redeemRequest(requestedSharesAmount: bigint) {
2526
serviceLog(`Adding requested shares amount ${requestedSharesAmount} to vault redeem order`);
26-
this.data.requestedSharesAmount =
27-
(this.data.requestedSharesAmount ?? 0n) + requestedSharesAmount;
27+
const previousRequestedSharesAmount = this.data.requestedSharesAmount ?? 0n;
28+
const newRequestedSharesAmount = previousRequestedSharesAmount + requestedSharesAmount;
29+
this.data.requestedSharesAmount = newRequestedSharesAmount;
2830
return this;
2931
}
3032

@@ -35,8 +37,9 @@ export class VaultRedeemOrderService extends mixinCommonStatics(
3537
*/
3638
public claimableRedeem(claimableSharesAmount: bigint) {
3739
serviceLog(`Adding claimable shares amount ${claimableSharesAmount} to vault redeem order`);
38-
this.data.claimableSharesAmount =
39-
(this.data.claimableSharesAmount ?? 0n) + claimableSharesAmount;
40+
const previousClaimableSharesAmount = this.data.claimableSharesAmount ?? 0n;
41+
const newClaimableSharesAmount = previousClaimableSharesAmount + claimableSharesAmount;
42+
this.data.claimableSharesAmount = newClaimableSharesAmount;
4043
return this;
4144
}
4245

@@ -47,8 +50,12 @@ export class VaultRedeemOrderService extends mixinCommonStatics(
4750
*/
4851
public redeem(sharesAmount: bigint) {
4952
serviceLog(`Redeeming shares amount ${sharesAmount} from vault redeem order`);
50-
this.data.requestedSharesAmount = (this.data.requestedSharesAmount ?? 0n) - sharesAmount;
51-
this.data.claimableSharesAmount = (this.data.claimableSharesAmount ?? 0n) - sharesAmount;
53+
const previousRequestedSharesAmount = this.data.requestedSharesAmount ?? 0n;
54+
const newRequestedSharesAmount = previousRequestedSharesAmount - sharesAmount;
55+
this.data.requestedSharesAmount = bigintMax(newRequestedSharesAmount, 0n);
56+
const previousClaimableSharesAmount = this.data.claimableSharesAmount ?? 0n;
57+
const newClaimableSharesAmount = previousClaimableSharesAmount - sharesAmount;
58+
this.data.claimableSharesAmount = bigintMax(newClaimableSharesAmount, 0n);
5259
return this;
5360
}
5461

0 commit comments

Comments
 (0)