diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index 3f8d3503c..48921aa73 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -691,13 +691,15 @@ export class OceanPool extends Pool { this.logger.error('ERROR: Not enough poolShares') return null } - if ( - parseFloat(maximumPoolShares) < - parseFloat(await this.getPoolSharesRequiredToRemoveDT(poolAddress, amount)) - ) { + const sharesRequired = await this.getPoolSharesRequiredToRemoveDT(poolAddress, amount) + if (parseFloat(maximumPoolShares) < parseFloat(sharesRequired)) { this.logger.error('ERROR: Not enough poolShares') return null } + // Balancer bug fix + if (parseFloat(maximumPoolShares) < parseFloat(sharesRequired)) + maximumPoolShares = String(parseFloat(maximumPoolShares) * 0.9999) + // Balance bug fix return this.exitswapExternAmountOut( account, poolAddress, @@ -775,13 +777,18 @@ export class OceanPool extends Pool { this.logger.error('ERROR: Not enough poolShares') return null } - if ( - parseFloat(maximumPoolShares) < - parseFloat(await this.getPoolSharesRequiredToRemoveOcean(poolAddress, amount)) - ) { + const sharesRequired = await this.getPoolSharesRequiredToRemoveOcean( + poolAddress, + amount + ) + if (parseFloat(maximumPoolShares) < parseFloat(sharesRequired)) { this.logger.error('ERROR: Not enough poolShares') return null } + // Balancer bug fix + if (parseFloat(maximumPoolShares) < parseFloat(sharesRequired)) + maximumPoolShares = String(parseFloat(maximumPoolShares) * 0.9999) + // Balance bug fix return super.exitswapExternAmountOut( account, poolAddress, @@ -812,7 +819,10 @@ export class OceanPool extends Pool { this.logger.error('ERROR: Not enough poolShares') return null } - + // Balancer bug fix + if (parseFloat(usershares) === parseFloat(poolShares)) + poolShares = String(parseFloat(poolShares) * 0.9999) + // Balance bug fix return this.exitPool(account, poolAddress, poolShares, [minDT, minOcean]) } diff --git a/src/balancer/Pool.ts b/src/balancer/Pool.ts index 9a4827665..d55b72c56 100644 --- a/src/balancer/Pool.ts +++ b/src/balancer/Pool.ts @@ -130,18 +130,12 @@ export class Pool extends PoolFactory { from: account }) let result = null - + const gasLimitDefault = this.GASLIMIT_DEFAULT let estGas try { estGas = await token.methods .approve(spender, amount) - .estimateGas(function (err, estGas) { - if (err) { - // console.error('ERROR: OnChainMetadataCacheEstimateGas: ' + err) - return this.GASLIMIT_DEFAULT - } - return estGas - }) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) } catch (e) { estGas = this.GASLIMIT_DEFAULT } @@ -511,6 +505,7 @@ export class Pool extends PoolFactory { from: account }) let result = null + const gasLimitDefault = this.GASLIMIT_DEFAULT let estGas try { estGas = await pool.methods @@ -521,13 +516,7 @@ export class Pool extends PoolFactory { this.web3.utils.toWei(minAmountOut), maxPrice ? this.web3.utils.toWei(maxPrice) : MaxUint256 ) - .estimateGas(function (err, estGas) { - if (err) { - // console.error('ERROR: OnChainMetadataCacheEstimateGas: ' + err) - return this.GASLIMIT_DEFAULT - } - return estGas - }) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) } catch (e) { estGas = this.GASLIMIT_DEFAULT } @@ -571,6 +560,7 @@ export class Pool extends PoolFactory { from: account }) let result = null + const gasLimitDefault = this.GASLIMIT_DEFAULT let estGas try { estGas = await pool.methods @@ -581,13 +571,7 @@ export class Pool extends PoolFactory { this.web3.utils.toWei(minAmountOut), maxPrice ? this.web3.utils.toWei(maxPrice) : MaxUint256 ) - .estimateGas(function (err, estGas) { - if (err) { - // console.error('ERROR: OnChainMetadataCacheEstimateGas: ' + err) - return this.GASLIMIT_DEFAULT - } - return estGas - }) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) } catch (e) { estGas = this.GASLIMIT_DEFAULT } @@ -633,11 +617,19 @@ export class Pool extends PoolFactory { } let result = null - + const gasLimitDefault = this.GASLIMIT_DEFAULT + let estGas + try { + estGas = await await pool.methods + .joinPool(this.web3.utils.toWei(poolAmountOut), weiMaxAmountsIn) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) + } catch (e) { + estGas = this.GASLIMIT_DEFAULT + } try { result = await pool.methods .joinPool(this.web3.utils.toWei(poolAmountOut), weiMaxAmountsIn) - .send({ from: account, gas: this.GASLIMIT_DEFAULT }) + .send({ from: account, gas: estGas + 1 }) } catch (e) { this.logger.error(`ERROR: Failed to join pool: ${e.message}`) } @@ -668,10 +660,19 @@ export class Pool extends PoolFactory { weiMinAmountsOut.push(this.web3.utils.toWei(amount)) } let result = null + const gasLimitDefault = this.GASLIMIT_DEFAULT + let estGas + try { + estGas = await await pool.methods + .exitPool(this.web3.utils.toWei(poolAmountIn), weiMinAmountsOut) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) + } catch (e) { + estGas = this.GASLIMIT_DEFAULT + } try { result = await pool.methods .exitPool(this.web3.utils.toWei(poolAmountIn), weiMinAmountsOut) - .send({ from: account, gas: this.GASLIMIT_DEFAULT }) + .send({ from: account, gas: estGas }) } catch (e) { this.logger.error(`ERROR: Failed to exit pool: ${e.message}`) } @@ -698,6 +699,7 @@ export class Pool extends PoolFactory { from: account }) let result = null + const gasLimitDefault = this.GASLIMIT_DEFAULT let estGas try { estGas = await await pool.methods @@ -706,13 +708,7 @@ export class Pool extends PoolFactory { this.web3.utils.toWei(tokenAmountIn), this.web3.utils.toWei(minPoolAmountOut) ) - .estimateGas(function (err, estGas) { - if (err) { - // console.error('ERROR: OnChainMetadataCacheEstimateGas: ' + err) - return this.GASLIMIT_DEFAULT - } - return estGas - }) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) } catch (e) { estGas = this.GASLIMIT_DEFAULT } @@ -751,6 +747,19 @@ export class Pool extends PoolFactory { from: account }) let result = null + const gasLimitDefault = this.GASLIMIT_DEFAULT + let estGas + try { + estGas = await await pool.methods + .joinswapPoolAmountOut( + tokenIn, + this.web3.utils.toWei(poolAmountOut), + this.web3.utils.toWei(maxAmountIn) + ) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) + } catch (e) { + estGas = this.GASLIMIT_DEFAULT + } try { result = await pool.methods .joinswapPoolAmountOut( @@ -758,7 +767,7 @@ export class Pool extends PoolFactory { this.web3.utils.toWei(poolAmountOut), this.web3.utils.toWei(maxAmountIn) ) - .send({ from: account, gas: this.GASLIMIT_DEFAULT }) + .send({ from: account, gas: estGas + 1 }) } catch (e) { this.logger.error('ERROR: Failed to join swap pool amount out') } @@ -785,6 +794,19 @@ export class Pool extends PoolFactory { from: account }) let result = null + const gasLimitDefault = this.GASLIMIT_DEFAULT + let estGas + try { + estGas = await await pool.methods + .exitswapPoolAmountIn( + tokenOut, + this.web3.utils.toWei(poolAmountIn), + this.web3.utils.toWei(minTokenAmountOut) + ) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) + } catch (e) { + estGas = this.GASLIMIT_DEFAULT + } try { result = await pool.methods .exitswapPoolAmountIn( @@ -815,11 +837,14 @@ export class Pool extends PoolFactory { tokenAmountOut: string, maxPoolAmountIn: string ): Promise { + const gasLimitDefault = this.GASLIMIT_DEFAULT + const pool = new this.web3.eth.Contract(this.poolABI, poolAddress, { from: account }) let result = null let estGas + try { estGas = await pool.methods .exitswapExternAmountOut( @@ -827,16 +852,11 @@ export class Pool extends PoolFactory { this.web3.utils.toWei(tokenAmountOut), this.web3.utils.toWei(maxPoolAmountIn) ) - .estimateGas(function (err, estGas) { - if (err) { - // console.error('ERROR: OnChainMetadataCacheEstimateGas: ' + err) - return this.GASLIMIT_DEFAULT - } - return estGas - }) + .estimateGas((err, estGas) => (err ? gasLimitDefault : estGas)) } catch (e) { - estGas = this.GASLIMIT_DEFAULT + estGas = gasLimitDefault } + try { result = await pool.methods .exitswapExternAmountOut(