diff options
author | Leonid <logvinov.leon@gmail.com> | 2017-06-27 04:23:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-27 04:23:02 +0800 |
commit | 73eb78d7934008647eb40d5c1bd16686ea15e229 (patch) | |
tree | 15f9138d7f271264baf10ed8c4b8ba25ff83775d /src/contract_wrappers | |
parent | d5ed5865ca7ca5697795896d1853e313093d327a (diff) | |
parent | f15451ebfd956c159f376dcf9686f48eafcfe65c (diff) | |
download | dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.tar dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.tar.gz dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.tar.bz2 dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.tar.lz dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.tar.xz dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.tar.zst dexon-sol-tools-73eb78d7934008647eb40d5c1bd16686ea15e229.zip |
Merge pull request #81 from 0xProject/addWrappedETHSupport
Add Wrapped ETH Support
Diffstat (limited to 'src/contract_wrappers')
-rw-r--r-- | src/contract_wrappers/ether_token_wrapper.ts | 75 | ||||
-rw-r--r-- | src/contract_wrappers/token_wrapper.ts | 1 |
2 files changed, 76 insertions, 0 deletions
diff --git a/src/contract_wrappers/ether_token_wrapper.ts b/src/contract_wrappers/ether_token_wrapper.ts new file mode 100644 index 000000000..76e7289b7 --- /dev/null +++ b/src/contract_wrappers/ether_token_wrapper.ts @@ -0,0 +1,75 @@ +import * as _ from 'lodash'; +import {Web3Wrapper} from '../web3_wrapper'; +import {ContractWrapper} from './contract_wrapper'; +import {TokenWrapper} from './token_wrapper'; +import {EtherTokenContract, ZeroExError} from '../types'; +import {assert} from '../utils/assert'; +import * as EtherTokenArtifacts from '../artifacts/EtherToken.json'; + +/** + * This class includes all the functionality related to interacting with a wrapped Ether ERC20 token contract. + * The caller can convert ETH into the equivalent number of wrapped ETH ERC20 tokens and back. + */ +export class EtherTokenWrapper extends ContractWrapper { + private _etherTokenContractIfExists?: EtherTokenContract; + private _tokenWrapper: TokenWrapper; + constructor(web3Wrapper: Web3Wrapper, tokenWrapper: TokenWrapper) { + super(web3Wrapper); + this._tokenWrapper = tokenWrapper; + } + /** + * Deposit ETH into the Wrapped ETH smart contract and issues the equivalent number of wrapped ETH tokens + * to the depositor address. These wrapped ETH tokens can be used in 0x trades and are redeemable for 1-to-1 + * for ETH. + * @param amountInWei Amount of ETH in Wei the caller wishes to deposit. + * @param depositor The hex encoded user Ethereum address that would like to make the deposit. + */ + public async depositAsync(amountInWei: BigNumber.BigNumber, depositor: string): Promise<void> { + assert.isBigNumber('amountInWei', amountInWei); + await assert.isSenderAddressAsync('depositor', depositor, this._web3Wrapper); + + const ethBalanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(depositor); + assert.assert(ethBalanceInWei.gte(amountInWei), ZeroExError.INSUFFICIENT_ETH_BALANCE_FOR_DEPOSIT); + + const wethContract = await this._getEtherTokenContractAsync(); + await wethContract.deposit({ + from: depositor, + value: amountInWei, + }); + } + /** + * Withdraw ETH to the withdrawer's address from the wrapped ETH smart contract in exchange for the + * equivalent number of wrapped ETH tokens. + * @param amountInWei Amount of ETH in Wei the caller wishes to withdraw. + * @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawl. + */ + public async withdrawAsync(amountInWei: BigNumber.BigNumber, withdrawer: string): Promise<void> { + assert.isBigNumber('amountInWei', amountInWei); + await assert.isSenderAddressAsync('withdrawer', withdrawer, this._web3Wrapper); + + const wethContractAddress = await this.getContractAddressAsync(); + const WETHBalanceInBaseUnits = await this._tokenWrapper.getBalanceAsync(wethContractAddress, withdrawer); + assert.assert(WETHBalanceInBaseUnits.gte(amountInWei), ZeroExError.INSUFFICIENT_WETH_BALANCE_FOR_WITHDRAWAL); + + const wethContract = await this._getEtherTokenContractAsync(); + await wethContract.withdraw(amountInWei, { + from: withdrawer, + }); + } + /** + * Retrieves the Wrapped Ether token contract address + * @return The Wrapped Ether token contract address + */ + public async getContractAddressAsync(): Promise<string> { + const wethContract = await this._getEtherTokenContractAsync(); + return wethContract.address; + } + private async _getEtherTokenContractAsync(): Promise<EtherTokenContract> { + if (!_.isUndefined(this._etherTokenContractIfExists)) { + return this._etherTokenContractIfExists; + } + const contractInstance = await this._instantiateContractIfExistsAsync((EtherTokenArtifacts as any)); + this._etherTokenContractIfExists = contractInstance as EtherTokenContract; + return this._etherTokenContractIfExists; + } +} diff --git a/src/contract_wrappers/token_wrapper.ts b/src/contract_wrappers/token_wrapper.ts index 29f9b2d1c..e34c624ab 100644 --- a/src/contract_wrappers/token_wrapper.ts +++ b/src/contract_wrappers/token_wrapper.ts @@ -28,6 +28,7 @@ export class TokenWrapper extends ContractWrapper { * Retrieves an owner's ERC20 token balance. * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed. * @param ownerAddress The hex encoded user Ethereum address whose balance you would like to check. + * @return The owner's ERC20 token balance in base units. */ public async getBalanceAsync(tokenAddress: string, ownerAddress: string): Promise<BigNumber.BigNumber> { assert.isETHAddressHex('ownerAddress', ownerAddress); |