diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index b60f0ad3..85812940 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -94,52 +94,58 @@ export class OceanPool extends Pool { ): SubscribablePromise { if (this.oceanAddress == null) { this.logger.error('ERROR: oceanAddress is not defined') - return null + throw new Error('ERROR: oceanAddress is not defined') } if (parseFloat(fee) > 0.1) { this.logger.error('ERROR: Swap fee too high. The maximum allowed swapFee is 10%') - return null + throw new Error('ERROR: Swap fee too high. The maximum allowed swapFee is 10%') } if (parseFloat(dtAmount) < 2) { this.logger.error('ERROR: Amount of DT is too low') - return null + throw new Error('ERROR: Amount of DT is too low') } if (parseFloat(dtWeight) > 9 || parseFloat(dtWeight) < 1) { this.logger.error('ERROR: Weight out of bounds (min 1, max9)') - return null + throw new Error('ERROR: Weight out of bounds (min 1, max9)') } return new SubscribablePromise(async (observer) => { observer.next(PoolCreateProgressStep.CreatingPool) const createTxid = await super.createPool(account) if (!createTxid) { - this.logger.error('ERROR: Failed to call approve DT token') - return null + this.logger.error('ERROR: Failed to call create pool') + throw new Error('ERROR: Failed to call create pool') } const address = createTxid.events.BPoolRegistered.returnValues[0] const oceanWeight = 10 - parseFloat(dtWeight) this.dtAddress = dtAddress - observer.next(PoolCreateProgressStep.ApprovingDatatoken) let txid - txid = await this.approve( - account, - dtAddress, - address, - this.web3.utils.toWei(String(dtAmount)) - ) - if (!txid) { - this.logger.error('ERROR: Failed to call approve DT token') - return null + const dtAllowance = await this.allowance(dtAddress, account, address) + if (parseFloat(dtAllowance) < parseFloat(dtAmount)) { + observer.next(PoolCreateProgressStep.ApprovingDatatoken) + txid = await this.approve( + account, + dtAddress, + address, + this.web3.utils.toWei(String(dtAmount)) + ) + if (!txid) { + this.logger.error('ERROR: Failed to call approve DT token') + throw new Error('ERROR: Failed to call approve DT token') + } } - observer.next(PoolCreateProgressStep.ApprovingOcean) - txid = await this.approve( - account, - this.oceanAddress, - address, - this.web3.utils.toWei(String(oceanAmount)) - ) - if (!txid) { - this.logger.error('ERROR: Failed to call approve OCEAN token') - return null + const oceanAllowance = await this.allowance(this.oceanAddress, account, address) + if (parseFloat(oceanAllowance) < parseFloat(oceanAmount)) { + observer.next(PoolCreateProgressStep.ApprovingOcean) + txid = await this.approve( + account, + this.oceanAddress, + address, + this.web3.utils.toWei(String(oceanAmount)) + ) + if (!txid) { + this.logger.error('ERROR: Failed to call approve OCEAN token') + throw new Error('ERROR: Failed to call approve OCEAN token') + } } observer.next(PoolCreateProgressStep.SetupPool) txid = await super.setup( @@ -155,7 +161,7 @@ export class OceanPool extends Pool { ) if (!txid) { this.logger.error('ERROR: Failed to create a new pool') - return null + throw new Error('ERROR: Failed to create a new pool') } return createTxid }) diff --git a/src/balancer/Pool.ts b/src/balancer/Pool.ts index a9988417..6dec245e 100644 --- a/src/balancer/Pool.ts +++ b/src/balancer/Pool.ts @@ -4,6 +4,7 @@ import { TransactionReceipt } from 'web3-core' import { Logger, getFairGasPrice } from '../utils' import BigNumber from 'bignumber.js' import jsonpoolABI from '@oceanprotocol/contracts/artifacts/BPool.json' +import defaultDatatokensABI from '@oceanprotocol/contracts/artifacts/DataTokenTemplate.json' import { PoolFactory } from './PoolFactory' const MaxUint256 = @@ -107,6 +108,25 @@ export class Pool extends PoolFactory { return result } + /** + * Get Alloance for both DataToken and Ocean + * @param {String } tokenAdress + * @param {String} owner + * @param {String} spender + */ + public async allowance( + tokenAdress: string, + owner: string, + spender: string + ): Promise { + const tokenAbi = defaultDatatokensABI.abi as AbiItem[] + const datatoken = new this.web3.eth.Contract(tokenAbi, tokenAdress, { + from: spender + }) + const trxReceipt = await datatoken.methods.allowance(owner, spender).call() + return this.web3.utils.fromWei(trxReceipt) + } + /** * Approve spender to spent amount tokens * @param {String} account