diff options
-rw-r--r-- | packages/assert/src/index.ts | 3 | ||||
-rw-r--r-- | packages/contracts/package.json | 1 | ||||
-rw-r--r-- | packages/contracts/src/utils/constants.ts | 1 | ||||
-rw-r--r-- | packages/contracts/test/ether_token.ts | 53 | ||||
-rw-r--r-- | packages/contracts/test/unlimited_allowance_token.ts | 62 | ||||
-rw-r--r-- | packages/contracts/test/zrx_token.ts | 72 | ||||
-rw-r--r-- | packages/sol-compiler/CHANGELOG.json | 14 | ||||
-rw-r--r-- | packages/sol-compiler/package.json | 1 | ||||
-rw-r--r-- | packages/sol-compiler/src/cli.ts | 2 | ||||
-rw-r--r-- | packages/sol-compiler/src/compiler.ts | 17 | ||||
-rw-r--r-- | packages/sol-compiler/src/schemas/compiler_options_schema.ts | 26 | ||||
-rw-r--r-- | packages/website/ts/components/portal/drawer_menu.tsx | 2 | ||||
-rw-r--r-- | packages/website/ts/components/portal/portal.tsx | 2 | ||||
-rw-r--r-- | packages/website/ts/components/wallet/wallet.tsx | 36 |
14 files changed, 166 insertions, 126 deletions
diff --git a/packages/assert/src/index.ts b/packages/assert/src/index.ts index f3b3651d5..95c7b658b 100644 --- a/packages/assert/src/index.ts +++ b/packages/assert/src/index.ts @@ -64,6 +64,9 @@ export const assert = { this.assert(isWeb3Provider, this.typeAssertionMessage(variableName, 'Provider', value)); }, doesConformToSchema(variableName: string, value: any, schema: Schema, subSchemas?: Schema[]): void { + if (_.isUndefined(value)) { + throw new Error(`${variableName} can't be undefined`); + } const schemaValidator = new SchemaValidator(); if (!_.isUndefined(subSchemas)) { _.map(subSchemas, schemaValidator.addSchema.bind(schemaValidator)); diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 180b8058a..037cb7a04 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -67,7 +67,6 @@ }, "dependencies": { "@0xproject/base-contract": "^0.3.2", - "@0xproject/contract-wrappers": "^0.0.2", "@0xproject/order-utils": "^0.0.5", "@0xproject/sol-compiler": "^0.5.0", "@0xproject/types": "^0.7.0", diff --git a/packages/contracts/src/utils/constants.ts b/packages/contracts/src/utils/constants.ts index 483340186..7a0e26a48 100644 --- a/packages/contracts/src/utils/constants.ts +++ b/packages/contracts/src/utils/constants.ts @@ -32,6 +32,7 @@ export const constants = { NUM_DUMMY_ERC721_TO_DEPLOY: 1, NUM_ERC721_TOKENS_TO_MINT: 2, NULL_ADDRESS: '0x0000000000000000000000000000000000000000', + UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1), TESTRPC_PRIVATE_KEYS: _.map(TESTRPC_PRIVATE_KEYS_STRINGS, privateKeyString => ethUtil.toBuffer(privateKeyString)), INITIAL_ERC20_BALANCE: Web3Wrapper.toBaseUnitAmount(new BigNumber(10000), 18), INITIAL_ERC20_ALLOWANCE: Web3Wrapper.toBaseUnitAmount(new BigNumber(10000), 18), diff --git a/packages/contracts/test/ether_token.ts b/packages/contracts/test/ether_token.ts index 5c8a5e199..10dd635fe 100644 --- a/packages/contracts/test/ether_token.ts +++ b/packages/contracts/test/ether_token.ts @@ -1,4 +1,3 @@ -import { ContractWrappers, ContractWrappersError } from '@0xproject/contract-wrappers'; import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils'; import { BigNumber, promisify } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; @@ -18,8 +17,7 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); describe('EtherToken', () => { let account: string; const gasPrice = Web3Wrapper.toBaseUnitAmount(new BigNumber(20), 9); - let contractWrappers: ContractWrappers; - let etherTokenAddress: string; + let etherToken: WETH9Contract; before(async () => { await blockchainLifecycle.startAsync(); @@ -31,11 +29,9 @@ describe('EtherToken', () => { const accounts = await web3Wrapper.getAvailableAddressesAsync(); account = accounts[0]; - const etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.EtherToken, provider, txDefaults); - etherTokenAddress = etherToken.address; - contractWrappers = new ContractWrappers(provider, { + etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.EtherToken, provider, { gasPrice, - networkId: constants.TESTRPC_NETWORK_ID, + ...txDefaults, }); }); beforeEach(async () => { @@ -49,18 +45,18 @@ describe('EtherToken', () => { const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); const ethToDeposit = initEthBalance.plus(1); - return expect( - contractWrappers.etherToken.depositAsync(etherTokenAddress, ethToDeposit, account), - ).to.be.rejectedWith(ContractWrappersError.InsufficientEthBalanceForDeposit); + return expect(etherToken.deposit.sendTransactionAsync({ value: ethToDeposit })).to.be.rejectedWith( + "ender doesn't have enough funds to send tx.", + ); }); it('should convert deposited Ether to wrapped Ether tokens', async () => { const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); - const initEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + const initEthTokenBalance = await etherToken.balanceOf.callAsync(account); const ethToDeposit = new BigNumber(Web3Wrapper.toWei(new BigNumber(1))); - const txHash = await contractWrappers.etherToken.depositAsync(etherTokenAddress, ethToDeposit, account); + const txHash = await etherToken.deposit.sendTransactionAsync({ value: ethToDeposit }); const receipt = await web3Wrapper.awaitTransactionSuccessAsync( txHash, constants.AWAIT_TRANSACTION_MINED_MS, @@ -68,7 +64,7 @@ describe('EtherToken', () => { const ethSpentOnGas = gasPrice.times(receipt.gasUsed); const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); - const finalEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + const finalEthTokenBalance = await etherToken.balanceOf.callAsync(account); expect(finalEthBalance).to.be.bignumber.equal(initEthBalance.minus(ethToDeposit.plus(ethSpentOnGas))); expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.plus(ethToDeposit)); @@ -77,29 +73,24 @@ describe('EtherToken', () => { describe('withdraw', () => { it('should throw if caller attempts to withdraw greater than caller balance', async () => { - const initEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + const initEthTokenBalance = await etherToken.balanceOf.callAsync(account); const ethTokensToWithdraw = initEthTokenBalance.plus(1); - return expect( - contractWrappers.etherToken.withdrawAsync(etherTokenAddress, ethTokensToWithdraw, account), - ).to.be.rejectedWith(ContractWrappersError.InsufficientWEthBalanceForWithdrawal); + return expect(etherToken.withdraw.sendTransactionAsync(ethTokensToWithdraw)).to.be.rejectedWith( + constants.REVERT, + ); }); it('should convert ether tokens to ether with sufficient balance', async () => { const ethToDeposit = new BigNumber(Web3Wrapper.toWei(new BigNumber(1))); - await contractWrappers.etherToken.depositAsync(etherTokenAddress, ethToDeposit, account); - const initEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + await etherToken.deposit.sendTransactionAsync({ value: ethToDeposit }); + const initEthTokenBalance = await etherToken.balanceOf.callAsync(account); const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); const ethTokensToWithdraw = initEthTokenBalance; expect(ethTokensToWithdraw).to.not.be.bignumber.equal(0); - const txHash = await contractWrappers.etherToken.withdrawAsync( - etherTokenAddress, - ethTokensToWithdraw, - account, - { - gasLimit: constants.MAX_ETHERTOKEN_WITHDRAW_GAS, - }, - ); + const txHash = await etherToken.withdraw.sendTransactionAsync(ethTokensToWithdraw, { + gas: constants.MAX_ETHERTOKEN_WITHDRAW_GAS, + }); const receipt = await web3Wrapper.awaitTransactionSuccessAsync( txHash, constants.AWAIT_TRANSACTION_MINED_MS, @@ -107,7 +98,7 @@ describe('EtherToken', () => { const ethSpentOnGas = gasPrice.times(receipt.gasUsed); const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); - const finalEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + const finalEthTokenBalance = await etherToken.balanceOf.callAsync(account); expect(finalEthBalance).to.be.bignumber.equal( initEthBalance.plus(ethTokensToWithdraw.minus(ethSpentOnGas)), @@ -119,13 +110,13 @@ describe('EtherToken', () => { describe('fallback', () => { it('should convert sent ether to ether tokens', async () => { const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); - const initEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + const initEthTokenBalance = await etherToken.balanceOf.callAsync(account); const ethToDeposit = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18); const txHash = await web3Wrapper.sendTransactionAsync({ from: account, - to: etherTokenAddress, + to: etherToken.address, value: ethToDeposit, gasPrice, }); @@ -137,7 +128,7 @@ describe('EtherToken', () => { const ethSpentOnGas = gasPrice.times(receipt.gasUsed); const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account); - const finalEthTokenBalance = await contractWrappers.token.getBalanceAsync(etherTokenAddress, account); + const finalEthTokenBalance = await etherToken.balanceOf.callAsync(account); expect(finalEthBalance).to.be.bignumber.equal(initEthBalance.minus(ethToDeposit.plus(ethSpentOnGas))); expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.plus(ethToDeposit)); diff --git a/packages/contracts/test/unlimited_allowance_token.ts b/packages/contracts/test/unlimited_allowance_token.ts index e3e3bd485..c68d8bdcf 100644 --- a/packages/contracts/test/unlimited_allowance_token.ts +++ b/packages/contracts/test/unlimited_allowance_token.ts @@ -1,4 +1,3 @@ -import { ContractWrappers } from '@0xproject/contract-wrappers'; import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils'; import { BigNumber } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; @@ -19,12 +18,7 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); describe('UnlimitedAllowanceToken', () => { let owner: string; let spender: string; - const contractWrappers = new ContractWrappers(provider, { - networkId: constants.TESTRPC_NETWORK_ID, - }); - const MAX_MINT_VALUE = new BigNumber(100000000000000000000); - let tokenAddress: string; let token: DummyERC20TokenContract; before(async () => { @@ -50,7 +44,6 @@ describe('UnlimitedAllowanceToken', () => { await token.mint.sendTransactionAsync(MAX_MINT_VALUE, { from: owner }), constants.AWAIT_TRANSACTION_MINED_MS, ); - tokenAddress = token.address; }); beforeEach(async () => { await blockchainLifecycle.startAsync(); @@ -60,7 +53,7 @@ describe('UnlimitedAllowanceToken', () => { }); describe('transfer', () => { it('should throw if owner has insufficient balance', async () => { - const ownerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const ownerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = ownerBalance.plus(1); return expect(token.transfer.callAsync(spender, amountToTransfer, { from: owner })).to.be.rejectedWith( constants.REVERT, @@ -69,11 +62,11 @@ describe('UnlimitedAllowanceToken', () => { it('should transfer balance from sender to receiver', async () => { const receiver = spender; - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const initOwnerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = new BigNumber(1); - await contractWrappers.token.transferAsync(tokenAddress, owner, receiver, amountToTransfer); - const finalOwnerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); - const finalReceiverBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, receiver); + await token.transfer.sendTransactionAsync(receiver, amountToTransfer, { from: owner }); + const finalOwnerBalance = await token.balanceOf.callAsync(owner); + const finalReceiverBalance = await token.balanceOf.callAsync(receiver); const expectedFinalOwnerBalance = initOwnerBalance.minus(amountToTransfer); const expectedFinalReceiverBalance = amountToTransfer; @@ -91,9 +84,9 @@ describe('UnlimitedAllowanceToken', () => { describe('transferFrom', () => { it('should throw if owner has insufficient balance', async () => { - const ownerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const ownerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = ownerBalance.plus(1); - await contractWrappers.token.setAllowanceAsync(tokenAddress, owner, spender, amountToTransfer); + await token.approve.sendTransactionAsync(spender, amountToTransfer, { from: owner }); return expect( token.transferFrom.callAsync(owner, spender, amountToTransfer, { from: spender, @@ -102,10 +95,10 @@ describe('UnlimitedAllowanceToken', () => { }); it('should throw if spender has insufficient allowance', async () => { - const ownerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const ownerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = ownerBalance; - const spenderAllowance = await contractWrappers.token.getAllowanceAsync(tokenAddress, owner, spender); + const spenderAllowance = await token.allowance.callAsync(owner, spender); const isSpenderAllowanceInsufficient = spenderAllowance.cmp(amountToTransfer) < 0; expect(isSpenderAllowanceInsufficient).to.be.true(); @@ -125,44 +118,47 @@ describe('UnlimitedAllowanceToken', () => { }); it('should not modify spender allowance if spender allowance is 2^256 - 1', async () => { - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const initOwnerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = initOwnerBalance; - const initSpenderAllowance = contractWrappers.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; - await contractWrappers.token.setAllowanceAsync(tokenAddress, owner, spender, initSpenderAllowance); - await contractWrappers.token.transferFromAsync(tokenAddress, owner, spender, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS, + const initSpenderAllowance = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; + await token.approve.sendTransactionAsync(spender, initSpenderAllowance, { from: owner }); + await token.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, { + from: spender, + gas: constants.MAX_TOKEN_TRANSFERFROM_GAS, }); - const newSpenderAllowance = await contractWrappers.token.getAllowanceAsync(tokenAddress, owner, spender); + const newSpenderAllowance = await token.allowance.callAsync(owner, spender); expect(initSpenderAllowance).to.be.bignumber.equal(newSpenderAllowance); }); it('should transfer the correct balances if spender has sufficient allowance', async () => { - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const initOwnerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = initOwnerBalance; const initSpenderAllowance = initOwnerBalance; - await contractWrappers.token.setAllowanceAsync(tokenAddress, owner, spender, initSpenderAllowance); - await contractWrappers.token.transferFromAsync(tokenAddress, owner, spender, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS, + await token.approve.sendTransactionAsync(spender, initSpenderAllowance, { from: owner }); + await token.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, { + from: spender, + gas: constants.MAX_TOKEN_TRANSFERFROM_GAS, }); - const newOwnerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); - const newSpenderBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, spender); + const newOwnerBalance = await token.balanceOf.callAsync(owner); + const newSpenderBalance = await token.balanceOf.callAsync(spender); expect(newOwnerBalance).to.be.bignumber.equal(0); expect(newSpenderBalance).to.be.bignumber.equal(initOwnerBalance); }); it('should modify allowance if spender has sufficient allowance less than 2^256 - 1', async () => { - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(tokenAddress, owner); + const initOwnerBalance = await token.balanceOf.callAsync(owner); const amountToTransfer = initOwnerBalance; const initSpenderAllowance = initOwnerBalance; - await contractWrappers.token.setAllowanceAsync(tokenAddress, owner, spender, initSpenderAllowance); - await contractWrappers.token.transferFromAsync(tokenAddress, owner, spender, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS, + await token.approve.sendTransactionAsync(spender, initSpenderAllowance, { from: owner }); + await token.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, { + from: spender, + gas: constants.MAX_TOKEN_TRANSFERFROM_GAS, }); - const newSpenderAllowance = await contractWrappers.token.getAllowanceAsync(tokenAddress, owner, spender); + const newSpenderAllowance = await token.allowance.callAsync(owner, spender); expect(newSpenderAllowance).to.be.bignumber.equal(0); }); }); diff --git a/packages/contracts/test/zrx_token.ts b/packages/contracts/test/zrx_token.ts index e632364ef..fe37e802b 100644 --- a/packages/contracts/test/zrx_token.ts +++ b/packages/contracts/test/zrx_token.ts @@ -1,4 +1,3 @@ -import { ContractWrappers } from '@0xproject/contract-wrappers'; import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils'; import { BigNumber } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; @@ -19,12 +18,8 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); describe('ZRXToken', () => { let owner: string; let spender: string; - let contractWrappers: ContractWrappers; - let MAX_UINT: BigNumber; - let zrxToken: ZRXTokenContract; - let zrxAddress: string; before(async () => { await blockchainLifecycle.startAsync(); @@ -36,12 +31,8 @@ describe('ZRXToken', () => { const accounts = await web3Wrapper.getAvailableAddressesAsync(); owner = accounts[0]; spender = accounts[1]; - contractWrappers = new ContractWrappers(provider, { - networkId: constants.TESTRPC_NETWORK_ID, - }); zrxToken = await ZRXTokenContract.deployFrom0xArtifactAsync(artifacts.ZRX, provider, txDefaults); - zrxAddress = zrxToken.address; - MAX_UINT = contractWrappers.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; + MAX_UINT = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; }); beforeEach(async () => { await blockchainLifecycle.startAsync(); @@ -77,7 +68,7 @@ describe('ZRXToken', () => { describe('constructor', () => { it('should initialize owner balance to totalSupply', async () => { - const ownerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); + const ownerBalance = await zrxToken.balanceOf.callAsync(owner); const totalSupply = new BigNumber(await zrxToken.totalSupply.callAsync()); expect(totalSupply).to.be.bignumber.equal(ownerBalance); }); @@ -86,11 +77,11 @@ describe('ZRXToken', () => { describe('transfer', () => { it('should transfer balance from sender to receiver', async () => { const receiver = spender; - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); + const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner); const amountToTransfer = new BigNumber(1); - await contractWrappers.token.transferAsync(zrxAddress, owner, receiver, amountToTransfer); - const finalOwnerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); - const finalReceiverBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, receiver); + await zrxToken.transfer.sendTransactionAsync(receiver, amountToTransfer, { from: owner }); + const finalOwnerBalance = await zrxToken.balanceOf.callAsync(owner); + const finalReceiverBalance = await zrxToken.balanceOf.callAsync(receiver); const expectedFinalOwnerBalance = initOwnerBalance.minus(amountToTransfer); const expectedFinalReceiverBalance = amountToTransfer; @@ -108,10 +99,11 @@ describe('ZRXToken', () => { describe('transferFrom', () => { it('should return false if owner has insufficient balance', async () => { - const ownerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); + const ownerBalance = await zrxToken.balanceOf.callAsync(owner); const amountToTransfer = ownerBalance.plus(1); - await contractWrappers.token.setAllowanceAsync(zrxAddress, owner, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_APPROVE_GAS, + await zrxToken.approve.sendTransactionAsync(spender, amountToTransfer, { + from: owner, + gas: constants.MAX_TOKEN_APPROVE_GAS, }); const didReturnTrue = await zrxToken.transferFrom.callAsync(owner, spender, amountToTransfer, { from: spender, @@ -120,10 +112,10 @@ describe('ZRXToken', () => { }); it('should return false if spender has insufficient allowance', async () => { - const ownerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); + const ownerBalance = await zrxToken.balanceOf.callAsync(owner); const amountToTransfer = ownerBalance; - const spenderAllowance = await contractWrappers.token.getAllowanceAsync(zrxAddress, owner, spender); + const spenderAllowance = await zrxToken.allowance.callAsync(owner, spender); const isSpenderAllowanceInsufficient = spenderAllowance.cmp(amountToTransfer) < 0; expect(isSpenderAllowanceInsufficient).to.be.true(); @@ -142,46 +134,50 @@ describe('ZRXToken', () => { }); it('should not modify spender allowance if spender allowance is 2^256 - 1', async () => { - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); + const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner); const amountToTransfer = initOwnerBalance; const initSpenderAllowance = MAX_UINT; - await contractWrappers.token.setAllowanceAsync(zrxAddress, owner, spender, initSpenderAllowance, { - gasLimit: constants.MAX_TOKEN_APPROVE_GAS, + await zrxToken.approve.sendTransactionAsync(spender, initSpenderAllowance, { + from: owner, + gas: constants.MAX_TOKEN_APPROVE_GAS, }); - await contractWrappers.token.transferFromAsync(zrxAddress, owner, spender, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS, + await zrxToken.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, { + from: spender, + gas: constants.MAX_TOKEN_TRANSFERFROM_GAS, }); - const newSpenderAllowance = await contractWrappers.token.getAllowanceAsync(zrxAddress, owner, spender); + const newSpenderAllowance = await zrxToken.allowance.callAsync(owner, spender); expect(initSpenderAllowance).to.be.bignumber.equal(newSpenderAllowance); }); it('should transfer the correct balances if spender has sufficient allowance', async () => { - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); - const initSpenderBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, spender); + const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner); + const initSpenderBalance = await zrxToken.balanceOf.callAsync(spender); const amountToTransfer = initOwnerBalance; const initSpenderAllowance = initOwnerBalance; - await contractWrappers.token.setAllowanceAsync(zrxAddress, owner, spender, initSpenderAllowance); - await contractWrappers.token.transferFromAsync(zrxAddress, owner, spender, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS, + await zrxToken.approve.sendTransactionAsync(spender, initSpenderAllowance); + await zrxToken.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, { + from: spender, + gas: constants.MAX_TOKEN_TRANSFERFROM_GAS, }); - const newOwnerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); - const newSpenderBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, spender); + const newOwnerBalance = await zrxToken.balanceOf.callAsync(owner); + const newSpenderBalance = await zrxToken.balanceOf.callAsync(spender); expect(newOwnerBalance).to.be.bignumber.equal(0); expect(newSpenderBalance).to.be.bignumber.equal(initSpenderBalance.plus(initOwnerBalance)); }); it('should modify allowance if spender has sufficient allowance less than 2^256 - 1', async () => { - const initOwnerBalance = await contractWrappers.token.getBalanceAsync(zrxAddress, owner); + const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner); const amountToTransfer = initOwnerBalance; - await contractWrappers.token.setAllowanceAsync(zrxAddress, owner, spender, amountToTransfer); - await contractWrappers.token.transferFromAsync(zrxAddress, owner, spender, spender, amountToTransfer, { - gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS, + await zrxToken.approve.sendTransactionAsync(spender, amountToTransfer); + await zrxToken.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, { + from: spender, + gas: constants.MAX_TOKEN_TRANSFERFROM_GAS, }); - const newSpenderAllowance = await contractWrappers.token.getAllowanceAsync(zrxAddress, owner, spender); + const newSpenderAllowance = await zrxToken.allowance.callAsync(owner, spender); expect(newSpenderAllowance).to.be.bignumber.equal(0); }); }); diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json index 33fd99e4f..e0ebd3a2d 100644 --- a/packages/sol-compiler/CHANGELOG.json +++ b/packages/sol-compiler/CHANGELOG.json @@ -1,5 +1,19 @@ [ { + "version": "0.5.1", + "changes": [ + { + "note": "Make `opts` constructor parameter optional", + "pr": 621 + }, + { + "note": "Add schema validation for compiler configuration", + "pr": 621 + } + ], + "timestamp": 1527009133 + }, + { "version": "0.5.0", "changes": [ { diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json index 7e55d718d..a74e4ae3e 100644 --- a/packages/sol-compiler/package.json +++ b/packages/sol-compiler/package.json @@ -72,6 +72,7 @@ "zeppelin-solidity": "1.8.0" }, "dependencies": { + "@0xproject/assert": "0.2.10", "@0xproject/json-schemas": "0.7.22", "@0xproject/sol-resolver": "^0.0.5", "@0xproject/types": "^0.7.0", diff --git a/packages/sol-compiler/src/cli.ts b/packages/sol-compiler/src/cli.ts index d107e8b37..b97cf4cab 100644 --- a/packages/sol-compiler/src/cli.ts +++ b/packages/sol-compiler/src/cli.ts @@ -35,7 +35,7 @@ const SEPARATOR = ','; : argv.contracts === DEFAULT_CONTRACTS_LIST ? DEFAULT_CONTRACTS_LIST : argv.contracts.split(SEPARATOR); - const opts: CompilerOptions = { + const opts = { contractsDir: argv.contractsDir, artifactsDir: argv.artifactsDir, contracts, diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts index 2ebc5228e..1d5bdb940 100644 --- a/packages/sol-compiler/src/compiler.ts +++ b/packages/sol-compiler/src/compiler.ts @@ -1,3 +1,4 @@ +import { assert } from '@0xproject/assert'; import { ContractSource, ContractSources, @@ -22,6 +23,7 @@ import * as requireFromString from 'require-from-string'; import * as semver from 'semver'; import solc = require('solc'); +import { compilerOptionsSchema } from './schemas/compiler_options_schema'; import { binPaths } from './solc/bin_paths'; import { createDirIfDoesNotExistAsync, @@ -80,16 +82,19 @@ export class Compiler { * Instantiates a new instance of the Compiler class. * @return An instance of the Compiler class. */ - constructor(opts: CompilerOptions) { + constructor(opts?: CompilerOptions) { + assert.doesConformToSchema('opts', opts, compilerOptionsSchema); // TODO: Look for config file in parent directories if not found in current directory const config: CompilerOptions = fs.existsSync(CONFIG_FILE) ? JSON.parse(fs.readFileSync(CONFIG_FILE).toString()) : {}; - this._contractsDir = opts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR; - this._solcVersionIfExists = opts.solcVersion || config.solcVersion; - this._compilerSettings = opts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS; - this._artifactsDir = opts.artifactsDir || config.artifactsDir || DEFAULT_ARTIFACTS_DIR; - this._specifiedContracts = opts.contracts || config.contracts || ALL_CONTRACTS_IDENTIFIER; + const passedOpts = opts || {}; + assert.doesConformToSchema('compiler.json', config, compilerOptionsSchema); + this._contractsDir = passedOpts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR; + this._solcVersionIfExists = passedOpts.solcVersion || config.solcVersion; + this._compilerSettings = passedOpts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS; + this._artifactsDir = passedOpts.artifactsDir || config.artifactsDir || DEFAULT_ARTIFACTS_DIR; + this._specifiedContracts = passedOpts.contracts || config.contracts || ALL_CONTRACTS_IDENTIFIER; this._nameResolver = new NameResolver(path.resolve(this._contractsDir)); const resolver = new FallthroughResolver(); resolver.appendResolver(new URLResolver()); diff --git a/packages/sol-compiler/src/schemas/compiler_options_schema.ts b/packages/sol-compiler/src/schemas/compiler_options_schema.ts new file mode 100644 index 000000000..43a9c0879 --- /dev/null +++ b/packages/sol-compiler/src/schemas/compiler_options_schema.ts @@ -0,0 +1,26 @@ +export const compilerOptionsSchema = { + id: '/CompilerOptions', + properties: { + contractsDir: { type: 'string' }, + artifactsDir: { type: 'string' }, + solcVersion: { type: 'string', pattern: '^d+.d+.d+$' }, + compilerSettings: { type: 'object' }, + contracts: { + oneOf: [ + { + type: 'string', + pattern: '^\\*$', + }, + { + type: 'array', + items: { + type: 'string', + }, + }, + ], + }, + }, + type: 'object', + required: [], + additionalProperties: false, +}; diff --git a/packages/website/ts/components/portal/drawer_menu.tsx b/packages/website/ts/components/portal/drawer_menu.tsx index 75c8ac6c2..ace11639a 100644 --- a/packages/website/ts/components/portal/drawer_menu.tsx +++ b/packages/website/ts/components/portal/drawer_menu.tsx @@ -36,7 +36,7 @@ export interface DrawerMenuProps { } export const DrawerMenu = (props: DrawerMenuProps) => { const relayerItemEntry = { - to: `${WebsitePaths.Portal}/`, + to: `${WebsitePaths.Portal}`, labelText: 'Relayer ecosystem', iconName: 'zmdi-portable-wifi', }; diff --git a/packages/website/ts/components/portal/portal.tsx b/packages/website/ts/components/portal/portal.tsx index a03731ec0..0e1506e17 100644 --- a/packages/website/ts/components/portal/portal.tsx +++ b/packages/website/ts/components/portal/portal.tsx @@ -296,6 +296,8 @@ export class Portal extends React.Component<PortalProps, PortalState> { lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch} injectedProviderName={this.props.injectedProviderName} providerType={this.props.providerType} + screenWidth={this.props.screenWidth} + location={this.props.location} onToggleLedgerDialog={this._onToggleLedgerDialog.bind(this)} onAddToken={this._onAddToken.bind(this)} onRemoveToken={this._onRemoveToken.bind(this)} diff --git a/packages/website/ts/components/wallet/wallet.tsx b/packages/website/ts/components/wallet/wallet.tsx index d72c5458f..30d1285f4 100644 --- a/packages/website/ts/components/wallet/wallet.tsx +++ b/packages/website/ts/components/wallet/wallet.tsx @@ -35,6 +35,7 @@ import { BlockchainErrs, ItemByAddress, ProviderType, + ScreenWidths, Side, Token, TokenByAddress, @@ -62,6 +63,8 @@ export interface WalletProps { lastForceTokenStateRefetch: number; injectedProviderName: string; providerType: ProviderType; + screenWidth: ScreenWidths; + location: Location; onToggleLedgerDialog: () => void; onAddToken: () => void; onRemoveToken: () => void; @@ -119,8 +122,6 @@ const styles: Styles = { paddingBottom: 8, }, bodyInnerDiv: { - // TODO: make this completely responsive - maxHeight: 475, overflow: 'auto', WebkitOverflowScrolling: 'touch', }, @@ -140,6 +141,7 @@ const DISCONNECTED_ITEM_KEY = 'DISCONNECTED'; const ETHER_ITEM_KEY = 'ETHER'; const USD_DECIMAL_PLACES = 2; const NO_ALLOWANCE_TOGGLE_SPACE_WIDTH = 56; +const ACCOUNT_PATH = `${WebsitePaths.Portal}/account`; export class Wallet extends React.Component<WalletProps, WalletState> { private _isUnmounted: boolean; @@ -226,7 +228,7 @@ export class Wallet extends React.Component<WalletProps, WalletState> { const userAddress = this.props.userAddress; const primaryText = utils.getAddressBeginAndEnd(userAddress); return ( - <Link key={HEADER_ITEM_KEY} to={`${WebsitePaths.Portal}/account`} style={{ textDecoration: 'none' }}> + <Link key={HEADER_ITEM_KEY} to={ACCOUNT_PATH} style={{ textDecoration: 'none' }}> <ListItem primaryText={primaryText} leftIcon={<Identicon address={userAddress} diameter={ICON_DIMENSION} />} @@ -240,6 +242,8 @@ export class Wallet extends React.Component<WalletProps, WalletState> { const bodyStyle: React.CSSProperties = { ...styles.bodyInnerDiv, overflow: this.state.isHoveringSidebar ? 'auto' : 'hidden', + // TODO: make this completely responsive + maxHeight: this.props.screenWidth !== ScreenWidths.Sm ? 475 : undefined, }; return ( <div @@ -296,18 +300,20 @@ export class Wallet extends React.Component<WalletProps, WalletState> { innerDivStyle={styles.footerItemInnerDiv} style={styles.borderedItem} /> - <Link to={`${WebsitePaths.Portal}/account`} style={{ textDecoration: 'none' }}> - <ListItem - primaryText={ - <div className="flex right" style={styles.manageYourWalletText}> - {'manage your wallet'} - </div> - // https://github.com/palantir/tslint-react/issues/140 - // tslint:disable-next-line:jsx-curly-spacing - } - style={{ ...styles.paddedItem, ...styles.borderedItem }} - /> - </Link> + {this.props.location.pathname !== ACCOUNT_PATH && ( + <Link to={ACCOUNT_PATH} style={{ textDecoration: 'none' }}> + <ListItem + primaryText={ + <div className="flex right" style={styles.manageYourWalletText}> + {'manage your wallet'} + </div> + // https://github.com/palantir/tslint-react/issues/140 + // tslint:disable-next-line:jsx-curly-spacing + } + style={{ ...styles.paddedItem, ...styles.borderedItem }} + /> + </Link> + )} </div> ); } |