Merge branch 'development' of https://github.com/0xProject/0x-monorepo into feature/sra/add-sra-package
This commit is contained in:
@@ -80,6 +80,7 @@ jobs:
|
||||
- run: yarn wsrun test:circleci @0xproject/sra-report
|
||||
- run: yarn wsrun test:circleci @0xproject/subproviders
|
||||
- run: yarn wsrun test:circleci @0xproject/web3-wrapper
|
||||
- run: yarn wsrun test:circleci @0xproject/utils
|
||||
- save_cache:
|
||||
key: coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
|
||||
paths:
|
||||
|
||||
@@ -38,11 +38,11 @@
|
||||
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@0x-lerna-fork/lerna": "3.0.0-beta.23",
|
||||
"async-child-process": "^1.1.1",
|
||||
"coveralls": "^3.0.0",
|
||||
"ganache-cli": "6.1.3",
|
||||
"lcov-result-merger": "^3.0.0",
|
||||
"@0x-lerna-fork/lerna": "3.0.0-beta.23",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"prettier": "^1.11.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
[
|
||||
{
|
||||
"version": "1.0.1-rc.3",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "1.0.1-rc.2",
|
||||
"changes": [
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
"dirty-chai": "^2.0.1",
|
||||
"json-loader": "^0.5.4",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"opn-cli": "^3.1.0",
|
||||
@@ -110,7 +110,7 @@
|
||||
"@0xproject/web3-wrapper": "^1.1.2",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -48,10 +48,11 @@ describe('ZeroEx library', () => {
|
||||
const ethSignSignature =
|
||||
'0x1B61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3340349190569279751135161d22529dc25add4f6069af05be04cacbda2ace225403';
|
||||
const address = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
|
||||
const bytes32Zeros = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
||||
it("should return false if the data doesn't pertain to the signature & address", async () => {
|
||||
return expect((zeroEx.exchange as any).isValidSignatureAsync('0x0', address, ethSignSignature)).to.become(
|
||||
false,
|
||||
);
|
||||
return expect(
|
||||
(zeroEx.exchange as any).isValidSignatureAsync(bytes32Zeros, address, ethSignSignature),
|
||||
).to.become(false);
|
||||
});
|
||||
it("should return false if the address doesn't pertain to the signature & data", async () => {
|
||||
const validUnrelatedAddress = '0x8b0292b11a196601ed2ce54b665cafeca0347d42';
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"ethereum-types": "^1.0.3",
|
||||
"glob": "^7.1.2",
|
||||
"handlebars": "^4.0.11",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"mkdirp": "^0.5.1",
|
||||
"sleep": "^5.1.1",
|
||||
"tmp": "^0.0.33",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
@@ -50,7 +50,7 @@
|
||||
"@0xproject/json-schemas": "^1.0.1-rc.3",
|
||||
"@0xproject/typescript-typings": "^1.0.3",
|
||||
"@0xproject/utils": "^1.0.4",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"valid-url": "^1.0.9"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "2.0.0-rc.1",
|
||||
"changes": [
|
||||
{
|
||||
"pr": 915,
|
||||
"note": "Added strict encoding/decoding checks for sendTransaction and call"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1532619515,
|
||||
"version": "1.0.4",
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"chai": "^4.0.1",
|
||||
"copyfiles": "^1.2.0",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
"tslint": "5.11.0",
|
||||
@@ -48,7 +48,7 @@
|
||||
"@0xproject/web3-wrapper": "^1.1.2",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -82,6 +82,27 @@ export class BaseContract {
|
||||
}
|
||||
return txDataWithDefaults;
|
||||
}
|
||||
// Throws if the given arguments cannot be safely/correctly encoded based on
|
||||
// the given inputAbi. An argument may not be considered safely encodeable
|
||||
// if it overflows the corresponding Solidity type, there is a bug in the
|
||||
// encoder, or the encoder performs unsafe type coercion.
|
||||
public static strictArgumentEncodingCheck(inputAbi: DataItem[], args: any[]): void {
|
||||
const coder = ethers.utils.AbiCoder.defaultCoder;
|
||||
const params = abiUtils.parseEthersParams(inputAbi);
|
||||
const rawEncoded = coder.encode(params.names, params.types, args);
|
||||
const rawDecoded = coder.decode(params.names, params.types, rawEncoded);
|
||||
for (let i = 0; i < rawDecoded.length; i++) {
|
||||
const original = args[i];
|
||||
const decoded = rawDecoded[i];
|
||||
if (!abiUtils.isAbiDataEqual(params.names[i], params.types[i], original, decoded)) {
|
||||
throw new Error(
|
||||
`Cannot safely encode argument: ${params.names[i]} (${original}) of type ${
|
||||
params.types[i]
|
||||
}. (Possible type overflow or other encoding error)`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected _lookupEthersInterface(functionSignature: string): ethers.Interface {
|
||||
const ethersInterface = this._ethersInterfacesByFunctionSignature[functionSignature];
|
||||
if (_.isUndefined(ethersInterface)) {
|
||||
|
||||
114
packages/base-contract/test/base_contract_test.ts
Normal file
114
packages/base-contract/test/base_contract_test.ts
Normal file
@@ -0,0 +1,114 @@
|
||||
import * as chai from 'chai';
|
||||
import 'mocha';
|
||||
|
||||
import { BaseContract } from '../src';
|
||||
|
||||
const { expect } = chai;
|
||||
|
||||
describe('BaseContract', () => {
|
||||
describe('strictArgumentEncodingCheck', () => {
|
||||
it('works for simple types', () => {
|
||||
BaseContract.strictArgumentEncodingCheck(
|
||||
[{ name: 'to', type: 'address' }],
|
||||
['0xe834ec434daba538cd1b9fe1582052b880bd7e63'],
|
||||
);
|
||||
});
|
||||
it('works for array types', () => {
|
||||
const inputAbi = [
|
||||
{
|
||||
name: 'takerAssetFillAmounts',
|
||||
type: 'uint256[]',
|
||||
},
|
||||
];
|
||||
const args = [
|
||||
['9000000000000000000', '79000000000000000000', '979000000000000000000', '7979000000000000000000'],
|
||||
];
|
||||
BaseContract.strictArgumentEncodingCheck(inputAbi, args);
|
||||
});
|
||||
it('works for tuple/struct types', () => {
|
||||
const inputAbi = [
|
||||
{
|
||||
components: [
|
||||
{
|
||||
name: 'makerAddress',
|
||||
type: 'address',
|
||||
},
|
||||
{
|
||||
name: 'takerAddress',
|
||||
type: 'address',
|
||||
},
|
||||
{
|
||||
name: 'feeRecipientAddress',
|
||||
type: 'address',
|
||||
},
|
||||
{
|
||||
name: 'senderAddress',
|
||||
type: 'address',
|
||||
},
|
||||
{
|
||||
name: 'makerAssetAmount',
|
||||
type: 'uint256',
|
||||
},
|
||||
{
|
||||
name: 'takerAssetAmount',
|
||||
type: 'uint256',
|
||||
},
|
||||
{
|
||||
name: 'makerFee',
|
||||
type: 'uint256',
|
||||
},
|
||||
{
|
||||
name: 'takerFee',
|
||||
type: 'uint256',
|
||||
},
|
||||
{
|
||||
name: 'expirationTimeSeconds',
|
||||
type: 'uint256',
|
||||
},
|
||||
{
|
||||
name: 'salt',
|
||||
type: 'uint256',
|
||||
},
|
||||
{
|
||||
name: 'makerAssetData',
|
||||
type: 'bytes',
|
||||
},
|
||||
{
|
||||
name: 'takerAssetData',
|
||||
type: 'bytes',
|
||||
},
|
||||
],
|
||||
name: 'order',
|
||||
type: 'tuple',
|
||||
},
|
||||
];
|
||||
const args = [
|
||||
{
|
||||
makerAddress: '0x6ecbe1db9ef729cbe972c83fb886247691fb6beb',
|
||||
takerAddress: '0x0000000000000000000000000000000000000000',
|
||||
feeRecipientAddress: '0xe834ec434daba538cd1b9fe1582052b880bd7e63',
|
||||
senderAddress: '0x0000000000000000000000000000000000000000',
|
||||
makerAssetAmount: '0',
|
||||
takerAssetAmount: '200000000000000000000',
|
||||
makerFee: '1000000000000000000',
|
||||
takerFee: '1000000000000000000',
|
||||
expirationTimeSeconds: '1532563026',
|
||||
salt: '59342956082154660870994022243365949771115859664887449740907298019908621891376',
|
||||
makerAssetData: '0xf47261b00000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48',
|
||||
takerAssetData: '0xf47261b00000000000000000000000001d7022f5b17d2f8b695918fb48fa1089c9f85401',
|
||||
},
|
||||
];
|
||||
BaseContract.strictArgumentEncodingCheck(inputAbi, args);
|
||||
});
|
||||
it('throws for integer overflows', () => {
|
||||
expect(() =>
|
||||
BaseContract.strictArgumentEncodingCheck([{ name: 'amount', type: 'uint8' }], ['256']),
|
||||
).to.throw();
|
||||
});
|
||||
it('throws for fixed byte array overflows', () => {
|
||||
expect(() =>
|
||||
BaseContract.strictArgumentEncodingCheck([{ name: 'hash', type: 'bytes8' }], ['0x001122334455667788']),
|
||||
).to.throw();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -56,7 +56,7 @@
|
||||
"@0xproject/types": "^0.8.2",
|
||||
"@0xproject/typescript-typings": "^1.0.3",
|
||||
"@0xproject/utils": "^1.0.4",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"query-string": "^5.0.1",
|
||||
"sinon": "^4.0.0",
|
||||
"websocket": "^1.0.25"
|
||||
@@ -77,7 +77,7 @@
|
||||
"dirty-chai": "^2.0.1",
|
||||
"fetch-mock": "^5.13.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
{
|
||||
"version": "1.0.1-rc.3",
|
||||
"changes": [
|
||||
{
|
||||
"pr": 915,
|
||||
"note": "Added strict encoding/decoding checks for sendTransaction and call"
|
||||
},
|
||||
{
|
||||
"note": "Add ForwarderWrapper",
|
||||
"pr": 934
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"opn-cli": "^3.1.0",
|
||||
@@ -86,7 +86,7 @@
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"ethers": "3.0.22",
|
||||
"js-sha3": "^0.7.0",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"uuid": "^3.1.0"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
||||
@@ -7,6 +7,7 @@ async callAsync(
|
||||
const functionSignature = '{{this.functionSignature}}';
|
||||
const inputAbi = self._lookupAbi(functionSignature).inputs;
|
||||
[{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
|
||||
BaseContract.strictArgumentEncodingCheck(inputAbi, [{{> params inputs=inputs}}]);
|
||||
const ethersFunction = self._lookupEthersInterface(functionSignature).functions.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
) as ethers.CallDescription;
|
||||
|
||||
@@ -11,6 +11,7 @@ public {{this.tsName}} = {
|
||||
const self = this as any as {{contractName}}Contract;
|
||||
const inputAbi = self._lookupAbi('{{this.functionSignature}}').inputs;
|
||||
[{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
|
||||
BaseContract.strictArgumentEncodingCheck(inputAbi, [{{> params inputs=inputs}}]);
|
||||
const encodedData = self._lookupEthersInterface('{{this.functionSignature}}').functions.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
).data;
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
"solc": "^0.4.24",
|
||||
@@ -86,6 +86,6 @@
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"ethers": "3.0.22",
|
||||
"js-combinatorics": "^0.5.3",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,14 +96,15 @@ contract MixinSignatureValidator is
|
||||
"LENGTH_GREATER_THAN_0_REQUIRED"
|
||||
);
|
||||
|
||||
// Ensure signature is supported
|
||||
// Pop last byte off of signature byte array.
|
||||
uint8 signatureTypeRaw = uint8(signature.popLastByte());
|
||||
|
||||
// Ensure signature is supported
|
||||
require(
|
||||
signatureTypeRaw < uint8(SignatureType.NSignatureTypes),
|
||||
"SIGNATURE_UNSUPPORTED"
|
||||
);
|
||||
|
||||
// Pop last byte off of signature byte array.
|
||||
SignatureType signatureType = SignatureType(signatureTypeRaw);
|
||||
|
||||
// Variables are not scoped in Solidity.
|
||||
@@ -141,7 +142,12 @@ contract MixinSignatureValidator is
|
||||
v = uint8(signature[0]);
|
||||
r = signature.readBytes32(1);
|
||||
s = signature.readBytes32(33);
|
||||
recovered = ecrecover(hash, v, r, s);
|
||||
recovered = ecrecover(
|
||||
hash,
|
||||
v,
|
||||
r,
|
||||
s
|
||||
);
|
||||
isValid = signerAddress == recovered;
|
||||
return isValid;
|
||||
|
||||
@@ -197,7 +203,6 @@ contract MixinSignatureValidator is
|
||||
// | 0x14 + x | 1 | Signature type is always "\x06" |
|
||||
} else if (signatureType == SignatureType.Validator) {
|
||||
// Pop last 20 bytes off of signature byte array.
|
||||
|
||||
address validatorAddress = signature.popLast20Bytes();
|
||||
|
||||
// Ensure signer has approved validator.
|
||||
|
||||
@@ -142,7 +142,6 @@ contract MixinTransactions is
|
||||
// Compute hash
|
||||
result := keccak256(memPtr, 128)
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,20 +24,17 @@ import "./LibOrder.sol";
|
||||
|
||||
contract LibAbiEncoder {
|
||||
|
||||
/// @dev ABI encodes calldata for `fillOrder` in memory and returns the address range.
|
||||
/// This range can be passed into `call` or `delegatecall` to invoke an external
|
||||
/// call to `fillOrder`.
|
||||
/// @dev ABI encodes calldata for `fillOrder`.
|
||||
/// @param order Order struct containing order specifications.
|
||||
/// @param takerAssetFillAmount Desired amount of takerAsset to sell.
|
||||
/// @param signature Proof that order has been created by maker.
|
||||
/// @return calldataBegin Memory address of ABI encoded calldata.
|
||||
/// @return calldataLength Lenfgth of ABI encoded calldata.
|
||||
/// @return ABI encoded calldata for `fillOrder`.
|
||||
function abiEncodeFillOrder(
|
||||
LibOrder.Order memory order,
|
||||
uint256 takerAssetFillAmount,
|
||||
bytes memory signature
|
||||
)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (bytes memory fillOrderCalldata)
|
||||
{
|
||||
@@ -207,10 +204,10 @@ contract LibAbiEncoder {
|
||||
}
|
||||
|
||||
// Set length of calldata
|
||||
mstore(
|
||||
fillOrderCalldata,
|
||||
sub(dataAreaEnd, add(fillOrderCalldata, 0x20))
|
||||
)
|
||||
mstore(fillOrderCalldata, sub(dataAreaEnd, add(fillOrderCalldata, 0x20)))
|
||||
|
||||
// Increment free memory pointer
|
||||
mstore(0x40, dataAreaEnd)
|
||||
}
|
||||
|
||||
return fillOrderCalldata;
|
||||
|
||||
@@ -22,6 +22,7 @@ pragma experimental ABIEncoderV2;
|
||||
import "../../protocol/Exchange/Exchange.sol";
|
||||
|
||||
|
||||
// solhint-disable no-empty-blocks
|
||||
contract TestExchangeInternals is
|
||||
Exchange
|
||||
{
|
||||
|
||||
@@ -22,13 +22,33 @@ pragma experimental ABIEncoderV2;
|
||||
import "../../protocol/Exchange/libs/LibMath.sol";
|
||||
import "../../protocol/Exchange/libs/LibOrder.sol";
|
||||
import "../../protocol/Exchange/libs/LibFillResults.sol";
|
||||
import "../../protocol/Exchange/libs/LibAbiEncoder.sol";
|
||||
|
||||
|
||||
contract TestLibs is
|
||||
LibMath,
|
||||
LibOrder,
|
||||
LibFillResults
|
||||
LibFillResults,
|
||||
LibAbiEncoder
|
||||
{
|
||||
|
||||
function publicAbiEncodeFillOrder(
|
||||
Order memory order,
|
||||
uint256 takerAssetFillAmount,
|
||||
bytes memory signature
|
||||
)
|
||||
public
|
||||
pure
|
||||
returns (bytes memory fillOrderCalldata)
|
||||
{
|
||||
fillOrderCalldata = abiEncodeFillOrder(
|
||||
order,
|
||||
takerAssetFillAmount,
|
||||
signature
|
||||
);
|
||||
return fillOrderCalldata;
|
||||
}
|
||||
|
||||
function publicGetPartialAmount(
|
||||
uint256 numerator,
|
||||
uint256 denominator,
|
||||
|
||||
@@ -113,7 +113,7 @@ describe('MixinSignatureValidator', () => {
|
||||
|
||||
it('should revert when signature type is unsupported', async () => {
|
||||
const unsupportedSignatureType = SignatureType.NSignatureTypes;
|
||||
const unsupportedSignatureHex = `0x${unsupportedSignatureType}`;
|
||||
const unsupportedSignatureHex = '0x' + Buffer.from([unsupportedSignatureType]).toString('hex');
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
return expectContractCallFailed(
|
||||
signatureValidator.publicIsValidSignature.callAsync(
|
||||
@@ -126,7 +126,7 @@ describe('MixinSignatureValidator', () => {
|
||||
});
|
||||
|
||||
it('should revert when SignatureType=Illegal', async () => {
|
||||
const unsupportedSignatureHex = `0x${SignatureType.Illegal}`;
|
||||
const unsupportedSignatureHex = '0x' + Buffer.from([SignatureType.Illegal]).toString('hex');
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
return expectContractCallFailed(
|
||||
signatureValidator.publicIsValidSignature.callAsync(
|
||||
@@ -139,7 +139,7 @@ describe('MixinSignatureValidator', () => {
|
||||
});
|
||||
|
||||
it('should return false when SignatureType=Invalid and signature has a length of zero', async () => {
|
||||
const signatureHex = `0x${SignatureType.Invalid}`;
|
||||
const signatureHex = '0x' + Buffer.from([SignatureType.Invalid]).toString('hex');
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
|
||||
orderHashHex,
|
||||
|
||||
@@ -8,7 +8,7 @@ import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
|
||||
import { formatters } from './formatters';
|
||||
import { LogDecoder } from './log_decoder';
|
||||
import { orderUtils } from './order_utils';
|
||||
import { OrderInfo, SignedTransaction } from './types';
|
||||
import { FillResults, OrderInfo, SignedTransaction } from './types';
|
||||
|
||||
export class ExchangeWrapper {
|
||||
private readonly _exchange: ExchangeContract;
|
||||
@@ -243,4 +243,27 @@ export class ExchangeWrapper {
|
||||
const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
|
||||
return tx;
|
||||
}
|
||||
public async getFillOrderResultsAsync(
|
||||
signedOrder: SignedOrder,
|
||||
from: string,
|
||||
opts: { takerAssetFillAmount?: BigNumber } = {},
|
||||
): Promise<FillResults> {
|
||||
const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
|
||||
const fillResults = await this._exchange.fillOrder.callAsync(
|
||||
params.order,
|
||||
params.takerAssetFillAmount,
|
||||
params.signature,
|
||||
{ from },
|
||||
);
|
||||
return fillResults;
|
||||
}
|
||||
public abiEncodeFillOrder(signedOrder: SignedOrder, opts: { takerAssetFillAmount?: BigNumber } = {}): string {
|
||||
const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
|
||||
const data = this._exchange.fillOrder.getABIEncodedTransactionData(
|
||||
params.order,
|
||||
params.takerAssetFillAmount,
|
||||
params.signature,
|
||||
);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import * as _ from 'lodash';
|
||||
import 'make-promises-safe';
|
||||
|
||||
import { ExchangeContract, ExchangeFillEventArgs } from '../../generated_contract_wrappers/exchange';
|
||||
import { TestLibsContract } from '../../generated_contract_wrappers/test_libs';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
import { expectTransactionFailedAsync } from './assertions';
|
||||
@@ -123,6 +124,8 @@ export async function fillOrderCombinatorialUtilsFactoryAsync(
|
||||
exchangeContract.address,
|
||||
);
|
||||
|
||||
const testLibsContract = await TestLibsContract.deployFrom0xArtifactAsync(artifacts.TestLibs, provider, txDefaults);
|
||||
|
||||
const fillOrderCombinatorialUtils = new FillOrderCombinatorialUtils(
|
||||
orderFactory,
|
||||
ownerAddress,
|
||||
@@ -132,6 +135,7 @@ export async function fillOrderCombinatorialUtilsFactoryAsync(
|
||||
zrxAssetData,
|
||||
exchangeWrapper,
|
||||
assetWrapper,
|
||||
testLibsContract,
|
||||
);
|
||||
return fillOrderCombinatorialUtils;
|
||||
}
|
||||
@@ -145,6 +149,7 @@ export class FillOrderCombinatorialUtils {
|
||||
public zrxAssetData: string;
|
||||
public exchangeWrapper: ExchangeWrapper;
|
||||
public assetWrapper: AssetWrapper;
|
||||
public testLibsContract: TestLibsContract;
|
||||
public static generateFillOrderCombinations(): FillScenario[] {
|
||||
const takerScenarios = [
|
||||
TakerScenario.Unspecified,
|
||||
@@ -329,6 +334,7 @@ export class FillOrderCombinatorialUtils {
|
||||
zrxAssetData: string,
|
||||
exchangeWrapper: ExchangeWrapper,
|
||||
assetWrapper: AssetWrapper,
|
||||
testLibsContract: TestLibsContract,
|
||||
) {
|
||||
this.orderFactory = orderFactory;
|
||||
this.ownerAddress = ownerAddress;
|
||||
@@ -338,6 +344,7 @@ export class FillOrderCombinatorialUtils {
|
||||
this.zrxAssetData = zrxAssetData;
|
||||
this.exchangeWrapper = exchangeWrapper;
|
||||
this.assetWrapper = assetWrapper;
|
||||
this.testLibsContract = testLibsContract;
|
||||
}
|
||||
public async testFillOrderScenarioAsync(
|
||||
provider: Provider,
|
||||
@@ -410,6 +417,8 @@ export class FillOrderCombinatorialUtils {
|
||||
lazyStore,
|
||||
fillRevertReasonIfExists,
|
||||
);
|
||||
|
||||
await this._abiEncodeFillOrderAndAssertOutcomeAsync(signedOrder, takerAssetFillAmount);
|
||||
}
|
||||
private async _fillOrderAndAssertOutcomeAsync(
|
||||
signedOrder: SignedOrder,
|
||||
@@ -456,6 +465,29 @@ export class FillOrderCombinatorialUtils {
|
||||
signedOrder.takerAssetAmount,
|
||||
signedOrder.makerAssetAmount,
|
||||
);
|
||||
const expMakerFeePaid = orderUtils.getPartialAmount(
|
||||
expFilledTakerAmount,
|
||||
signedOrder.takerAssetAmount,
|
||||
signedOrder.makerFee,
|
||||
);
|
||||
const expTakerFeePaid = orderUtils.getPartialAmount(
|
||||
expFilledTakerAmount,
|
||||
signedOrder.takerAssetAmount,
|
||||
signedOrder.takerFee,
|
||||
);
|
||||
const fillResults = await this.exchangeWrapper.getFillOrderResultsAsync(signedOrder, this.takerAddress, {
|
||||
takerAssetFillAmount,
|
||||
});
|
||||
expect(fillResults.takerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expFilledTakerAmount,
|
||||
'takerAssetFilledAmount',
|
||||
);
|
||||
expect(fillResults.makerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expFilledMakerAmount,
|
||||
'makerAssetFilledAmount',
|
||||
);
|
||||
expect(fillResults.takerFeePaid).to.be.bignumber.equal(expTakerFeePaid, 'takerFeePaid');
|
||||
expect(fillResults.makerFeePaid).to.be.bignumber.equal(expMakerFeePaid, 'makerFeePaid');
|
||||
|
||||
// - Let's fill the order!
|
||||
const txReceipt = await this.exchangeWrapper.fillOrderAsync(signedOrder, this.takerAddress, {
|
||||
@@ -479,17 +511,7 @@ export class FillOrderCombinatorialUtils {
|
||||
expFilledTakerAmount,
|
||||
'log.args.takerAssetFilledAmount',
|
||||
);
|
||||
const expMakerFeePaid = orderUtils.getPartialAmount(
|
||||
expFilledTakerAmount,
|
||||
signedOrder.takerAssetAmount,
|
||||
signedOrder.makerFee,
|
||||
);
|
||||
expect(log.args.makerFeePaid).to.be.bignumber.equal(expMakerFeePaid, 'log.args.makerFeePaid');
|
||||
const expTakerFeePaid = orderUtils.getPartialAmount(
|
||||
expFilledTakerAmount,
|
||||
signedOrder.takerAssetAmount,
|
||||
signedOrder.takerFee,
|
||||
);
|
||||
expect(log.args.takerFeePaid).to.be.bignumber.equal(expTakerFeePaid, 'logs.args.takerFeePaid');
|
||||
expect(log.args.orderHash).to.be.equal(orderHash, 'log.args.orderHash');
|
||||
expect(log.args.makerAssetData).to.be.equal(makerAssetData, 'log.args.makerAssetData');
|
||||
@@ -571,6 +593,19 @@ export class FillOrderCombinatorialUtils {
|
||||
'ZRXAssetBalanceOfFeeRecipient',
|
||||
);
|
||||
}
|
||||
private async _abiEncodeFillOrderAndAssertOutcomeAsync(
|
||||
signedOrder: SignedOrder,
|
||||
takerAssetFillAmount: BigNumber,
|
||||
): Promise<void> {
|
||||
const params = orderUtils.createFill(signedOrder, takerAssetFillAmount);
|
||||
const expectedAbiEncodedData = this.exchangeWrapper.abiEncodeFillOrder(signedOrder, { takerAssetFillAmount });
|
||||
const libsAbiEncodedData = await this.testLibsContract.publicAbiEncodeFillOrder.callAsync(
|
||||
params.order,
|
||||
params.takerAssetFillAmount,
|
||||
params.signature,
|
||||
);
|
||||
expect(libsAbiEncodedData).to.be.equal(expectedAbiEncodedData, 'ABIEncodedFillOrderData');
|
||||
}
|
||||
private async _getTakerAssetFillAmountAsync(
|
||||
signedOrder: SignedOrder,
|
||||
takerAssetFillAmountScenario: TakerAssetFillAmountScenario,
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"chai": "^4.0.1",
|
||||
"copyfiles": "^1.2.0",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
@@ -51,7 +51,7 @@
|
||||
"@0xproject/utils": "^1.0.4",
|
||||
"@0xproject/web3-wrapper": "^1.1.2",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
"note":
|
||||
"Updated to use latest orderFactory interface, fixed `feeRecipient` spelling error in public interface",
|
||||
"pr": 936
|
||||
},
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
"@0xproject/web3-wrapper": "^1.1.2",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
"dirty-chai": "^2.0.1",
|
||||
"lodash.foreach": "^4.5.0",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
"copyfiles": "^2.0.0",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"run-s": "^0.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -13,8 +13,10 @@
|
||||
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
|
||||
"pre_build": "run-s copy_artifacts generate_contract_wrappers",
|
||||
"copy_artifacts": "copyfiles 'artifacts/**/*' ./lib",
|
||||
"clean": "shx rm -rf lib src/contract_wrappers",
|
||||
"lint": "tslint --project . --exclude **/src/v2/contract_wrappers/**/* --exclude **/src/v1/contract_wrappers/**/*",
|
||||
"clean":
|
||||
"shx rm -rf lib src/1.0.0/contract_wrappers src/2.0.0/contract_wrappers src/2.0.0-beta-testnet/contract_wrappers",
|
||||
"lint":
|
||||
"tslint --project . --exclude **/src/v2/contract_wrappers/**/* --exclude **/src/v1/contract_wrappers/**/*",
|
||||
"migrate:v1": "run-s build compile:v1 script:migrate:v1",
|
||||
"migrate:v2": "run-s build compile:v2 script:migrate:v2",
|
||||
"migrate:v2-beta-testnet": "run-s build compile:v2-beta-testnet script:migrate:v2-beta-testnet",
|
||||
@@ -22,18 +24,27 @@
|
||||
"script:migrate:v2": "node ./lib/migrate.js --contracts-version 2.0.0",
|
||||
"script:migrate:v2-beta-testnet": "node ./lib/migrate.js --contracts-version 2.0.0-beta-testnet",
|
||||
"generate_contract_wrappers": "run-p generate_contract_wrappers:*",
|
||||
"generate_contract_wrappers:v1": "abi-gen --abis ${npm_package_config_abis_v1} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/1.0.0/contract_wrappers --backend ethers",
|
||||
"generate_contract_wrappers:v2": "abi-gen --abis ${npm_package_config_abis_v2} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0/contract_wrappers --backend ethers",
|
||||
"generate_contract_wrappers:v2-beta-testnet": "abi-gen --abis ${npm_package_config_abis_v2BetaTestnet} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0-beta-testnet/contract_wrappers --backend ethers",
|
||||
"compile:v1": "sol-compiler --artifacts-dir artifacts/1.0.0 --contracts Exchange_v1,DummyERC20Token,ZRXToken,WETH9,TokenTransferProxy_v1,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry",
|
||||
"compile:v2": "sol-compiler --artifacts-dir artifacts/2.0.0 --contracts ERC20Token,DummyERC20Token,ERC721Token,DummyERC721Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,ZRXToken,WETH9,IWallet,IValidator",
|
||||
"compile:v2-beta-testnet": "sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token"
|
||||
"generate_contract_wrappers:v1":
|
||||
"abi-gen --abis ${npm_package_config_abis_v1} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/1.0.0/contract_wrappers --backend ethers",
|
||||
"generate_contract_wrappers:v2":
|
||||
"abi-gen --abis ${npm_package_config_abis_v2} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0/contract_wrappers --backend ethers",
|
||||
"generate_contract_wrappers:v2-beta-testnet":
|
||||
"abi-gen --abis ${npm_package_config_abis_v2BetaTestnet} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0-beta-testnet/contract_wrappers --backend ethers",
|
||||
"compile:v1":
|
||||
"sol-compiler --artifacts-dir artifacts/1.0.0 --contracts Exchange_v1,DummyERC20Token,ZRXToken,WETH9,TokenTransferProxy_v1,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry",
|
||||
"compile:v2":
|
||||
"sol-compiler --artifacts-dir artifacts/2.0.0 --contracts ERC20Token,DummyERC20Token,ERC721Token,DummyERC721Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,ZRXToken,WETH9,IWallet,IValidator",
|
||||
"compile:v2-beta-testnet":
|
||||
"sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token"
|
||||
},
|
||||
"config": {
|
||||
"abis": {
|
||||
"v1": "artifacts/1.0.0/@(DummyERC20Token|TokenTransferProxy_v1|Exchange_v1|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|WETH9).json",
|
||||
"v2": "artifacts/2.0.0/@(ERC20Token|DummyERC20Token|ERC721Token|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|ZRXToken|WETH9|IWallet|IValidator).json",
|
||||
"v2BetaTestnet": "artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator).json"
|
||||
"v1":
|
||||
"artifacts/1.0.0/@(DummyERC20Token|TokenTransferProxy_v1|Exchange_v1|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|WETH9).json",
|
||||
"v2":
|
||||
"artifacts/2.0.0/@(ERC20Token|DummyERC20Token|ERC721Token|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|ZRXToken|WETH9|IWallet|IValidator).json",
|
||||
"v2BetaTestnet":
|
||||
"artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator).json"
|
||||
}
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
@@ -63,7 +74,7 @@
|
||||
"@ledgerhq/hw-app-eth": "^4.3.0",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@ledgerhq/hw-transport-node-hid": "^4.3.0"
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
"es6-promisify": "^5.0.0",
|
||||
"glob": "^7.1.2",
|
||||
"isomorphic-fetch": "2.2.1",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"moment": "2.21.0",
|
||||
"opn": "^5.3.0",
|
||||
"promisify-child-process": "^1.0.5",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
{
|
||||
"note": "Added marketUtils",
|
||||
"pr": 937
|
||||
},
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
"sinon": "^4.0.0",
|
||||
@@ -87,7 +87,7 @@
|
||||
"ethereumjs-abi": "0.6.5",
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -22,7 +22,8 @@ describe('Signature utils', () => {
|
||||
let address = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
|
||||
|
||||
it("should return false if the data doesn't pertain to the signature & address", async () => {
|
||||
expect(await isValidSignatureAsync(provider, '0x0', ethSignSignature, address)).to.be.false();
|
||||
const bytes32Zeros = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
||||
expect(await isValidSignatureAsync(provider, bytes32Zeros, ethSignSignature, address)).to.be.false();
|
||||
});
|
||||
it("should return false if the address doesn't pertain to the signature & data", async () => {
|
||||
const validUnrelatedAddress = '0x8b0292b11a196601ed2ce54b665cafeca0347d42';
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
[
|
||||
{
|
||||
"version": "1.0.1-rc.3",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "1.0.1-rc.2",
|
||||
"changes": [
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
"dirty-chai": "^2.0.1",
|
||||
"json-loader": "^0.5.4",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"opn-cli": "^3.1.0",
|
||||
@@ -84,7 +84,7 @@
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethereumjs-blockstream": "5.0.0",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
"dependencies": {
|
||||
"@0xproject/react-docs": "^1.0.4",
|
||||
"basscss": "^8.0.3",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"material-ui": "^0.17.1",
|
||||
"react": "15.6.1",
|
||||
"react-dom": "15.6.1",
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
"@types/react-scroll": "0.0.31",
|
||||
"basscss": "^8.0.3",
|
||||
"compare-versions": "^3.0.1",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"material-ui": "^0.17.1",
|
||||
"react": "15.6.1",
|
||||
"react-dom": "15.6.1",
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"@types/react-scroll": "0.0.31",
|
||||
"basscss": "^8.0.3",
|
||||
"is-mobile": "^0.2.2",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"material-ui": "^0.17.1",
|
||||
"react": "15.6.1",
|
||||
"react-dom": "15.6.1",
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
@@ -87,7 +87,7 @@
|
||||
"chalk": "^2.3.0",
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"mkdirp": "^0.5.1",
|
||||
"require-from-string": "^2.0.1",
|
||||
"semver": "5.5.0",
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"glob": "^7.1.2",
|
||||
"istanbul": "^0.4.5",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"loglevel": "^1.6.1",
|
||||
"mkdirp": "^0.5.1",
|
||||
"rimraf": "^2.6.2",
|
||||
@@ -82,7 +82,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
"dependencies": {
|
||||
"@0xproject/types": "^1.0.1-rc.3",
|
||||
"@0xproject/typescript-typings": "^1.0.3",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
"@0xproject/typescript-typings": "^1.0.3",
|
||||
"@0xproject/utils": "^1.0.4",
|
||||
"chalk": "^2.3.0",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"newman": "^3.9.3",
|
||||
"yargs": "^10.0.3"
|
||||
},
|
||||
@@ -60,7 +60,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"nock": "^9.2.3",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
"ganache-core": "0xProject/ganache-core",
|
||||
"hdkey": "^0.7.1",
|
||||
"json-rpc-error": "2.0.0",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"semaphore-async-await": "^1.5.1",
|
||||
"web3-provider-engine": "14.0.6"
|
||||
},
|
||||
@@ -77,7 +77,7 @@
|
||||
"copyfiles": "^1.2.0",
|
||||
"dirty-chai": "^2.0.1",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
"ethereumjs-tx": "^1.3.5",
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"express": "^4.15.2",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"rollbar": "^0.6.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"typescript": "2.9.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"tslint": "5.11.0",
|
||||
"tslint-eslint-rules": "^4.1.1",
|
||||
"tslint-react": "^3.2.0",
|
||||
|
||||
@@ -34,4 +34,22 @@ declare module 'ethers' {
|
||||
const enum errors {
|
||||
INVALID_ARGUMENT = 'INVALID_ARGUMENT',
|
||||
}
|
||||
|
||||
export type ParamName = null | string | NestedParamName;
|
||||
|
||||
export interface NestedParamName {
|
||||
name: string | null;
|
||||
names: ParamName[];
|
||||
}
|
||||
|
||||
export const utils: {
|
||||
AbiCoder: {
|
||||
defaultCoder: AbiCoder;
|
||||
};
|
||||
};
|
||||
|
||||
export interface AbiCoder {
|
||||
encode: (names: ParamName[] | string[], types: string[] | any[], args: any[] | undefined) => string;
|
||||
decode: (names: ParamName[] | string[], types: string[] | string, data: string | undefined) => any;
|
||||
}
|
||||
}
|
||||
|
||||
0
packages/utils/coverage/.gitkeep
Normal file
0
packages/utils/coverage/.gitkeep
Normal file
@@ -5,12 +5,17 @@
|
||||
"node": ">=6.12"
|
||||
},
|
||||
"description": "0x TS utils",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
"main": "lib/src/index.js",
|
||||
"types": "lib/src/index.d.ts",
|
||||
"scripts": {
|
||||
"watch_without_deps": "tsc -w",
|
||||
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
|
||||
"clean": "shx rm -rf lib scripts",
|
||||
"test": "yarn run_mocha",
|
||||
"test:circleci": "yarn test:coverage",
|
||||
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
|
||||
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||
"lint": "tslint --project .",
|
||||
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||
},
|
||||
@@ -27,12 +32,15 @@
|
||||
"@0xproject/monorepo-scripts": "^1.0.4",
|
||||
"@0xproject/tslint-config": "^1.0.4",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^2.2.42",
|
||||
"copyfiles": "^1.2.0",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
"tslint": "5.11.0",
|
||||
"typescript": "2.9.2"
|
||||
"typescript": "2.9.2",
|
||||
"chai": "^4.0.1",
|
||||
"mocha": "^4.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0xproject/types": "^1.0.1-rc.3",
|
||||
@@ -46,7 +54,7 @@
|
||||
"ethers": "3.0.22",
|
||||
"isomorphic-fetch": "^2.2.1",
|
||||
"js-sha3": "^0.7.0",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -1,7 +1,160 @@
|
||||
import { AbiDefinition, AbiType, ContractAbi, DataItem, MethodAbi } from 'ethereum-types';
|
||||
import * as ethers from 'ethers';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { BigNumber } from './configured_bignumber';
|
||||
|
||||
// Note(albrow): This function is unexported in ethers.js. Copying it here for
|
||||
// now.
|
||||
// Source: https://github.com/ethers-io/ethers.js/blob/884593ab76004a808bf8097e9753fb5f8dcc3067/contracts/interface.js#L30
|
||||
function parseEthersParams(params: DataItem[]): { names: ethers.ParamName[]; types: string[] } {
|
||||
const names: ethers.ParamName[] = [];
|
||||
const types: string[] = [];
|
||||
|
||||
params.forEach((param: DataItem) => {
|
||||
if (param.components != null) {
|
||||
let suffix = '';
|
||||
const arrayBracket = param.type.indexOf('[');
|
||||
if (arrayBracket >= 0) {
|
||||
suffix = param.type.substring(arrayBracket);
|
||||
}
|
||||
|
||||
const result = parseEthersParams(param.components);
|
||||
names.push({ name: param.name || null, names: result.names });
|
||||
types.push('tuple(' + result.types.join(',') + ')' + suffix);
|
||||
} else {
|
||||
names.push(param.name || null);
|
||||
types.push(param.type);
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
names,
|
||||
types,
|
||||
};
|
||||
}
|
||||
|
||||
// returns true if x is equal to y and false otherwise. Performs some minimal
|
||||
// type conversion and data massaging for x and y, depending on type. name and
|
||||
// type should typically be derived from parseEthersParams.
|
||||
function isAbiDataEqual(name: ethers.ParamName, type: string, x: any, y: any): boolean {
|
||||
if (_.isUndefined(x) && _.isUndefined(y)) {
|
||||
return true;
|
||||
} else if (_.isUndefined(x) && !_.isUndefined(y)) {
|
||||
return false;
|
||||
} else if (!_.isUndefined(x) && _.isUndefined(y)) {
|
||||
return false;
|
||||
}
|
||||
if (_.endsWith(type, '[]')) {
|
||||
// For array types, we iterate through the elements and check each one
|
||||
// individually. Strangely, name does not need to be changed in this
|
||||
// case.
|
||||
if (x.length !== y.length) {
|
||||
return false;
|
||||
}
|
||||
const newType = _.trimEnd(type, '[]');
|
||||
for (let i = 0; i < x.length; i++) {
|
||||
if (!isAbiDataEqual(name, newType, x[i], y[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (_.startsWith(type, 'tuple(')) {
|
||||
if (_.isString(name)) {
|
||||
throw new Error('Internal error: type was tuple but names was a string');
|
||||
} else if (_.isNull(name)) {
|
||||
throw new Error('Internal error: type was tuple but names was null');
|
||||
}
|
||||
// For tuples, we iterate through the underlying values and check each
|
||||
// one individually.
|
||||
const types = splitTupleTypes(type);
|
||||
if (types.length !== name.names.length) {
|
||||
throw new Error(
|
||||
`Internal error: parameter types/names length mismatch (${types.length} != ${name.names.length})`,
|
||||
);
|
||||
}
|
||||
for (let i = 0; i < types.length; i++) {
|
||||
// For tuples, name is an object with a names property that is an
|
||||
// array. As an example, for orders, name looks like:
|
||||
//
|
||||
// {
|
||||
// name: 'orders',
|
||||
// names: [
|
||||
// 'makerAddress',
|
||||
// // ...
|
||||
// 'takerAssetData'
|
||||
// ]
|
||||
// }
|
||||
//
|
||||
const nestedName = _.isString(name.names[i])
|
||||
? (name.names[i] as string)
|
||||
: ((name.names[i] as ethers.NestedParamName).name as string);
|
||||
if (!isAbiDataEqual(name.names[i], types[i], x[nestedName], y[nestedName])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else if (type === 'address' || type === 'bytes') {
|
||||
// HACK(albrow): ethers.js returns the checksummed address even when
|
||||
// initially passed in a non-checksummed address. To account for that,
|
||||
// we convert to lowercase before comparing.
|
||||
return _.isEqual(_.toLower(x), _.toLower(y));
|
||||
} else if (_.startsWith(type, 'uint') || _.startsWith(type, 'int')) {
|
||||
return new BigNumber(x).eq(new BigNumber(y));
|
||||
}
|
||||
return _.isEqual(x, y);
|
||||
}
|
||||
|
||||
// splitTupleTypes splits a tuple type string (of the form `tuple(X)` where X is
|
||||
// any other type or list of types) into its component types. It works with
|
||||
// nested tuples, so, e.g., `tuple(tuple(uint256,address),bytes32)` will yield:
|
||||
// `['tuple(uint256,address)', 'bytes32']`. It expects exactly one tuple type as
|
||||
// an argument (not an array).
|
||||
function splitTupleTypes(type: string): string[] {
|
||||
if (_.endsWith(type, '[]')) {
|
||||
throw new Error('Internal error: array types are not supported');
|
||||
} else if (!_.startsWith(type, 'tuple(')) {
|
||||
throw new Error('Internal error: expected tuple type but got non-tuple type: ' + type);
|
||||
}
|
||||
// Trim the outtermost tuple().
|
||||
const trimmedType = type.substring('tuple('.length, type.length - 1);
|
||||
const types: string[] = [];
|
||||
let currToken = '';
|
||||
let parenCount = 0;
|
||||
// Tokenize the type string while keeping track of parentheses.
|
||||
for (const char of trimmedType) {
|
||||
switch (char) {
|
||||
case '(':
|
||||
parenCount += 1;
|
||||
currToken += char;
|
||||
break;
|
||||
case ')':
|
||||
parenCount -= 1;
|
||||
currToken += char;
|
||||
break;
|
||||
case ',':
|
||||
if (parenCount === 0) {
|
||||
types.push(currToken);
|
||||
currToken = '';
|
||||
break;
|
||||
} else {
|
||||
currToken += char;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
currToken += char;
|
||||
break;
|
||||
}
|
||||
}
|
||||
types.push(currToken);
|
||||
return types;
|
||||
}
|
||||
|
||||
export const abiUtils = {
|
||||
parseEthersParams,
|
||||
isAbiDataEqual,
|
||||
splitTupleTypes,
|
||||
parseFunctionParam(param: DataItem): string {
|
||||
if (param.type === 'tuple') {
|
||||
// Parse out tuple types into {type_1, type_2, ..., type_N}
|
||||
|
||||
19
packages/utils/test/abi_utils_test.ts
Normal file
19
packages/utils/test/abi_utils_test.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import * as chai from 'chai';
|
||||
import 'mocha';
|
||||
|
||||
import { abiUtils } from '../src';
|
||||
|
||||
const expect = chai.expect;
|
||||
|
||||
describe('abiUtils', () => {
|
||||
describe('splitTupleTypes', () => {
|
||||
it('handles basic types', () => {
|
||||
const got = abiUtils.splitTupleTypes('tuple(bytes,uint256,address)');
|
||||
expect(got).to.deep.equal(['bytes', 'uint256', 'address']);
|
||||
});
|
||||
it('handles nested tuple types', () => {
|
||||
const got = abiUtils.splitTupleTypes('tuple(tuple(bytes,uint256),address)');
|
||||
expect(got).to.deep.equal(['tuple(bytes,uint256)', 'address']);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -3,5 +3,5 @@
|
||||
"compilerOptions": {
|
||||
"outDir": "lib"
|
||||
},
|
||||
"include": ["./src/**/*"]
|
||||
"include": ["src/**/*", "test/**/*"]
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
"dirty-chai": "^2.0.1",
|
||||
"ganache-core": "0xProject/ganache-core",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"mocha": "^4.0.1",
|
||||
"mocha": "^4.1.0",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"nyc": "^11.0.1",
|
||||
"shx": "^0.2.2",
|
||||
@@ -71,7 +71,7 @@
|
||||
"ethereum-types": "^1.0.3",
|
||||
"ethereumjs-util": "^5.1.1",
|
||||
"ethers": "3.0.22",
|
||||
"lodash": "^4.17.4"
|
||||
"lodash": "^4.17.5"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"find-versions": "^2.0.0",
|
||||
"jsonschema": "^1.2.0",
|
||||
"less": "^2.7.2",
|
||||
"lodash": "^4.17.4",
|
||||
"lodash": "^4.17.5",
|
||||
"material-ui": "^0.17.1",
|
||||
"moment": "2.21.0",
|
||||
"numeral": "^2.0.6",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB |
BIN
packages/website/public/images/team/amir.png
Normal file
BIN
packages/website/public/images/team/amir.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 114 KiB |
BIN
packages/website/public/images/team/clay.png
Normal file
BIN
packages/website/public/images/team/clay.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
@@ -27,7 +27,7 @@ const teamRow1: ProfileInfo[] = [
|
||||
title: 'Co-founder & CTO',
|
||||
description: `Smart contract R&D. Previously fixed income trader at DRW. \
|
||||
Finance at University of Illinois, Urbana-Champaign.`,
|
||||
image: '/images/team/amir.jpeg',
|
||||
image: '/images/team/amir.png',
|
||||
linkedIn: 'https://www.linkedin.com/in/abandeali1/',
|
||||
github: 'https://github.com/abandeali1',
|
||||
medium: 'https://medium.com/@abandeali1',
|
||||
@@ -191,6 +191,16 @@ const teamRow6: ProfileInfo[] = [
|
||||
},
|
||||
];
|
||||
|
||||
const teamRow7: ProfileInfo[] = [
|
||||
{
|
||||
name: 'Clay Robbins',
|
||||
title: 'Business Development Lead',
|
||||
description: `Growth & Business Development. Previously product and partnerships at Square. Economics at Dartmouth College.`,
|
||||
image: 'images/team/clay.png',
|
||||
linkedIn: 'https://www.linkedin.com/in/robbinsclay/',
|
||||
},
|
||||
];
|
||||
|
||||
const advisors: ProfileInfo[] = [
|
||||
{
|
||||
name: 'Fred Ehrsam',
|
||||
@@ -286,6 +296,7 @@ export class About extends React.Component<AboutProps, AboutState> {
|
||||
<div className="clearfix">{this._renderProfiles(teamRow4)}</div>
|
||||
<div className="clearfix">{this._renderProfiles(teamRow5)}</div>
|
||||
<div className="clearfix">{this._renderProfiles(teamRow6)}</div>
|
||||
<div className="clearfix">{this._renderProfiles(teamRow7)}</div>
|
||||
</div>
|
||||
<div className="pt3 pb2">
|
||||
<div
|
||||
|
||||
76
yarn.lock
76
yarn.lock
@@ -606,7 +606,7 @@
|
||||
|
||||
"@0xproject/json-schemas@^0.8.1", "@0xproject/json-schemas@^0.8.3":
|
||||
version "0.8.3"
|
||||
resolved "https://registry.npmjs.org/@0xproject/json-schemas/-/json-schemas-0.8.3.tgz#455e6219a6bd05e990392165192a983a9ab89f26"
|
||||
resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.3.tgz#455e6219a6bd05e990392165192a983a9ab89f26"
|
||||
dependencies:
|
||||
"@0xproject/typescript-typings" "^0.4.3"
|
||||
"@types/node" "9.6.0"
|
||||
@@ -842,15 +842,15 @@
|
||||
dependencies:
|
||||
npmlog "^4.1.2"
|
||||
|
||||
"@loopback/dist-util@^0.3.5":
|
||||
version "0.3.5"
|
||||
resolved "https://registry.npmjs.org/@loopback/dist-util/-/dist-util-0.3.5.tgz#c43eec658bab07fc5e7d9b5eba270eac6ea802cf"
|
||||
"@loopback/dist-util@^0.3.6":
|
||||
version "0.3.6"
|
||||
resolved "https://registry.npmjs.org/@loopback/dist-util/-/dist-util-0.3.6.tgz#bd1d5887aa0f2bec41722f1d74fc19319d04e975"
|
||||
|
||||
"@loopback/openapi-v3-types@^0.8.2":
|
||||
version "0.8.2"
|
||||
resolved "https://registry.npmjs.org/@loopback/openapi-v3-types/-/openapi-v3-types-0.8.2.tgz#6dd4d6ee9a791605d872a0aa875a2166ff330182"
|
||||
version "0.8.3"
|
||||
resolved "https://registry.npmjs.org/@loopback/openapi-v3-types/-/openapi-v3-types-0.8.3.tgz#d87948591295fb85057f4a2460283ea6a0e01c8c"
|
||||
dependencies:
|
||||
"@loopback/dist-util" "^0.3.5"
|
||||
"@loopback/dist-util" "^0.3.6"
|
||||
openapi3-ts "^0.11.0"
|
||||
|
||||
"@mrmlnc/readdir-enhanced@^2.2.1":
|
||||
@@ -1096,8 +1096,8 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7"
|
||||
|
||||
"@types/node@^10.5.3":
|
||||
version "10.5.3"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-10.5.3.tgz#5bcfaf088ad17894232012877669634c06b20cc5"
|
||||
version "10.5.7"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz#960d9feb3ade2233bcc9843c918d740b4f78a7cf"
|
||||
|
||||
"@types/node@^8.0.53":
|
||||
version "8.10.8"
|
||||
@@ -1752,8 +1752,8 @@ awesome-typescript-loader@^3.1.3:
|
||||
source-map-support "^0.5.3"
|
||||
|
||||
aws-sdk@^2.127.0:
|
||||
version "2.288.0"
|
||||
resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.288.0.tgz#9665f4a908cb2048bc1af6e0ef5084c5bf96a6c8"
|
||||
version "2.290.0"
|
||||
resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.290.0.tgz#e0e4777a62ad29df3b86521a103b3f02189a30f5"
|
||||
dependencies:
|
||||
buffer "4.9.1"
|
||||
events "1.1.1"
|
||||
@@ -2884,8 +2884,8 @@ buffer-from@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
|
||||
|
||||
buffer-from@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
|
||||
version "1.1.1"
|
||||
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||
|
||||
buffer-indexof@^1.0.0:
|
||||
version "1.1.1"
|
||||
@@ -4567,8 +4567,8 @@ domhandler@^2.3.0:
|
||||
domelementtype "1"
|
||||
|
||||
dompurify@^1.0.6:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.npmjs.org/dompurify/-/dompurify-1.0.6.tgz#1600725187f22fe26f4afac80bf33c42ad76fe51"
|
||||
version "1.0.7"
|
||||
resolved "https://registry.npmjs.org/dompurify/-/dompurify-1.0.7.tgz#33e5c4a5fc84df93b58ca162d1d3f28537aa3ec2"
|
||||
|
||||
domutils@^1.5.1:
|
||||
version "1.7.0"
|
||||
@@ -6514,7 +6514,7 @@ gulp-util@^3.0.0:
|
||||
|
||||
gulp@^3.9.1:
|
||||
version "3.9.1"
|
||||
resolved "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
|
||||
resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
|
||||
dependencies:
|
||||
archy "^1.0.0"
|
||||
chalk "^1.0.0"
|
||||
@@ -7803,15 +7803,6 @@ json-rpc-random-id@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
|
||||
|
||||
json-schema-ref-parser@^5.1.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.1.1.tgz#adfc84bbcd3ec41536ec9df5364734884afcf1c1"
|
||||
dependencies:
|
||||
call-me-maybe "^1.0.1"
|
||||
debug "^3.1.0"
|
||||
js-yaml "^3.12.0"
|
||||
ono "^4.0.5"
|
||||
|
||||
json-schema-ref-parser@^5.1.1:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.1.2.tgz#c9cdaec76ea894f71eb3776c3b3291dfa62e56c9"
|
||||
@@ -7859,7 +7850,7 @@ jsonfile@^2.1.0:
|
||||
|
||||
jsonfile@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
@@ -9013,7 +9004,7 @@ mobx@^4.2.0:
|
||||
version "4.3.1"
|
||||
resolved "https://registry.npmjs.org/mobx/-/mobx-4.3.1.tgz#334e5aab4916b1d43f0faf3605a64b1b4b3ccb8d"
|
||||
|
||||
mocha@^4.0.1:
|
||||
mocha@^4.0.1, mocha@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794"
|
||||
dependencies:
|
||||
@@ -9163,8 +9154,8 @@ ncp@1.0.x:
|
||||
resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
|
||||
|
||||
needle@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.npmjs.org/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
|
||||
version "2.2.2"
|
||||
resolved "https://registry.npmjs.org/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418"
|
||||
dependencies:
|
||||
debug "^2.1.2"
|
||||
iconv-lite "^0.4.4"
|
||||
@@ -11032,8 +11023,8 @@ react-dom@^15.5.4:
|
||||
prop-types "^15.5.10"
|
||||
|
||||
react-dom@^16.3.2:
|
||||
version "16.4.1"
|
||||
resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.4.1.tgz#7f8b0223b3a5fbe205116c56deb85de32685dad6"
|
||||
version "16.4.2"
|
||||
resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
|
||||
dependencies:
|
||||
fbjs "^0.8.16"
|
||||
loose-envify "^1.1.0"
|
||||
@@ -11229,8 +11220,8 @@ react@^15.5.4:
|
||||
prop-types "^15.5.10"
|
||||
|
||||
react@^16.3.2:
|
||||
version "16.4.1"
|
||||
resolved "https://registry.npmjs.org/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32"
|
||||
version "16.4.2"
|
||||
resolved "https://registry.npmjs.org/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
|
||||
dependencies:
|
||||
fbjs "^0.8.16"
|
||||
loose-envify "^1.1.0"
|
||||
@@ -11440,15 +11431,15 @@ redoc-cli@^0.6.1:
|
||||
yargs "^11.0.0"
|
||||
|
||||
redoc@^2.0.0-alpha.29:
|
||||
version "2.0.0-alpha.30"
|
||||
resolved "https://registry.npmjs.org/redoc/-/redoc-2.0.0-alpha.30.tgz#330b816be8552c897a76fd1722f2276aafb69886"
|
||||
version "2.0.0-alpha.34"
|
||||
resolved "https://registry.npmjs.org/redoc/-/redoc-2.0.0-alpha.34.tgz#3c46aa3902212ac20c5cbe2b7d0d7621f175f7e9"
|
||||
dependencies:
|
||||
classnames "^2.2.6"
|
||||
decko "^1.2.0"
|
||||
dompurify "^1.0.6"
|
||||
eventemitter3 "^3.0.0"
|
||||
json-pointer "^0.6.0"
|
||||
json-schema-ref-parser "^5.1.0"
|
||||
json-schema-ref-parser "^5.1.1"
|
||||
lunr "^2.3.0"
|
||||
mark.js "^8.11.1"
|
||||
marked "0.3.18"
|
||||
@@ -12378,8 +12369,8 @@ slide@^1.1.5, slide@^1.1.6:
|
||||
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
|
||||
|
||||
slugify@^1.2.1:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.npmjs.org/slugify/-/slugify-1.3.0.tgz#787919259d28c825fbcae6da2e01c77a109793f6"
|
||||
version "1.3.1"
|
||||
resolved "https://registry.npmjs.org/slugify/-/slugify-1.3.1.tgz#f572127e8535329fbc6c1edb74ab856b61ad7de2"
|
||||
|
||||
snapdragon-node@^2.0.1:
|
||||
version "2.1.1"
|
||||
@@ -12977,14 +12968,13 @@ styled-components@^3.3.0:
|
||||
supports-color "^3.2.3"
|
||||
|
||||
styled-components@^3.3.3:
|
||||
version "3.3.3"
|
||||
resolved "https://registry.npmjs.org/styled-components/-/styled-components-3.3.3.tgz#09e702055ab11f7a8eab8229b1c0d0b855095686"
|
||||
version "3.4.2"
|
||||
resolved "https://registry.npmjs.org/styled-components/-/styled-components-3.4.2.tgz#8f518419932327e47fe9144824e3184b3e2da95d"
|
||||
dependencies:
|
||||
buffer "^5.0.3"
|
||||
css-to-react-native "^2.0.3"
|
||||
fbjs "^0.8.16"
|
||||
hoist-non-react-statics "^2.5.0"
|
||||
is-plain-object "^2.0.1"
|
||||
prop-types "^15.5.4"
|
||||
react-is "^16.3.1"
|
||||
stylis "^3.5.0"
|
||||
@@ -13191,8 +13181,8 @@ tar@^2.0.0, tar@^2.1.1, tar@^2.2.1:
|
||||
inherits "2"
|
||||
|
||||
tar@^4:
|
||||
version "4.4.4"
|
||||
resolved "https://registry.npmjs.org/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
|
||||
version "4.4.6"
|
||||
resolved "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
|
||||
dependencies:
|
||||
chownr "^1.0.1"
|
||||
fs-minipass "^1.2.5"
|
||||
|
||||
Reference in New Issue
Block a user