From f8c5e9b197386d11c9e0d5bb195332b2e8159f89 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 12 Nov 2020 10:02:51 -0800 Subject: [PATCH 1/4] chunk promises --- src/balancer/OceanPool.ts | 109 +++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index c2dcbdde..437e6193 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -11,6 +11,7 @@ declare type PoolTransactionType = 'swap' | 'join' | 'exit' const POOL_MAX_AMOUNT_IN_LIMIT = 0.25 // maximum 1/4 of the pool reserve const POOL_MAX_AMOUNT_OUT_LIMIT = 0.25 // maximum 1/4 of the pool reserve const BPFACTORY_DEPLOY_BLOCK = 0 +const MAX_AWAIT_PROMISES = 8 export interface PoolDetails { poolAddress: string tokens: string[] @@ -963,17 +964,24 @@ export class OceanPool extends Pool { fromBlock: this.startBlock, toBlock: 'latest' }) - let results = await Promise.all( - events.map((event) => { - return this.getResult(account, event) - }) - ) - results = results.filter((share) => { - return share !== undefined - }) - - result.push(...results) - + let promises = [] + for (let i = 0; i < events.length; i++) { + promises.push(this.getResult(account, events[i])) + if (promises.length > MAX_AWAIT_PROMISES) { + const results = await Promise.all(promises) + for (let j = 0; j < results.length; j++) { + result.push(results[j]) + } + promises = [] + } + } + if (promises.length > 0) { + const results = await Promise.all(promises) + for (let j = 0; j < results.length; j++) { + result.push(results[j]) + } + promises = [] + } return result } @@ -1016,25 +1024,24 @@ export class OceanPool extends Pool { toBlock: 'latest' }) - let eventResults = await Promise.all( - events.map((event) => { - switch (event.topics[0]) { - case swapTopic: - return this.getEventData('swap', poolAddress, dtAddress, event) - break - case joinTopic: - return this.getEventData('join', poolAddress, dtAddress, event) - break - case exitTopic: - return this.getEventData('exit', poolAddress, dtAddress, event) - break + let promises = [] + for (let i = 0; i < events.length; i++) { + promises.push(this.getEventData(poolAddress, dtAddress, events[i])) + if (promises.length > MAX_AWAIT_PROMISES) { + const data = await Promise.all(promises) + for (let j = 0; j < data.length; j++) { + results.push(data[j]) } - }) - ) - eventResults = eventResults.filter((share) => { - return share !== undefined - }) - results.push(...eventResults) + promises = [] + } + } + if (promises.length > 0) { + const data = await Promise.all(promises) + for (let j = 0; j < data.length; j++) { + results.push(data[j]) + } + promises = [] + } // for (let i = 0; i < events.length; i++) { // switch (events[i].topics[0]) { @@ -1066,25 +1073,51 @@ export class OceanPool extends Pool { toBlock: 'latest' }) - const eventsResults = await Promise.all( - events.map((event) => { - return this.getPoolLogs(event.returnValues[0], event.blockNumber, account) - }) - ) - - const eventResults = eventsResults.reduce((elem1, elem2) => elem1.concat(elem2)) - results.push(...eventResults) + let promises = [] + for (let i = 0; i < events.length; i++) { + promises.push( + this.getPoolLogs(events[i].returnValues[0], events[i].blockNumber, account) + ) + if (promises.length > MAX_AWAIT_PROMISES) { + const data = await Promise.all(promises) + for (let j = 0; j < data.length; j++) { + results.push(data[j]) + } + promises = [] + } + } + if (promises.length > 0) { + const data = await Promise.all(promises) + for (let j = 0; j < data.length; j++) { + results.push(data[j]) + } + promises = [] + } return results } private async getEventData( - type: PoolTransactionType, poolAddress: string, dtAddress: string, data: Log ): Promise { const blockDetails = await this.web3.eth.getBlock(data.blockNumber) + const swapTopic = super.getSwapEventSignature() + const joinTopic = super.getJoinEventSignature() + const exitTopic = super.getExitEventSignature() + let type: PoolTransactionType + switch (data.topics[0]) { + case swapTopic: + type = 'swap' + break + case joinTopic: + type = 'join' + break + case exitTopic: + type = 'exit' + break + } let result: PoolTransaction = { poolAddress, dtAddress, From 31fccf7af3bf578c4a3ddec81d635238967549dc Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 12 Nov 2020 10:06:52 -0800 Subject: [PATCH 2/4] increase MAX_AWAIT_PROMISES --- src/balancer/OceanPool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index 437e6193..c73b4d5f 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -11,7 +11,7 @@ declare type PoolTransactionType = 'swap' | 'join' | 'exit' const POOL_MAX_AMOUNT_IN_LIMIT = 0.25 // maximum 1/4 of the pool reserve const POOL_MAX_AMOUNT_OUT_LIMIT = 0.25 // maximum 1/4 of the pool reserve const BPFACTORY_DEPLOY_BLOCK = 0 -const MAX_AWAIT_PROMISES = 8 +const MAX_AWAIT_PROMISES = 10 // infura has a limit of 10 requests/sec export interface PoolDetails { poolAddress: string tokens: string[] From be33814f618394e4ad801ba89ce1a717e7494d1a Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 12 Nov 2020 10:28:37 -0800 Subject: [PATCH 3/4] fix getPoolLogs --- src/balancer/OceanPool.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index c73b4d5f..25b52bf4 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -1072,7 +1072,7 @@ export class OceanPool extends Pool { fromBlock: this.startBlock, toBlock: 'latest' }) - + // since getPoolLogs returns an array we have to push [j][k] let promises = [] for (let i = 0; i < events.length; i++) { promises.push( @@ -1081,7 +1081,7 @@ export class OceanPool extends Pool { if (promises.length > MAX_AWAIT_PROMISES) { const data = await Promise.all(promises) for (let j = 0; j < data.length; j++) { - results.push(data[j]) + for (let k = 0; k < data.length; k++) results.push(data[j][k]) } promises = [] } @@ -1089,7 +1089,7 @@ export class OceanPool extends Pool { if (promises.length > 0) { const data = await Promise.all(promises) for (let j = 0; j < data.length; j++) { - results.push(data[j]) + for (let k = 0; k < data.length; k++) results.push(data[j][k]) } promises = [] } From eb5c29810f0a5e6e68370322fef57520564d50c1 Mon Sep 17 00:00:00 2001 From: mihaisc Date: Thu, 12 Nov 2020 20:38:45 +0200 Subject: [PATCH 4/4] fix Signed-off-by: mihaisc --- src/balancer/OceanPool.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index 25b52bf4..a41728f7 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -958,7 +958,6 @@ export class OceanPool extends Pool { public async getPoolSharesByAddress(account: string): Promise { const result: PoolShare[] = [] const factory = new this.web3.eth.Contract(this.factoryABI, this.factoryAddress) - const events = await factory.getPastEvents('BPoolRegistered', { filter: {}, fromBlock: this.startBlock, @@ -982,7 +981,11 @@ export class OceanPool extends Pool { } promises = [] } - return result + + const filteredResult = result.filter((share) => { + return share !== undefined + }) + return filteredResult } /** @@ -1056,7 +1059,10 @@ export class OceanPool extends Pool { // break // } // } - return results + const eventResults = results.filter((share) => { + return share !== undefined + }) + return eventResults } /** @@ -1065,14 +1071,14 @@ export class OceanPool extends Pool { * @return {PoolTransaction[]} */ public async getAllPoolLogs(account: string): Promise { - const results: PoolTransaction[] = [] + const results: PoolTransaction[][] = [] const factory = new this.web3.eth.Contract(this.factoryABI, this.factoryAddress) const events = await factory.getPastEvents('BPoolRegistered', { filter: {}, fromBlock: this.startBlock, toBlock: 'latest' }) - // since getPoolLogs returns an array we have to push [j][k] + let promises = [] for (let i = 0; i < events.length; i++) { promises.push( @@ -1081,7 +1087,7 @@ export class OceanPool extends Pool { if (promises.length > MAX_AWAIT_PROMISES) { const data = await Promise.all(promises) for (let j = 0; j < data.length; j++) { - for (let k = 0; k < data.length; k++) results.push(data[j][k]) + results.push(data[j]) } promises = [] } @@ -1089,12 +1095,14 @@ export class OceanPool extends Pool { if (promises.length > 0) { const data = await Promise.all(promises) for (let j = 0; j < data.length; j++) { - for (let k = 0; k < data.length; k++) results.push(data[j][k]) + results.push(data[j]) } promises = [] } - return results + const concatResults = results.reduce((elem1, elem2) => elem1.concat(elem2)) + + return concatResults } private async getEventData(