@pump-fun/pump-sdk 1.7.0-devnet.1 → 1.8.0-devnet.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -3959,20 +3959,64 @@ import BN3 from "bn.js";
3959
3959
 
3960
3960
  // src/tokenIncentives.ts
3961
3961
  import BN2 from "bn.js";
3962
+ function totalUnclaimedTokens(globalVolumeAccumulator, userVolumeAccumulator, currentTimestamp = Date.now() / 1e3) {
3963
+ const { startTime, endTime, secondsInADay, totalTokenSupply, solVolumes } = globalVolumeAccumulator;
3964
+ const { totalUnclaimedTokens: totalUnclaimedTokens2, currentSolVolume, lastUpdateTimestamp } = userVolumeAccumulator;
3965
+ const result = totalUnclaimedTokens2;
3966
+ if (startTime.eqn(0) || endTime.eqn(0) || secondsInADay.eqn(0)) {
3967
+ return result;
3968
+ }
3969
+ let currentTimestampBn = new BN2(currentTimestamp);
3970
+ if (currentTimestampBn.lt(startTime)) {
3971
+ return result;
3972
+ }
3973
+ const currentDayIndex = currentTimestampBn.sub(startTime).div(secondsInADay).toNumber();
3974
+ if (lastUpdateTimestamp.lt(startTime)) {
3975
+ return result;
3976
+ }
3977
+ const lastUpdatedIndex = lastUpdateTimestamp.sub(startTime).div(secondsInADay).toNumber();
3978
+ if (endTime.lt(startTime)) {
3979
+ return result;
3980
+ }
3981
+ const endDayIndex = endTime.sub(startTime).div(secondsInADay).toNumber();
3982
+ if (currentDayIndex > lastUpdatedIndex && lastUpdatedIndex <= endDayIndex) {
3983
+ const lastUpdatedDayTokenSupply = totalTokenSupply[lastUpdatedIndex];
3984
+ const lastUpdatedDaySolVolume = solVolumes[lastUpdatedIndex];
3985
+ if (lastUpdatedDaySolVolume.eqn(0)) {
3986
+ return result;
3987
+ }
3988
+ return result.add(
3989
+ currentSolVolume.mul(lastUpdatedDayTokenSupply).div(lastUpdatedDaySolVolume)
3990
+ );
3991
+ }
3992
+ return result;
3993
+ }
3962
3994
  function currentDayTokens(globalVolumeAccumulator, userVolumeAccumulator, currentTimestamp = Date.now() / 1e3) {
3963
- const { startTime, endTime } = globalVolumeAccumulator;
3995
+ const { startTime, endTime, secondsInADay, totalTokenSupply, solVolumes } = globalVolumeAccumulator;
3996
+ const { currentSolVolume, lastUpdateTimestamp } = userVolumeAccumulator;
3997
+ if (startTime.eqn(0) || endTime.eqn(0) || secondsInADay.eqn(0)) {
3998
+ return new BN2(0);
3999
+ }
3964
4000
  let currentTimestampBn = new BN2(currentTimestamp);
3965
4001
  if (currentTimestampBn.lt(startTime) || currentTimestampBn.gt(endTime)) {
3966
4002
  return new BN2(0);
3967
4003
  }
3968
- const { secondsInADay, totalTokenSupply, solVolumes } = globalVolumeAccumulator;
3969
- let currentDayIndex = currentTimestampBn.sub(startTime).div(secondsInADay).toNumber();
3970
- let currentDayTokenSupply = totalTokenSupply[currentDayIndex];
3971
- let currentDaySolVolume = solVolumes[currentDayIndex];
4004
+ const currentDayIndex = currentTimestampBn.sub(startTime).div(secondsInADay).toNumber();
4005
+ if (lastUpdateTimestamp.lt(startTime)) {
4006
+ return new BN2(0);
4007
+ }
4008
+ const lastUpdatedIndex = lastUpdateTimestamp.sub(startTime).div(secondsInADay).toNumber();
4009
+ if (endTime.lt(startTime)) {
4010
+ return new BN2(0);
4011
+ }
4012
+ if (currentDayIndex !== lastUpdatedIndex) {
4013
+ return new BN2(0);
4014
+ }
4015
+ const currentDayTokenSupply = totalTokenSupply[currentDayIndex];
4016
+ const currentDaySolVolume = solVolumes[currentDayIndex];
3972
4017
  if (currentDaySolVolume.eqn(0)) {
3973
4018
  return new BN2(0);
3974
4019
  }
3975
- const { currentSolVolume } = userVolumeAccumulator;
3976
4020
  return currentSolVolume.mul(currentDayTokenSupply).div(currentDaySolVolume);
3977
4021
  }
3978
4022
 
@@ -4384,6 +4428,28 @@ var PumpSdk = class {
4384
4428
  )
4385
4429
  ];
4386
4430
  }
4431
+ async getTotalUnclaimedTokens(user) {
4432
+ const [
4433
+ globalVolumeAccumulatorAccountInfo,
4434
+ userVolumeAccumulatorAccountInfo
4435
+ ] = await this.connection.getMultipleAccountsInfo([
4436
+ globalVolumeAccumulatorPda()[0],
4437
+ userVolumeAccumulatorPda(user)[0]
4438
+ ]);
4439
+ if (!globalVolumeAccumulatorAccountInfo || !userVolumeAccumulatorAccountInfo) {
4440
+ return new BN3(0);
4441
+ }
4442
+ const globalVolumeAccumulator = this.decodeGlobalVolumeAccumulator(
4443
+ globalVolumeAccumulatorAccountInfo
4444
+ );
4445
+ const userVolumeAccumulator = this.decodeUserVolumeAccumulator(
4446
+ userVolumeAccumulatorAccountInfo
4447
+ );
4448
+ return totalUnclaimedTokens(
4449
+ globalVolumeAccumulator,
4450
+ userVolumeAccumulator
4451
+ ).add(await this.pumpAmmSdk.getCurrentDayTokens(user));
4452
+ }
4387
4453
  async getCurrentDayTokens(user) {
4388
4454
  const [
4389
4455
  globalVolumeAccumulatorAccountInfo,
@@ -4471,6 +4537,7 @@ export {
4471
4537
  bondingCurvePda,
4472
4538
  canonicalPumpPoolPda,
4473
4539
  creatorVaultPda,
4540
+ currentDayTokens,
4474
4541
  getBuySolAmountFromTokenAmount,
4475
4542
  getBuyTokenAmountFromSolAmount,
4476
4543
  getPumpProgram,
@@ -4480,5 +4547,6 @@ export {
4480
4547
  newBondingCurve,
4481
4548
  pump_default as pumpIdl,
4482
4549
  pumpPoolAuthorityPda,
4550
+ totalUnclaimedTokens,
4483
4551
  userVolumeAccumulatorPda
4484
4552
  };
package/dist/index.d.mts CHANGED
@@ -7904,7 +7904,11 @@ declare class PumpSdk {
7904
7904
  getCreatorVaultBalance(creator: PublicKey): Promise<BN>;
7905
7905
  adminUpdateTokenIncentives(startTime: BN, endTime: BN, dayNumber: BN, tokenSupplyPerDay: BN, secondsInADay?: BN, mint?: PublicKey, tokenProgram?: PublicKey): Promise<TransactionInstruction[]>;
7906
7906
  claimTokenIncentives(user: PublicKey, payer: PublicKey, mint?: PublicKey, tokenProgram?: PublicKey): Promise<TransactionInstruction[]>;
7907
+ getTotalUnclaimedTokens(user: PublicKey): Promise<BN>;
7907
7908
  getCurrentDayTokens(user: PublicKey): Promise<BN>;
7908
7909
  }
7909
7910
 
7910
- export { BONDING_CURVE_NEW_SIZE, type BondingCurve, CANONICAL_POOL_INDEX, type Global, PUMP_AMM_PROGRAM_ID, PUMP_PROGRAM_ID, type Pump, PumpSdk, bondingCurvePda, canonicalPumpPoolPda, creatorVaultPda, getBuySolAmountFromTokenAmount, getBuyTokenAmountFromSolAmount, getPumpProgram, getSellSolAmountFromTokenAmount, globalPda, globalVolumeAccumulatorPda, newBondingCurve, pump as pumpIdl, pumpPoolAuthorityPda, userVolumeAccumulatorPda };
7911
+ declare function totalUnclaimedTokens(globalVolumeAccumulator: GlobalVolumeAccumulator, userVolumeAccumulator: UserVolumeAccumulator, currentTimestamp?: number): BN;
7912
+ declare function currentDayTokens(globalVolumeAccumulator: GlobalVolumeAccumulator, userVolumeAccumulator: UserVolumeAccumulator, currentTimestamp?: number): BN;
7913
+
7914
+ export { BONDING_CURVE_NEW_SIZE, type BondingCurve, CANONICAL_POOL_INDEX, type Global, PUMP_AMM_PROGRAM_ID, PUMP_PROGRAM_ID, type Pump, PumpSdk, bondingCurvePda, canonicalPumpPoolPda, creatorVaultPda, currentDayTokens, getBuySolAmountFromTokenAmount, getBuyTokenAmountFromSolAmount, getPumpProgram, getSellSolAmountFromTokenAmount, globalPda, globalVolumeAccumulatorPda, newBondingCurve, pump as pumpIdl, pumpPoolAuthorityPda, totalUnclaimedTokens, userVolumeAccumulatorPda };
package/dist/index.d.ts CHANGED
@@ -7904,7 +7904,11 @@ declare class PumpSdk {
7904
7904
  getCreatorVaultBalance(creator: PublicKey): Promise<BN>;
7905
7905
  adminUpdateTokenIncentives(startTime: BN, endTime: BN, dayNumber: BN, tokenSupplyPerDay: BN, secondsInADay?: BN, mint?: PublicKey, tokenProgram?: PublicKey): Promise<TransactionInstruction[]>;
7906
7906
  claimTokenIncentives(user: PublicKey, payer: PublicKey, mint?: PublicKey, tokenProgram?: PublicKey): Promise<TransactionInstruction[]>;
7907
+ getTotalUnclaimedTokens(user: PublicKey): Promise<BN>;
7907
7908
  getCurrentDayTokens(user: PublicKey): Promise<BN>;
7908
7909
  }
7909
7910
 
7910
- export { BONDING_CURVE_NEW_SIZE, type BondingCurve, CANONICAL_POOL_INDEX, type Global, PUMP_AMM_PROGRAM_ID, PUMP_PROGRAM_ID, type Pump, PumpSdk, bondingCurvePda, canonicalPumpPoolPda, creatorVaultPda, getBuySolAmountFromTokenAmount, getBuyTokenAmountFromSolAmount, getPumpProgram, getSellSolAmountFromTokenAmount, globalPda, globalVolumeAccumulatorPda, newBondingCurve, pump as pumpIdl, pumpPoolAuthorityPda, userVolumeAccumulatorPda };
7911
+ declare function totalUnclaimedTokens(globalVolumeAccumulator: GlobalVolumeAccumulator, userVolumeAccumulator: UserVolumeAccumulator, currentTimestamp?: number): BN;
7912
+ declare function currentDayTokens(globalVolumeAccumulator: GlobalVolumeAccumulator, userVolumeAccumulator: UserVolumeAccumulator, currentTimestamp?: number): BN;
7913
+
7914
+ export { BONDING_CURVE_NEW_SIZE, type BondingCurve, CANONICAL_POOL_INDEX, type Global, PUMP_AMM_PROGRAM_ID, PUMP_PROGRAM_ID, type Pump, PumpSdk, bondingCurvePda, canonicalPumpPoolPda, creatorVaultPda, currentDayTokens, getBuySolAmountFromTokenAmount, getBuyTokenAmountFromSolAmount, getPumpProgram, getSellSolAmountFromTokenAmount, globalPda, globalVolumeAccumulatorPda, newBondingCurve, pump as pumpIdl, pumpPoolAuthorityPda, totalUnclaimedTokens, userVolumeAccumulatorPda };
package/dist/index.js CHANGED
@@ -38,6 +38,7 @@ __export(index_exports, {
38
38
  bondingCurvePda: () => bondingCurvePda,
39
39
  canonicalPumpPoolPda: () => canonicalPumpPoolPda,
40
40
  creatorVaultPda: () => creatorVaultPda,
41
+ currentDayTokens: () => currentDayTokens,
41
42
  getBuySolAmountFromTokenAmount: () => getBuySolAmountFromTokenAmount,
42
43
  getBuyTokenAmountFromSolAmount: () => getBuyTokenAmountFromSolAmount,
43
44
  getPumpProgram: () => getPumpProgram,
@@ -47,6 +48,7 @@ __export(index_exports, {
47
48
  newBondingCurve: () => newBondingCurve,
48
49
  pumpIdl: () => pump_default,
49
50
  pumpPoolAuthorityPda: () => pumpPoolAuthorityPda,
51
+ totalUnclaimedTokens: () => totalUnclaimedTokens,
50
52
  userVolumeAccumulatorPda: () => userVolumeAccumulatorPda
51
53
  });
52
54
  module.exports = __toCommonJS(index_exports);
@@ -4004,20 +4006,64 @@ var import_bn3 = __toESM(require("bn.js"));
4004
4006
 
4005
4007
  // src/tokenIncentives.ts
4006
4008
  var import_bn2 = __toESM(require("bn.js"));
4009
+ function totalUnclaimedTokens(globalVolumeAccumulator, userVolumeAccumulator, currentTimestamp = Date.now() / 1e3) {
4010
+ const { startTime, endTime, secondsInADay, totalTokenSupply, solVolumes } = globalVolumeAccumulator;
4011
+ const { totalUnclaimedTokens: totalUnclaimedTokens2, currentSolVolume, lastUpdateTimestamp } = userVolumeAccumulator;
4012
+ const result = totalUnclaimedTokens2;
4013
+ if (startTime.eqn(0) || endTime.eqn(0) || secondsInADay.eqn(0)) {
4014
+ return result;
4015
+ }
4016
+ let currentTimestampBn = new import_bn2.default(currentTimestamp);
4017
+ if (currentTimestampBn.lt(startTime)) {
4018
+ return result;
4019
+ }
4020
+ const currentDayIndex = currentTimestampBn.sub(startTime).div(secondsInADay).toNumber();
4021
+ if (lastUpdateTimestamp.lt(startTime)) {
4022
+ return result;
4023
+ }
4024
+ const lastUpdatedIndex = lastUpdateTimestamp.sub(startTime).div(secondsInADay).toNumber();
4025
+ if (endTime.lt(startTime)) {
4026
+ return result;
4027
+ }
4028
+ const endDayIndex = endTime.sub(startTime).div(secondsInADay).toNumber();
4029
+ if (currentDayIndex > lastUpdatedIndex && lastUpdatedIndex <= endDayIndex) {
4030
+ const lastUpdatedDayTokenSupply = totalTokenSupply[lastUpdatedIndex];
4031
+ const lastUpdatedDaySolVolume = solVolumes[lastUpdatedIndex];
4032
+ if (lastUpdatedDaySolVolume.eqn(0)) {
4033
+ return result;
4034
+ }
4035
+ return result.add(
4036
+ currentSolVolume.mul(lastUpdatedDayTokenSupply).div(lastUpdatedDaySolVolume)
4037
+ );
4038
+ }
4039
+ return result;
4040
+ }
4007
4041
  function currentDayTokens(globalVolumeAccumulator, userVolumeAccumulator, currentTimestamp = Date.now() / 1e3) {
4008
- const { startTime, endTime } = globalVolumeAccumulator;
4042
+ const { startTime, endTime, secondsInADay, totalTokenSupply, solVolumes } = globalVolumeAccumulator;
4043
+ const { currentSolVolume, lastUpdateTimestamp } = userVolumeAccumulator;
4044
+ if (startTime.eqn(0) || endTime.eqn(0) || secondsInADay.eqn(0)) {
4045
+ return new import_bn2.default(0);
4046
+ }
4009
4047
  let currentTimestampBn = new import_bn2.default(currentTimestamp);
4010
4048
  if (currentTimestampBn.lt(startTime) || currentTimestampBn.gt(endTime)) {
4011
4049
  return new import_bn2.default(0);
4012
4050
  }
4013
- const { secondsInADay, totalTokenSupply, solVolumes } = globalVolumeAccumulator;
4014
- let currentDayIndex = currentTimestampBn.sub(startTime).div(secondsInADay).toNumber();
4015
- let currentDayTokenSupply = totalTokenSupply[currentDayIndex];
4016
- let currentDaySolVolume = solVolumes[currentDayIndex];
4051
+ const currentDayIndex = currentTimestampBn.sub(startTime).div(secondsInADay).toNumber();
4052
+ if (lastUpdateTimestamp.lt(startTime)) {
4053
+ return new import_bn2.default(0);
4054
+ }
4055
+ const lastUpdatedIndex = lastUpdateTimestamp.sub(startTime).div(secondsInADay).toNumber();
4056
+ if (endTime.lt(startTime)) {
4057
+ return new import_bn2.default(0);
4058
+ }
4059
+ if (currentDayIndex !== lastUpdatedIndex) {
4060
+ return new import_bn2.default(0);
4061
+ }
4062
+ const currentDayTokenSupply = totalTokenSupply[currentDayIndex];
4063
+ const currentDaySolVolume = solVolumes[currentDayIndex];
4017
4064
  if (currentDaySolVolume.eqn(0)) {
4018
4065
  return new import_bn2.default(0);
4019
4066
  }
4020
- const { currentSolVolume } = userVolumeAccumulator;
4021
4067
  return currentSolVolume.mul(currentDayTokenSupply).div(currentDaySolVolume);
4022
4068
  }
4023
4069
 
@@ -4429,6 +4475,28 @@ var PumpSdk = class {
4429
4475
  )
4430
4476
  ];
4431
4477
  }
4478
+ async getTotalUnclaimedTokens(user) {
4479
+ const [
4480
+ globalVolumeAccumulatorAccountInfo,
4481
+ userVolumeAccumulatorAccountInfo
4482
+ ] = await this.connection.getMultipleAccountsInfo([
4483
+ globalVolumeAccumulatorPda()[0],
4484
+ userVolumeAccumulatorPda(user)[0]
4485
+ ]);
4486
+ if (!globalVolumeAccumulatorAccountInfo || !userVolumeAccumulatorAccountInfo) {
4487
+ return new import_bn3.default(0);
4488
+ }
4489
+ const globalVolumeAccumulator = this.decodeGlobalVolumeAccumulator(
4490
+ globalVolumeAccumulatorAccountInfo
4491
+ );
4492
+ const userVolumeAccumulator = this.decodeUserVolumeAccumulator(
4493
+ userVolumeAccumulatorAccountInfo
4494
+ );
4495
+ return totalUnclaimedTokens(
4496
+ globalVolumeAccumulator,
4497
+ userVolumeAccumulator
4498
+ ).add(await this.pumpAmmSdk.getCurrentDayTokens(user));
4499
+ }
4432
4500
  async getCurrentDayTokens(user) {
4433
4501
  const [
4434
4502
  globalVolumeAccumulatorAccountInfo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pump-fun/pump-sdk",
3
- "version": "1.7.0-devnet.1",
3
+ "version": "1.8.0-devnet.1",
4
4
  "description": "Pump Bonding Curve SDK",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/pump-fun/pump-sdk#readme",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@coral-xyz/anchor": "^0.31.1",
42
- "@pump-fun/pump-swap-sdk": "^0.0.1-beta.82",
42
+ "@pump-fun/pump-swap-sdk": "^0.0.1-beta.85",
43
43
  "@solana/spl-token": "^0.4.13",
44
44
  "@solana/web3.js": "^1.98.2",
45
45
  "bn.js": "^5.2.2",
package/src/index.ts CHANGED
@@ -24,3 +24,4 @@ export {
24
24
  PumpSdk,
25
25
  } from "./sdk";
26
26
  export { Global, BondingCurve } from "./state";
27
+ export { totalUnclaimedTokens, currentDayTokens } from "./tokenIncentives";
package/src/sdk.ts CHANGED
@@ -33,7 +33,7 @@ import {
33
33
  GlobalVolumeAccumulator,
34
34
  UserVolumeAccumulator,
35
35
  } from "./state";
36
- import { currentDayTokens } from "./tokenIncentives";
36
+ import { currentDayTokens, totalUnclaimedTokens } from "./tokenIncentives";
37
37
 
38
38
  export function getPumpProgram(
39
39
  connection: Connection,
@@ -623,6 +623,35 @@ export class PumpSdk {
623
623
  ];
624
624
  }
625
625
 
626
+ async getTotalUnclaimedTokens(user: PublicKey): Promise<BN> {
627
+ const [
628
+ globalVolumeAccumulatorAccountInfo,
629
+ userVolumeAccumulatorAccountInfo,
630
+ ] = await this.connection.getMultipleAccountsInfo([
631
+ globalVolumeAccumulatorPda()[0],
632
+ userVolumeAccumulatorPda(user)[0],
633
+ ]);
634
+
635
+ if (
636
+ !globalVolumeAccumulatorAccountInfo ||
637
+ !userVolumeAccumulatorAccountInfo
638
+ ) {
639
+ return new BN(0);
640
+ }
641
+
642
+ const globalVolumeAccumulator = this.decodeGlobalVolumeAccumulator(
643
+ globalVolumeAccumulatorAccountInfo,
644
+ );
645
+ const userVolumeAccumulator = this.decodeUserVolumeAccumulator(
646
+ userVolumeAccumulatorAccountInfo,
647
+ );
648
+
649
+ return totalUnclaimedTokens(
650
+ globalVolumeAccumulator,
651
+ userVolumeAccumulator,
652
+ ).add(await this.pumpAmmSdk.getCurrentDayTokens(user));
653
+ }
654
+
626
655
  async getCurrentDayTokens(user: PublicKey): Promise<BN> {
627
656
  const [
628
657
  globalVolumeAccumulatorAccountInfo,
@@ -1,12 +1,78 @@
1
1
  import BN from "bn.js";
2
2
  import { GlobalVolumeAccumulator, UserVolumeAccumulator } from "./state";
3
3
 
4
+ export function totalUnclaimedTokens(
5
+ globalVolumeAccumulator: GlobalVolumeAccumulator,
6
+ userVolumeAccumulator: UserVolumeAccumulator,
7
+ currentTimestamp: number = Date.now() / 1000,
8
+ ): BN {
9
+ const { startTime, endTime, secondsInADay, totalTokenSupply, solVolumes } =
10
+ globalVolumeAccumulator;
11
+ const { totalUnclaimedTokens, currentSolVolume, lastUpdateTimestamp } =
12
+ userVolumeAccumulator;
13
+
14
+ const result = totalUnclaimedTokens;
15
+
16
+ if (startTime.eqn(0) || endTime.eqn(0) || secondsInADay.eqn(0)) {
17
+ return result;
18
+ }
19
+
20
+ let currentTimestampBn = new BN(currentTimestamp);
21
+
22
+ if (currentTimestampBn.lt(startTime)) {
23
+ return result;
24
+ }
25
+
26
+ const currentDayIndex = currentTimestampBn
27
+ .sub(startTime)
28
+ .div(secondsInADay)
29
+ .toNumber();
30
+
31
+ if (lastUpdateTimestamp.lt(startTime)) {
32
+ return result;
33
+ }
34
+
35
+ const lastUpdatedIndex = lastUpdateTimestamp
36
+ .sub(startTime)
37
+ .div(secondsInADay)
38
+ .toNumber();
39
+
40
+ if (endTime.lt(startTime)) {
41
+ return result;
42
+ }
43
+
44
+ const endDayIndex = endTime.sub(startTime).div(secondsInADay).toNumber();
45
+
46
+ if (currentDayIndex > lastUpdatedIndex && lastUpdatedIndex <= endDayIndex) {
47
+ const lastUpdatedDayTokenSupply = totalTokenSupply[lastUpdatedIndex];
48
+ const lastUpdatedDaySolVolume = solVolumes[lastUpdatedIndex];
49
+
50
+ if (lastUpdatedDaySolVolume.eqn(0)) {
51
+ return result;
52
+ }
53
+
54
+ return result.add(
55
+ currentSolVolume
56
+ .mul(lastUpdatedDayTokenSupply)
57
+ .div(lastUpdatedDaySolVolume),
58
+ );
59
+ }
60
+
61
+ return result;
62
+ }
63
+
4
64
  export function currentDayTokens(
5
65
  globalVolumeAccumulator: GlobalVolumeAccumulator,
6
66
  userVolumeAccumulator: UserVolumeAccumulator,
7
67
  currentTimestamp: number = Date.now() / 1000,
8
68
  ): BN {
9
- const { startTime, endTime } = globalVolumeAccumulator;
69
+ const { startTime, endTime, secondsInADay, totalTokenSupply, solVolumes } =
70
+ globalVolumeAccumulator;
71
+ const { currentSolVolume, lastUpdateTimestamp } = userVolumeAccumulator;
72
+
73
+ if (startTime.eqn(0) || endTime.eqn(0) || secondsInADay.eqn(0)) {
74
+ return new BN(0);
75
+ }
10
76
 
11
77
  let currentTimestampBn = new BN(currentTimestamp);
12
78
 
@@ -14,22 +80,34 @@ export function currentDayTokens(
14
80
  return new BN(0);
15
81
  }
16
82
 
17
- const { secondsInADay, totalTokenSupply, solVolumes } =
18
- globalVolumeAccumulator;
83
+ const currentDayIndex = currentTimestampBn
84
+ .sub(startTime)
85
+ .div(secondsInADay)
86
+ .toNumber();
87
+
88
+ if (lastUpdateTimestamp.lt(startTime)) {
89
+ return new BN(0);
90
+ }
19
91
 
20
- let currentDayIndex = currentTimestampBn
92
+ const lastUpdatedIndex = lastUpdateTimestamp
21
93
  .sub(startTime)
22
94
  .div(secondsInADay)
23
95
  .toNumber();
24
96
 
25
- let currentDayTokenSupply = totalTokenSupply[currentDayIndex];
26
- let currentDaySolVolume = solVolumes[currentDayIndex];
97
+ if (endTime.lt(startTime)) {
98
+ return new BN(0);
99
+ }
100
+
101
+ if (currentDayIndex !== lastUpdatedIndex) {
102
+ return new BN(0);
103
+ }
104
+
105
+ const currentDayTokenSupply = totalTokenSupply[currentDayIndex];
106
+ const currentDaySolVolume = solVolumes[currentDayIndex];
27
107
 
28
108
  if (currentDaySolVolume.eqn(0)) {
29
109
  return new BN(0);
30
110
  }
31
111
 
32
- const { currentSolVolume } = userVolumeAccumulator;
33
-
34
112
  return currentSolVolume.mul(currentDayTokenSupply).div(currentDaySolVolume);
35
113
  }