Skip to content

Commit 74498d8

Browse files
committed
fix bug where our query window for if an account had a balance for a draw period was too narrow (was only looking at the current draw period (ie. 1 day) instead of the total tier draw period (ie. 91 days for the grand prize tier)
1 parent 9dbd6ed commit 74498d8

File tree

7 files changed

+107
-111
lines changed

7 files changed

+107
-111
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"@ethersproject/bignumber": "^5.5.0",
3737
"@ethersproject/contracts": "^5.5.0",
3838
"@ethersproject/providers": "^5.5.3",
39-
"@generationsoftware/pt-v5-utils-js": "^1.1.0",
39+
"@generationsoftware/pt-v5-utils-js": "^1.1.2",
4040
"@oclif/core": "^3",
4141
"@oclif/plugin-help": "^6",
4242
"@oclif/plugin-plugins": "^4",
@@ -80,4 +80,4 @@
8080
"oclif"
8181
],
8282
"types": "dist/index.d.ts"
83-
}
83+
}

src/commands/utils/concatWinners.ts

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@ import { Provider } from "@ethersproject/providers";
44
import { Command, Flags } from "@oclif/core";
55
import { readFileSync } from "fs";
66
import {
7-
downloadContractsBlob,
8-
getSubgraphPrizeVaults,
9-
getPrizePoolInfo,
10-
populateSubgraphPrizeVaultAccounts,
117
PrizePoolInfo,
128
PrizeVault,
9+
downloadContractsBlob,
10+
getPrizePoolInfo,
1311
} from "@generationsoftware/pt-v5-utils-js";
1412

1513
import { createStatus, updateStatusFailure, updateStatusSuccess } from "../../lib/utils/status.js";
1614
import { getProvider } from "../../lib/utils/getProvider.js";
1715
import { createOutputPath } from "../../lib/utils/createOutputPath.js";
1816
import { createExitCode } from "../../lib/utils/createExitCode.js";
17+
import { getAllPrizeVaultsAndAccountsWithBalance } from "../../lib/utils/getAllPrizeVaultsAndAccountsWithBalance.js";
1918
import { writeToOutput } from "../../lib/utils/writeOutput.js";
2019
import { Winner } from "../../types.js";
2120

@@ -96,27 +95,9 @@ export default class ConcatWinners extends Command {
9695
const outDirWithSchema = createOutputPath(outDir, chainId, prizePool, drawId);
9796
writeToOutput(outDirWithSchema, "status", ConcatWinners.statusLoading);
9897

99-
// #2. Collect all prizeVaults
100-
console.log(`Getting prize vaults from subgraph ...`);
101-
let prizeVaults = await getSubgraphPrizeVaults(Number(chainId));
102-
if (prizeVaults.length === 0) {
103-
throw new Error("Claimer: No prizeVaults found in subgraph");
104-
}
105-
106-
// #3. Page through and concat all accounts for all prizeVaults
107-
console.log();
108-
console.log(
109-
`Getting depositors for each vault with a non-zero balance in the previous draw from subgraph ...`
110-
);
111-
prizeVaults = await populateSubgraphPrizeVaultAccounts(
98+
const { prizeVaults, numAccounts } = await getAllPrizeVaultsAndAccountsWithBalance(
11299
Number(chainId),
113-
prizeVaults,
114-
prizePoolInfo.lastDrawClosedAt
115-
);
116-
117-
const numAccounts = prizeVaults.reduce(
118-
(accumulator, vault) => vault.accounts.length + accumulator,
119-
0
100+
prizePoolInfo
120101
);
121102
console.log();
122103
console.log(`${numAccounts} accounts deposited across ${prizeVaults.length} prizeVaults.`);

src/commands/utils/vaultAccounts.ts

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ import {
66
getPrizePoolInfo,
77
PrizeVault,
88
PrizePoolInfo,
9-
getSubgraphPrizeVaults,
10-
populateSubgraphPrizeVaultAccounts,
119
} from "@generationsoftware/pt-v5-utils-js";
1210
import * as core from "@actions/core";
1311

1412
import { createStatus, updateStatusFailure, updateStatusSuccess } from "../../lib/utils/status.js";
1513
import { getProvider } from "../../lib/utils/getProvider.js";
1614
import { createOutputPath } from "../../lib/utils/createOutputPath.js";
1715
import { createExitCode } from "../../lib/utils/createExitCode.js";
16+
import { getAllPrizeVaultsAndAccountsWithBalance } from "../../lib/utils/getAllPrizeVaultsAndAccountsWithBalance.js";
1817
import { writeToOutput } from "../../lib/utils/writeOutput.js";
1918

2019
/**
@@ -99,33 +98,11 @@ export default class VaultAccounts extends Command {
9998
const contracts = await downloadContractsBlob(Number(chainId));
10099
const prizePoolInfo: PrizePoolInfo = await getPrizePoolInfo(readProvider, contracts);
101100

102-
// #2. Collect all prizeVaults
103-
console.log();
104-
console.log(`Getting prize vaults from subgraph ...`);
105-
let prizeVaults = await getSubgraphPrizeVaults(Number(chainId));
106-
if (prizeVaults.length === 0) {
107-
throw new Error("Claimer: No prizeVaults found in subgraph");
108-
}
109-
110-
// #3. Page through and concat all accounts for all prizeVaults
111-
console.log();
112-
console.log(
113-
`Getting depositors for each vault with a non-zero balance in the previous draw from subgraph ...`
114-
);
115-
prizeVaults = await populateSubgraphPrizeVaultAccounts(
101+
const { prizeVaults, numAccounts } = await getAllPrizeVaultsAndAccountsWithBalance(
116102
Number(chainId),
117-
prizeVaults,
118-
prizePoolInfo.lastDrawClosedAt
103+
prizePoolInfo
119104
);
120105

121-
const numAccounts = prizeVaults.reduce(
122-
(accumulator, vault) => vault.accounts.length + accumulator,
123-
0
124-
);
125-
console.log();
126-
console.log(`${numAccounts} accounts deposited across ${prizeVaults.length} prizeVaults.`);
127-
console.log();
128-
console.log();
129106
/* -------------------------------------------------- */
130107
// Write to Disk
131108
/* -------------------------------------------------- */
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import {
2+
PrizePoolInfo,
3+
PrizeVault,
4+
getSubgraphPrizeVaults,
5+
populateSubgraphPrizeVaultAccounts,
6+
} from "@generationsoftware/pt-v5-utils-js";
7+
8+
export const getAllPrizeVaultsAndAccountsWithBalance = async (
9+
chainId: number,
10+
prizePoolInfo: PrizePoolInfo
11+
): Promise<{ prizeVaults: PrizeVault[]; numAccounts: number }> => {
12+
// #1. Collect all prizeVaults
13+
console.log();
14+
console.log(`Getting prize vaults from subgraph ...`);
15+
let prizeVaults = await getSubgraphPrizeVaults(chainId);
16+
if (prizeVaults.length === 0) {
17+
throw new Error("Claimer: No prizeVaults found in subgraph");
18+
}
19+
20+
// #2. Page through and concat all accounts for all prizeVaults
21+
console.log();
22+
console.log(
23+
`Getting depositors for each vault with a non-zero balance in the previous draw from subgraph ...`
24+
);
25+
26+
// #3. Figure out the longest duration (in seconds) that the biggest tier (grandPrize tier) spans
27+
const maxTierPeriodSeconds =
28+
prizePoolInfo.drawPeriodSeconds * prizePoolInfo.grandPrizePeriodDraws;
29+
30+
// #4. Get a range of the oldest timestamp we want to start querying at to the current closed draw timestmap
31+
// for use in scoping depositors when querying the Graph
32+
const afterTimestamp = prizePoolInfo.lastDrawClosedAt - maxTierPeriodSeconds;
33+
const beforeTimestamp = prizePoolInfo.lastDrawClosedAt;
34+
35+
// #5. Query and populate accounts for each vault
36+
prizeVaults = await populateSubgraphPrizeVaultAccounts(
37+
chainId,
38+
prizeVaults,
39+
afterTimestamp,
40+
beforeTimestamp
41+
);
42+
43+
const numAccounts = prizeVaults.reduce(
44+
(accumulator, vault) => vault.accounts.length + accumulator,
45+
0
46+
);
47+
console.log();
48+
console.log(`${numAccounts} accounts deposited across ${prizeVaults.length} prizeVaults.`);
49+
console.log();
50+
console.log();
51+
52+
return { prizeVaults, numAccounts };
53+
};

src/lib/utils/index.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
export { createOutputPath } from './createOutputPath.js'
2-
export { updateStatusFailure, updateStatusSuccess, createStatus } from './status.js'
3-
export { createExitCode } from './createExitCode.js'
4-
export { getProvider } from './getProvider.js'
5-
export { writeToOutput, writeStatus } from './writeOutput.js'
6-
export * from './prizeAmounts.js'
1+
export { createOutputPath } from "./createOutputPath.js";
2+
export { updateStatusFailure, updateStatusSuccess, createStatus } from "./status.js";
3+
export { createExitCode } from "./createExitCode.js";
4+
export { getAllPrizeVaultsAndAccountsWithBalance } from "./getAllPrizeVaultsAndAccountsWithBalance.js";
5+
export { getProvider } from "./getProvider.js";
6+
export { writeToOutput, writeStatus } from "./writeOutput.js";
7+
export * from "./prizeAmounts.js";

src/lib/utils/prizeAmounts.ts

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,93 @@
1-
import { Contract } from 'ethers'
2-
import { BigNumber } from '@ethersproject/bignumber'
3-
import { Claim } from '@generationsoftware/pt-v5-utils-js'
1+
import { Contract } from "ethers";
2+
import { BigNumber } from "@ethersproject/bignumber";
3+
import { Claim } from "@generationsoftware/pt-v5-utils-js";
44

55
export interface TierPrizeAmounts {
66
[tier: string]: BigNumber;
77
}
88

99
interface amountsAsString {
1010
[key: string]: string;
11-
};
11+
}
1212

1313
interface claimTiers {
1414
[key: string]: [];
15-
};
15+
}
1616

1717
interface ClaimWithAmount extends Claim {
18-
amount: string
18+
amount: string;
1919
}
2020

2121
interface ClaimWithAmountAndTwabs extends ClaimWithAmount {
22-
userTwab: string
23-
totalSupplyTwab: string
22+
userTwab: string;
23+
totalSupplyTwab: string;
2424
}
2525

2626
export function sumPrizeAmounts(tierPrizeAmounts: TierPrizeAmounts): string {
2727
return Object.values(tierPrizeAmounts)
2828
.reduce((a, b) => a.add(b), BigNumber.from(0))
29-
.toString()
29+
.toString();
3030
}
3131

3232
export function mapTierPrizeAmountsToString(tierPrizeAmounts: TierPrizeAmounts) {
3333
const obj: amountsAsString = {};
34-
34+
3535
for (const entry of Object.entries(tierPrizeAmounts)) {
3636
const [key, value] = entry;
3737
obj[key] = BigNumber.from(value).toString();
3838
}
3939

4040
return obj;
41-
};
41+
}
4242

43-
export function addTierPrizeAmountsToClaims(claims: Claim[], tierPrizeAmounts: TierPrizeAmounts): ClaimWithAmount[] {
44-
// const claimsByTier = groupByTier(claims, tierPrizeAmounts)
45-
const claimsWithAmounts:ClaimWithAmount[] = []
43+
export function addTierPrizeAmountsToClaims(
44+
claims: Claim[],
45+
tierPrizeAmounts: TierPrizeAmounts
46+
): ClaimWithAmount[] {
47+
const claimsWithAmounts: ClaimWithAmount[] = [];
4648

4749
const tierAmountPerPrize: amountsAsString = {};
4850
for (const tier of Object.keys(tierPrizeAmounts)) {
49-
tierAmountPerPrize[tier] = '0';
51+
tierAmountPerPrize[tier] = "0";
5052
}
5153

5254
for (const tier of Object.entries(tierPrizeAmounts)) {
53-
const [key, value] = tier
54-
tierAmountPerPrize[key] = BigNumber.from(value).toString()
55-
56-
// I don't believe we want to divide the amount since the getTierPrizeSize is the
57-
// size of each prize, not the shared amount for the tier
58-
//
59-
// const numberOfPrizes = claimsByTier[key].length
60-
// if (numberOfPrizes > 0) {
61-
// tierAmountPerPrize[key] = BigNumber.from(value).div(numberOfPrizes).toString()
62-
// }
55+
const [key, value] = tier;
56+
tierAmountPerPrize[key] = BigNumber.from(value).toString();
6357
}
6458

6559
for (const claim of claims) {
66-
const claimWithAmount = { ...claim, amount: tierAmountPerPrize[claim.tier.toString()] }
67-
claimsWithAmounts.push(claimWithAmount)
60+
const claimWithAmount = { ...claim, amount: tierAmountPerPrize[claim.tier.toString()] };
61+
claimsWithAmounts.push(claimWithAmount);
6862
}
6963

70-
return claimsWithAmounts
71-
}
72-
73-
const groupByTier = (claims: any, tierPrizeAmounts: TierPrizeAmounts) => {
74-
const initialClaims: claimTiers = {};
75-
for (const tier of Object.keys(tierPrizeAmounts)) {
76-
initialClaims[tier] = [];
77-
}
78-
79-
return claims.reduce(function (accumulator: any, value: any) {
80-
accumulator[value.tier] = accumulator[value.tier] || [];
81-
accumulator[value.tier].push(value);
82-
return accumulator;
83-
}, initialClaims);
64+
return claimsWithAmounts;
8465
}
8566

8667
export async function addUserAndTotalSupplyTwabsToClaims(
8768
claimsWithAmounts: ClaimWithAmount[],
8869
tierAccrualDurationsInDraws: Record<string, BigNumber>,
8970
prizePoolContract: Contract
9071
): Promise<ClaimWithAmountAndTwabs[]> {
91-
const claimsWithAmountAndTwabs: ClaimWithAmountAndTwabs[] = []
72+
const claimsWithAmountAndTwabs: ClaimWithAmountAndTwabs[] = [];
9273

9374
for (const claim of claimsWithAmounts) {
94-
const tierDrawDuration = tierAccrualDurationsInDraws[claim.tier.toString()]
75+
const tierDrawDuration = tierAccrualDurationsInDraws[claim.tier.toString()];
9576

9677
const twabs = await prizePoolContract.getVaultUserBalanceAndTotalSupplyTwab(
9778
claim.vault,
9879
claim.winner,
9980
tierDrawDuration
100-
)
81+
);
10182

102-
const claimWithAmountAndTwab = { ...claim, userTwab: twabs[0].toString(), totalSupplyTwab: twabs[1].toString() }
103-
104-
claimsWithAmountAndTwabs.push(claimWithAmountAndTwab)
83+
const claimWithAmountAndTwab = {
84+
...claim,
85+
userTwab: twabs[0].toString(),
86+
totalSupplyTwab: twabs[1].toString(),
87+
};
88+
89+
claimsWithAmountAndTwabs.push(claimWithAmountAndTwab);
10590
}
10691

107-
return claimsWithAmountAndTwabs
92+
return claimsWithAmountAndTwabs;
10893
}
109-

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,10 +1058,10 @@
10581058
resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz"
10591059
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
10601060

1061-
"@generationsoftware/pt-v5-utils-js@^1.1.0":
1062-
version "1.1.0"
1063-
resolved "https://registry.npmjs.org/@generationsoftware/pt-v5-utils-js/-/pt-v5-utils-js-1.1.0.tgz"
1064-
integrity sha512-6AgCvQ+yMhajgg2Nm9aeKSwhXtoEf0qi9Nxh0n0f9Yq+Lub2gO6ZRLIei0ZP+tNLMMguGjRM95KSxlZGvSpNoA==
1061+
"@generationsoftware/pt-v5-utils-js@^1.1.2":
1062+
version "1.1.2"
1063+
resolved "https://registry.npmjs.org/@generationsoftware/pt-v5-utils-js/-/pt-v5-utils-js-1.1.2.tgz"
1064+
integrity sha512-fH18m+P4u4BT5I73e1zyir8xPja9ORKiXsmrUj+/gU8+uzbTY1nhYlm20uy6A/I4CXp0q4v1o50wDvtVwIJRzQ==
10651065
dependencies:
10661066
"@ethersproject/abi" "5.7.0"
10671067
"@ethersproject/providers" "5.7.2"

0 commit comments

Comments
 (0)