@@ -75,36 +75,43 @@ export async function getConditional(contracts, address) {
7575 return { total: 0, available: 0, withdrawn: 0, batchLimits: [] };
7676 }
7777
78− const forfeited = await conditionalSR.getForfeited(contracts, address);
7978 const total = remaining.length;
8079 let balance = total;
8180
82− const withdrawLimits = await batches.reduce(async (p, _, idx) => {
83− const acc = await p;
84− if (forfeited[idx] || balance === 0) {
85− return [...acc, 0];
86− }
87− const limit = await conditionalSR.getWithdrawLimit(contracts, address, idx);
88− if (limit <= balance) {
89− balance -= limit;
90− return [...acc, limit];
91− }
92− const remaining = balance;
93− balance = 0;
81+ // does not account for forfeiting or withdrawl
82+ const limits = await Promise.all(
83+ batches.map((_, idx) =>
84+ conditionalSR.getWithdrawLimit(contracts, address, idx)
85+ )
86+ );
9487
95− return [...acc, remaining];
96− }, Promise.resolve([]));
88+ const withdrawn = await conditionalSR.getWithdrawn(contracts, address);
9789
98− const available = withdrawLimits.reduce((acc, val) => acc + val, 0);
90+ const forfeited = await conditionalSR.getForfeited(contracts, address);
9991
100− const withdrawnAmounts = await conditionalSR.getWithdrawn(contracts, address);
92+ const batchLimits = [];
10193
102− const withdrawn = withdrawnAmounts.reduce((acc, val) => acc + val, 0);
103− const batchLimits = withdrawLimits.map(
104− (limit, idx) => limit - withdrawnAmounts[idx]
105− );
94+ for (let i = 0; i < limits.length; i++) {
95+ // skip batch if forfeited or no stars left
96+ if (forfeited[i] || balance === 0) {
97+ batchLimits.push(0);
98+ continue;
99+ }
100+ const availableInBatch = limits[i] - withdrawn[i];
101+ if (balance < availableInBatch) {
102+ batchLimits.push(balance);
103+ balance = 0;
104+ continue;
105+ }
106+ batchLimits.push(availableInBatch);
107+ balance = balance - availableInBatch;
108+ }
109+
110+ const withdrawnTotal = withdrawn.reduce((acc, val) => acc + val, 0);
111+ const available =
112+ batchLimits.reduce((acc, val) => acc + val, 0) + withdrawnTotal;
106113
107− return { total, available, withdrawn, batchLimits };
114+ return { total, available, withdrawn: withdrawnTotal, batchLimits };
108115}
109116
110117export async function getLinear(contracts, address) {