on master help sign in
Merge pull request #411 from urbit/csr-calc-fix
c568963Fang
src/lib/starRelease.js+29−22
@@ -75,36 +75,43 @@ export async function getConditional(contracts, address) {
75 return { total: 0, available: 0, withdrawn: 0, batchLimits: [] };
75 return { total: 0, available: 0, withdrawn: 0, batchLimits: [] };
76 }
76 }
77
77
78− const forfeited = await conditionalSR.getForfeited(contracts, address);
79 const total = remaining.length;
78 const total = remaining.length;
80 let balance = total;
79 let balance = total;
81
80
82− const withdrawLimits = await batches.reduce(async (p, _, idx) => {
81+ // does not account for forfeiting or withdrawl
83− const acc = await p;
82+ const limits = await Promise.all(
84− if (forfeited[idx] || balance === 0) {
83+ batches.map((_, idx) =>
85− return [...acc, 0];
86− }
87− const limit = await conditionalSR.getWithdrawLimit(contracts, address, idx);
84+ conditionalSR.getWithdrawLimit(contracts, address, idx)
88− if (limit <= balance) {
85+ )
89− balance -= limit;
86+ );
90− return [...acc, limit];
91− }
92− const remaining = balance;
93− balance = 0;
94
87
95− return [...acc, remaining];
88+ const withdrawn = await conditionalSR.getWithdrawn(contracts, address);
96− }, Promise.resolve([]));
97
89
98− const available = withdrawLimits.reduce((acc, val) => acc + val, 0);
90+ const forfeited = await conditionalSR.getForfeited(contracts, address);
99
91
100− const withdrawnAmounts = await conditionalSR.getWithdrawn(contracts, address);
92+ const batchLimits = [];
101
93
102− const withdrawn = withdrawnAmounts.reduce((acc, val) => acc + val, 0);
94+ for (let i = 0; i < limits.length; i++) {
103− const batchLimits = withdrawLimits.map(
95+ // skip batch if forfeited or no stars left
104− (limit, idx) => limit - withdrawnAmounts[idx]
96+ if (forfeited[i] || balance === 0) {
105− );
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;
106
113
107− return { total, available, withdrawn, batchLimits };
114+ return { total, available, withdrawn: withdrawnTotal, batchLimits };
108}
115}
109
116
110export async function getLinear(contracts, address) {
117export async function getLinear(contracts, address) {