diff options
author | F. Eugene Aumson <feuGeneA@users.noreply.github.com> | 2018-09-12 07:00:11 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-12 07:00:11 +0800 |
commit | cbb5a425dfb45d1dfda3579548d6b3f70dfca166 (patch) | |
tree | 8751979ad70ed0eb61dfda5a954bb9e1bc3d5c3b /packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts | |
parent | 800dd5fb4f0ab21388440a46aef21cd0cf0801c3 (diff) | |
parent | 45b68832aa3eb5c09db33140468ab737114be9e3 (diff) | |
download | dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.tar dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.tar.gz dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.tar.bz2 dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.tar.lz dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.tar.xz dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.tar.zst dexon-sol-tools-cbb5a425dfb45d1dfda3579548d6b3f70dfca166.zip |
Merge branch 'development' into sol-doc
Diffstat (limited to 'packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts')
-rw-r--r-- | packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts b/packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts new file mode 100644 index 000000000..023cd5ac3 --- /dev/null +++ b/packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts @@ -0,0 +1,77 @@ +// tslint:disable:no-unnecessary-type-assertion +import { AbstractBalanceAndProxyAllowanceFetcher, assetDataUtils } from '@0xproject/order-utils'; +import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0xproject/types'; +import { BigNumber } from '@0xproject/utils'; +import { BlockParamLiteral } from 'ethereum-types'; + +import { ERC20TokenWrapper } from '../contract_wrappers/erc20_token_wrapper'; +import { ERC721TokenWrapper } from '../contract_wrappers/erc721_token_wrapper'; + +export class AssetBalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher { + private readonly _erc20Token: ERC20TokenWrapper; + private readonly _erc721Token: ERC721TokenWrapper; + private readonly _stateLayer: BlockParamLiteral; + constructor(erc20Token: ERC20TokenWrapper, erc721Token: ERC721TokenWrapper, stateLayer: BlockParamLiteral) { + this._erc20Token = erc20Token; + this._erc721Token = erc721Token; + this._stateLayer = stateLayer; + } + public async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber> { + const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData); + if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) { + const decodedERC20AssetData = decodedAssetData as ERC20AssetData; + const balance = await this._erc20Token.getBalanceAsync(decodedERC20AssetData.tokenAddress, userAddress, { + defaultBlock: this._stateLayer, + }); + return balance; + } else { + const decodedERC721AssetData = decodedAssetData as ERC721AssetData; + const tokenOwner = await this._erc721Token.getOwnerOfAsync( + decodedERC721AssetData.tokenAddress, + decodedERC721AssetData.tokenId, + { + defaultBlock: this._stateLayer, + }, + ); + const balance = tokenOwner === userAddress ? new BigNumber(1) : new BigNumber(0); + return balance; + } + } + public async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber> { + const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData); + if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) { + const decodedERC20AssetData = decodedAssetData as ERC20AssetData; + const proxyAllowance = await this._erc20Token.getProxyAllowanceAsync( + decodedERC20AssetData.tokenAddress, + userAddress, + { + defaultBlock: this._stateLayer, + }, + ); + return proxyAllowance; + } else { + const decodedERC721AssetData = decodedAssetData as ERC721AssetData; + + const isApprovedForAll = await this._erc721Token.isProxyApprovedForAllAsync( + decodedERC721AssetData.tokenAddress, + userAddress, + { + defaultBlock: this._stateLayer, + }, + ); + if (isApprovedForAll) { + return new BigNumber(this._erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + } else { + const isApproved = await this._erc721Token.isProxyApprovedAsync( + decodedERC721AssetData.tokenAddress, + decodedERC721AssetData.tokenId, + { + defaultBlock: this._stateLayer, + }, + ); + const proxyAllowance = isApproved ? new BigNumber(1) : new BigNumber(0); + return proxyAllowance; + } + } + } +} |