aboutsummaryrefslogtreecommitdiffstats
path: root/src/contract_wrappers
diff options
context:
space:
mode:
authorLeonid <logvinov.leon@gmail.com>2017-06-27 04:23:02 +0800
committerGitHub <noreply@github.com>2017-06-27 04:23:02 +0800
commit73eb78d7934008647eb40d5c1bd16686ea15e229 (patch)
tree15f9138d7f271264baf10ed8c4b8ba25ff83775d /src/contract_wrappers
parentd5ed5865ca7ca5697795896d1853e313093d327a (diff)
parentf15451ebfd956c159f376dcf9686f48eafcfe65c (diff)
downloaddexon-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.ts75
-rw-r--r--src/contract_wrappers/token_wrapper.ts1
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);