Add assertions for txOpts and methodOpts

This commit is contained in:
Leonid Logvinov 2018-06-29 11:48:18 +03:00
parent de40497330
commit f7b3fc58bc
No known key found for this signature in database
GPG Key ID: 0DD294BFDE8C95D4
4 changed files with 75 additions and 38 deletions

View File

@ -5,6 +5,8 @@ import { ContractAbi, LogWithDecodedArgs } from 'ethereum-types';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { artifacts } from '../artifacts'; import { artifacts } from '../artifacts';
import { methodOptsSchema } from '../schemas/method_opts_schema';
import { txOptsSchema } from '../schemas/tx_opts_schema';
import { import {
BlockRange, BlockRange,
ContractWrappersError, ContractWrappersError,
@ -49,6 +51,9 @@ export class ERC20TokenWrapper extends ContractWrapper {
): Promise<BigNumber> { ): Promise<BigNumber> {
assert.isETHAddressHex('ownerAddress', ownerAddress); assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase(); const normalizedOwnerAddress = ownerAddress.toLowerCase();
@ -81,6 +86,9 @@ export class ERC20TokenWrapper extends ContractWrapper {
assert.isETHAddressHex('spenderAddress', spenderAddress); assert.isETHAddressHex('spenderAddress', spenderAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper); await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
if (!_.isUndefined(txOpts)) {
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedSpenderAddress = spenderAddress.toLowerCase(); const normalizedSpenderAddress = spenderAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase(); const normalizedOwnerAddress = ownerAddress.toLowerCase();
@ -112,16 +120,10 @@ export class ERC20TokenWrapper extends ContractWrapper {
spenderAddress: string, spenderAddress: string,
txOpts: TransactionOpts = {}, txOpts: TransactionOpts = {},
): Promise<string> { ): Promise<string> {
assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('spenderAddress', spenderAddress);
const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase();
const normalizedSpenderAddress = spenderAddress.toLowerCase();
const txHash = await this.setAllowanceAsync( const txHash = await this.setAllowanceAsync(
normalizedTokenAddress, tokenAddress,
normalizedOwnerAddress, ownerAddress,
normalizedSpenderAddress, spenderAddress,
this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS, this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
txOpts, txOpts,
); );
@ -144,6 +146,9 @@ export class ERC20TokenWrapper extends ContractWrapper {
assert.isETHAddressHex('ownerAddress', ownerAddress); assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('spenderAddress', spenderAddress); assert.isETHAddressHex('spenderAddress', spenderAddress);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase(); const normalizedOwnerAddress = ownerAddress.toLowerCase();
const normalizedSpenderAddress = spenderAddress.toLowerCase(); const normalizedSpenderAddress = spenderAddress.toLowerCase();
@ -172,18 +177,8 @@ export class ERC20TokenWrapper extends ContractWrapper {
ownerAddress: string, ownerAddress: string,
methodOpts?: MethodOpts, methodOpts?: MethodOpts,
): Promise<BigNumber> { ): Promise<BigNumber> {
assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress);
const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase();
const proxyAddress = this._erc20ProxyWrapper.getContractAddress(); const proxyAddress = this._erc20ProxyWrapper.getContractAddress();
const allowanceInBaseUnits = await this.getAllowanceAsync( const allowanceInBaseUnits = await this.getAllowanceAsync(tokenAddress, ownerAddress, proxyAddress, methodOpts);
normalizedTokenAddress,
normalizedOwnerAddress,
proxyAddress,
methodOpts,
);
return allowanceInBaseUnits; return allowanceInBaseUnits;
} }
/** /**
@ -202,16 +197,10 @@ export class ERC20TokenWrapper extends ContractWrapper {
amountInBaseUnits: BigNumber, amountInBaseUnits: BigNumber,
txOpts: TransactionOpts = {}, txOpts: TransactionOpts = {},
): Promise<string> { ): Promise<string> {
assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress);
const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase();
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
const proxyAddress = this._erc20ProxyWrapper.getContractAddress(); const proxyAddress = this._erc20ProxyWrapper.getContractAddress();
const txHash = await this.setAllowanceAsync( const txHash = await this.setAllowanceAsync(
normalizedTokenAddress, tokenAddress,
normalizedOwnerAddress, ownerAddress,
proxyAddress, proxyAddress,
amountInBaseUnits, amountInBaseUnits,
txOpts, txOpts,
@ -234,13 +223,9 @@ export class ERC20TokenWrapper extends ContractWrapper {
ownerAddress: string, ownerAddress: string,
txOpts: TransactionOpts = {}, txOpts: TransactionOpts = {},
): Promise<string> { ): Promise<string> {
assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress);
const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase();
const txHash = await this.setProxyAllowanceAsync( const txHash = await this.setProxyAllowanceAsync(
normalizedTokenAddress, tokenAddress,
normalizedOwnerAddress, ownerAddress,
this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS, this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
txOpts, txOpts,
); );
@ -265,6 +250,9 @@ export class ERC20TokenWrapper extends ContractWrapper {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('toAddress', toAddress); assert.isETHAddressHex('toAddress', toAddress);
await assert.isSenderAddressAsync('fromAddress', fromAddress, this._web3Wrapper); await assert.isSenderAddressAsync('fromAddress', fromAddress, this._web3Wrapper);
if (!_.isUndefined(txOpts)) {
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedFromAddress = fromAddress.toLowerCase(); const normalizedFromAddress = fromAddress.toLowerCase();
const normalizedToAddress = toAddress.toLowerCase(); const normalizedToAddress = toAddress.toLowerCase();
@ -310,6 +298,9 @@ export class ERC20TokenWrapper extends ContractWrapper {
assert.isETHAddressHex('fromAddress', fromAddress); assert.isETHAddressHex('fromAddress', fromAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper); await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
if (!_.isUndefined(txOpts)) {
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
}
const normalizedToAddress = toAddress.toLowerCase(); const normalizedToAddress = toAddress.toLowerCase();
const normalizedFromAddress = fromAddress.toLowerCase(); const normalizedFromAddress = fromAddress.toLowerCase();
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();

View File

@ -6,6 +6,8 @@ import * as _ from 'lodash';
import { constants } from '../../test/utils/constants'; import { constants } from '../../test/utils/constants';
import { artifacts } from '../artifacts'; import { artifacts } from '../artifacts';
import { methodOptsSchema } from '../schemas/method_opts_schema';
import { txOptsSchema } from '../schemas/tx_opts_schema';
import { import {
BlockRange, BlockRange,
ContractWrappersError, ContractWrappersError,
@ -49,6 +51,9 @@ export class ERC721TokenWrapper extends ContractWrapper {
): Promise<BigNumber> { ): Promise<BigNumber> {
assert.isETHAddressHex('ownerAddress', ownerAddress); assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase(); const normalizedOwnerAddress = ownerAddress.toLowerCase();
@ -71,6 +76,9 @@ export class ERC721TokenWrapper extends ContractWrapper {
public async getOwnerOfAsync(tokenAddress: string, tokenId: BigNumber, methodOpts?: MethodOpts): Promise<string> { public async getOwnerOfAsync(tokenAddress: string, tokenId: BigNumber, methodOpts?: MethodOpts): Promise<string> {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isBigNumber('tokenId', tokenId); assert.isBigNumber('tokenId', tokenId);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress); const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
@ -100,6 +108,9 @@ export class ERC721TokenWrapper extends ContractWrapper {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('ownerAddress', ownerAddress); assert.isETHAddressHex('ownerAddress', ownerAddress);
assert.isETHAddressHex('operatorAddress', operatorAddress); assert.isETHAddressHex('operatorAddress', operatorAddress);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase(); const normalizedOwnerAddress = ownerAddress.toLowerCase();
const normalizedOperatorAddress = operatorAddress.toLowerCase(); const normalizedOperatorAddress = operatorAddress.toLowerCase();
@ -127,10 +138,17 @@ export class ERC721TokenWrapper extends ContractWrapper {
ownerAddress: string, ownerAddress: string,
methodOpts?: MethodOpts, methodOpts?: MethodOpts,
): Promise<boolean> { ): Promise<boolean> {
assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('ownerAddress', ownerAddress);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase();
const proxyAddress = this._erc721ProxyWrapper.getContractAddress(); const proxyAddress = this._erc721ProxyWrapper.getContractAddress();
const isProxyApprovedForAll = await this.isApprovedForAllAsync( const isProxyApprovedForAll = await this.isApprovedForAllAsync(
tokenAddress, normalizedTokenAddress,
ownerAddress, normalizedOwnerAddress,
proxyAddress, proxyAddress,
methodOpts, methodOpts,
); );
@ -151,6 +169,9 @@ export class ERC721TokenWrapper extends ContractWrapper {
): Promise<string | undefined> { ): Promise<string | undefined> {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isBigNumber('tokenId', tokenId); assert.isBigNumber('tokenId', tokenId);
if (!_.isUndefined(methodOpts)) {
assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress); const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
@ -199,9 +220,12 @@ export class ERC721TokenWrapper extends ContractWrapper {
txOpts: TransactionOpts = {}, txOpts: TransactionOpts = {},
): Promise<string> { ): Promise<string> {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('ownerAddress', ownerAddress); await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
assert.isETHAddressHex('operatorAddress', operatorAddress); assert.isETHAddressHex('operatorAddress', operatorAddress);
assert.isBoolean('isApproved', isApproved); assert.isBoolean('isApproved', isApproved);
if (!_.isUndefined(txOpts)) {
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedOwnerAddress = ownerAddress.toLowerCase(); const normalizedOwnerAddress = ownerAddress.toLowerCase();
const normalizedOperatorAddress = operatorAddress.toLowerCase(); const normalizedOperatorAddress = operatorAddress.toLowerCase();
@ -260,11 +284,15 @@ export class ERC721TokenWrapper extends ContractWrapper {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('approvedAddress', approvedAddress); assert.isETHAddressHex('approvedAddress', approvedAddress);
assert.isBigNumber('tokenId', tokenId); assert.isBigNumber('tokenId', tokenId);
if (!_.isUndefined(txOpts)) {
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedApprovedAddress = approvedAddress.toLowerCase(); const normalizedApprovedAddress = approvedAddress.toLowerCase();
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress); const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
const tokenOwnerAddress = await tokenContract.ownerOf.callAsync(tokenId); const tokenOwnerAddress = await tokenContract.ownerOf.callAsync(tokenId);
await assert.isSenderAddressAsync('tokenOwnerAddress', tokenOwnerAddress, this._web3Wrapper);
const txHash = await tokenContract.approve.sendTransactionAsync(normalizedApprovedAddress, tokenId, { const txHash = await tokenContract.approve.sendTransactionAsync(normalizedApprovedAddress, tokenId, {
gas: txOpts.gasLimit, gas: txOpts.gasLimit,
gasPrice: txOpts.gasPrice, gasPrice: txOpts.gasPrice,
@ -311,7 +339,10 @@ export class ERC721TokenWrapper extends ContractWrapper {
): Promise<string> { ): Promise<string> {
assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isETHAddressHex('tokenAddress', tokenAddress);
assert.isETHAddressHex('receiverAddress', receiverAddress); assert.isETHAddressHex('receiverAddress', receiverAddress);
assert.isETHAddressHex('senderAddress', senderAddress); await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
if (!_.isUndefined(txOpts)) {
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
}
const normalizedTokenAddress = tokenAddress.toLowerCase(); const normalizedTokenAddress = tokenAddress.toLowerCase();
const normalizedReceiverAddress = receiverAddress.toLowerCase(); const normalizedReceiverAddress = receiverAddress.toLowerCase();
const normalizedSenderAddress = senderAddress.toLowerCase(); const normalizedSenderAddress = senderAddress.toLowerCase();

View File

@ -0,0 +1,7 @@
export const methodOptsSchema = {
id: '/MethodOpts',
properties: {
defaultBlock: { $ref: '/BlockParam' },
},
type: 'object',
};

View File

@ -0,0 +1,8 @@
export const txOptsSchema = {
id: '/TxOpts',
properties: {
gasPrice: { $ref: '/Number' },
gasLimit: { type: 'number' },
},
type: 'object',
};