Merge branch 'development' of https://github.com/0xProject/0x-monorepo into feature/instant/move-features-over-from-zrx-buyer
This commit is contained in:
commit
e7130af6a9
@ -23,6 +23,7 @@ jobs:
|
|||||||
paths:
|
paths:
|
||||||
- ~/repo
|
- ~/repo
|
||||||
build-website:
|
build-website:
|
||||||
|
resource_class: medium+
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:9
|
- image: circleci/node:9
|
||||||
working_directory: ~/repo
|
working_directory: ~/repo
|
||||||
@ -161,6 +162,90 @@ jobs:
|
|||||||
key: coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }}
|
key: coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
paths:
|
paths:
|
||||||
- ~/repo/packages/web3-wrapper/coverage/lcov.info
|
- ~/repo/packages/web3-wrapper/coverage/lcov.info
|
||||||
|
test-python:
|
||||||
|
working_directory: ~/repo
|
||||||
|
docker:
|
||||||
|
- image: circleci/python
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- run: sudo chown -R circleci:circleci /usr/local/bin
|
||||||
|
- run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages
|
||||||
|
- restore_cache:
|
||||||
|
key: deps9-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
cd python-packages/order_utils
|
||||||
|
python -m ensurepip
|
||||||
|
python -m pip install -e .[dev]
|
||||||
|
- save_cache:
|
||||||
|
key: deps9-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- "/usr/local/bin"
|
||||||
|
- "/usr/local/lib/python3.7/site-packages"
|
||||||
|
- ".eggs"
|
||||||
|
- ".mypy_cache"
|
||||||
|
- ".pytest_cache"
|
||||||
|
- ".tox"
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
cd python-packages/order_utils
|
||||||
|
coverage run setup.py test
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-python-order-utils-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/python-packages/order_utils/.coverage
|
||||||
|
test-rest-python:
|
||||||
|
working_directory: ~/repo
|
||||||
|
docker:
|
||||||
|
- image: circleci/python
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- run: sudo chown -R circleci:circleci /usr/local/bin
|
||||||
|
- run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages
|
||||||
|
- restore_cache:
|
||||||
|
key: deps9-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
cd python-packages/order_utils
|
||||||
|
python -m ensurepip
|
||||||
|
python -m pip install -e .[dev]
|
||||||
|
- save_cache:
|
||||||
|
key: deps9-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- "/usr/local/bin"
|
||||||
|
- "/usr/local/lib/python3.7/site-packages"
|
||||||
|
- ".eggs"
|
||||||
|
- ".mypy_cache"
|
||||||
|
- ".pytest_cache"
|
||||||
|
- ".tox"
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
cd python-packages/order_utils
|
||||||
|
tox
|
||||||
|
static-tests-python:
|
||||||
|
working_directory: ~/repo
|
||||||
|
docker:
|
||||||
|
- image: circleci/python
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- run: sudo chown -R circleci:circleci /usr/local/bin
|
||||||
|
- run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages
|
||||||
|
- restore_cache:
|
||||||
|
key: deps9-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
cd python-packages/order_utils
|
||||||
|
python -m ensurepip
|
||||||
|
python -m pip install -e .[dev]
|
||||||
|
- save_cache:
|
||||||
|
key: deps9-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- "/usr/local/bin"
|
||||||
|
- "/usr/local/lib/python3.7/site-packages"
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
cd python-packages/order_utils
|
||||||
|
python setup.py lint
|
||||||
static-tests:
|
static-tests:
|
||||||
working_directory: ~/repo
|
working_directory: ~/repo
|
||||||
docker:
|
docker:
|
||||||
@ -232,6 +317,9 @@ jobs:
|
|||||||
- restore_cache:
|
- restore_cache:
|
||||||
keys:
|
keys:
|
||||||
- coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
|
- coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-python-order-utils-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
- run: yarn report_coverage
|
- run: yarn report_coverage
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
@ -262,3 +350,8 @@ workflows:
|
|||||||
- submit-coverage:
|
- submit-coverage:
|
||||||
requires:
|
requires:
|
||||||
- test-rest
|
- test-rest
|
||||||
|
- test-python
|
||||||
|
- test-python
|
||||||
|
- static-tests-python
|
||||||
|
# skip python tox run for now, as we don't yet have multiple test environments to support.
|
||||||
|
#- test-rest-python
|
||||||
|
10
.gitignore
vendored
10
.gitignore
vendored
@ -72,6 +72,7 @@ TODO.md
|
|||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
packages/website/public/bundle*
|
packages/website/public/bundle*
|
||||||
|
packages/dev-tools-pages/public/bundle*
|
||||||
packages/react-docs/example/public/bundle*
|
packages/react-docs/example/public/bundle*
|
||||||
|
|
||||||
# server cli
|
# server cli
|
||||||
@ -108,3 +109,12 @@ packages/sol-compiler/solc_bin/
|
|||||||
|
|
||||||
# Monorepo scripts
|
# Monorepo scripts
|
||||||
packages/*/scripts/
|
packages/*/scripts/
|
||||||
|
|
||||||
|
# python stuff
|
||||||
|
.eggs
|
||||||
|
.mypy_cache
|
||||||
|
.tox
|
||||||
|
python-packages/*/build
|
||||||
|
__pycache__
|
||||||
|
python-packages/*/src/*.egg-info
|
||||||
|
python-packages/*/.coverage
|
||||||
|
@ -5,4 +5,6 @@
|
|||||||
# https://git-scm.com/docs/gitignore#_pattern_format
|
# https://git-scm.com/docs/gitignore#_pattern_format
|
||||||
|
|
||||||
# Website
|
# Website
|
||||||
packages/website/ @BMillman19 @fragosti
|
packages/asset-buyer/ @BMillman19 @fragosti @steveklebanoff
|
||||||
|
packages/instant/ @BMillman19 @fragosti @steveklebanoff
|
||||||
|
packages/website/ @BMillman19 @fragosti @fabioberger @steveklebanoff
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
"ganache": "ganache-cli -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
|
"ganache": "ganache-cli -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
|
||||||
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
||||||
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
||||||
"report_coverage": "lcov-result-merger 'packages/*/coverage/lcov.info' | coveralls",
|
"report_coverage": "lcov-result-merger './{packages/*/coverage/lcov.info,python-packages/*/.coverage}' | coveralls",
|
||||||
"test:installation": "node ./packages/monorepo-scripts/lib/test_installation.js",
|
"test:installation": "node ./packages/monorepo-scripts/lib/test_installation.js",
|
||||||
"test:installation:local": "IS_LOCAL_PUBLISH=true node ./packages/monorepo-scripts/lib/test_installation.js",
|
"test:installation:local": "IS_LOCAL_PUBLISH=true node ./packages/monorepo-scripts/lib/test_installation.js",
|
||||||
"test:publish:circleci:comment": "HACK(albrow) We need an automated way to login to npm and echo+sleep piped to stdin was the only way I could find to do it.",
|
"test:publish:circleci:comment": "HACK(albrow) We need an automated way to login to npm and echo+sleep piped to stdin was the only way I could find to do it.",
|
||||||
|
@ -78,6 +78,7 @@ export {
|
|||||||
ERC721AssetData,
|
ERC721AssetData,
|
||||||
SignatureType,
|
SignatureType,
|
||||||
OrderRelevantState,
|
OrderRelevantState,
|
||||||
|
Stats,
|
||||||
} from '@0xproject/types';
|
} from '@0xproject/types';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
@ -1,4 +1,12 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "2.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add optional validation to the forwarder wrapper methods"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@ -8,10 +8,11 @@ import * as _ from 'lodash';
|
|||||||
import { artifacts } from '../artifacts';
|
import { artifacts } from '../artifacts';
|
||||||
import { orderTxOptsSchema } from '../schemas/order_tx_opts_schema';
|
import { orderTxOptsSchema } from '../schemas/order_tx_opts_schema';
|
||||||
import { txOptsSchema } from '../schemas/tx_opts_schema';
|
import { txOptsSchema } from '../schemas/tx_opts_schema';
|
||||||
import { TransactionOpts } from '../types';
|
import { OrderTransactionOpts } from '../types';
|
||||||
import { assert } from '../utils/assert';
|
import { assert } from '../utils/assert';
|
||||||
import { calldataOptimizationUtils } from '../utils/calldata_optimization_utils';
|
import { calldataOptimizationUtils } from '../utils/calldata_optimization_utils';
|
||||||
import { constants } from '../utils/constants';
|
import { constants } from '../utils/constants';
|
||||||
|
import { decorators } from '../utils/decorators';
|
||||||
import { utils } from '../utils/utils';
|
import { utils } from '../utils/utils';
|
||||||
|
|
||||||
import { ContractWrapper } from './contract_wrapper';
|
import { ContractWrapper } from './contract_wrapper';
|
||||||
@ -50,9 +51,10 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
* @param feePercentage The percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
|
* @param feePercentage The percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
|
||||||
* Defaults to 0.
|
* Defaults to 0.
|
||||||
* @param feeRecipientAddress The address that will receive ETH when signedFeeOrders are filled.
|
* @param feeRecipientAddress The address that will receive ETH when signedFeeOrders are filled.
|
||||||
* @param txOpts Transaction parameters.
|
* @param orderTransactionOpts Transaction parameters.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
|
@decorators.asyncZeroExErrorHandler
|
||||||
public async marketSellOrdersWithEthAsync(
|
public async marketSellOrdersWithEthAsync(
|
||||||
signedOrders: SignedOrder[],
|
signedOrders: SignedOrder[],
|
||||||
takerAddress: string,
|
takerAddress: string,
|
||||||
@ -60,7 +62,7 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
signedFeeOrders: SignedOrder[] = [],
|
signedFeeOrders: SignedOrder[] = [],
|
||||||
feePercentage: number = 0,
|
feePercentage: number = 0,
|
||||||
feeRecipientAddress: string = constants.NULL_ADDRESS,
|
feeRecipientAddress: string = constants.NULL_ADDRESS,
|
||||||
txOpts: TransactionOpts = {},
|
orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
// type assertions
|
// type assertions
|
||||||
assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
|
assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
|
||||||
@ -69,7 +71,7 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
|
assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
|
||||||
assert.isNumber('feePercentage', feePercentage);
|
assert.isNumber('feePercentage', feePercentage);
|
||||||
assert.isETHAddressHex('feeRecipientAddress', feeRecipientAddress);
|
assert.isETHAddressHex('feeRecipientAddress', feeRecipientAddress);
|
||||||
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
|
assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
|
||||||
// other assertions
|
// other assertions
|
||||||
assert.ordersCanBeUsedForForwarderContract(signedOrders, this.getEtherTokenAddress());
|
assert.ordersCanBeUsedForForwarderContract(signedOrders, this.getEtherTokenAddress());
|
||||||
assert.feeOrdersCanBeUsedForForwarderContract(
|
assert.feeOrdersCanBeUsedForForwarderContract(
|
||||||
@ -85,20 +87,41 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
// optimize orders
|
// optimize orders
|
||||||
const optimizedMarketOrders = calldataOptimizationUtils.optimizeForwarderOrders(signedOrders);
|
const optimizedMarketOrders = calldataOptimizationUtils.optimizeForwarderOrders(signedOrders);
|
||||||
const optimizedFeeOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(signedFeeOrders);
|
const optimizedFeeOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(signedFeeOrders);
|
||||||
// send transaction
|
// compile signatures
|
||||||
|
const signatures = _.map(optimizedMarketOrders, order => order.signature);
|
||||||
|
const feeSignatures = _.map(optimizedFeeOrders, order => order.signature);
|
||||||
|
// get contract
|
||||||
const forwarderContractInstance = await this._getForwarderContractAsync();
|
const forwarderContractInstance = await this._getForwarderContractAsync();
|
||||||
const txHash = await forwarderContractInstance.marketSellOrdersWithEth.sendTransactionAsync(
|
// validate transaction
|
||||||
|
if (orderTransactionOpts.shouldValidate) {
|
||||||
|
await forwarderContractInstance.marketSellOrdersWithEth.callAsync(
|
||||||
optimizedMarketOrders,
|
optimizedMarketOrders,
|
||||||
_.map(optimizedMarketOrders, order => order.signature),
|
signatures,
|
||||||
optimizedFeeOrders,
|
optimizedFeeOrders,
|
||||||
_.map(optimizedFeeOrders, order => order.signature),
|
feeSignatures,
|
||||||
formattedFeePercentage,
|
formattedFeePercentage,
|
||||||
feeRecipientAddress,
|
feeRecipientAddress,
|
||||||
{
|
{
|
||||||
value: ethAmount,
|
value: ethAmount,
|
||||||
from: normalizedTakerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: txOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// send transaction
|
||||||
|
const txHash = await forwarderContractInstance.marketSellOrdersWithEth.sendTransactionAsync(
|
||||||
|
optimizedMarketOrders,
|
||||||
|
signatures,
|
||||||
|
optimizedFeeOrders,
|
||||||
|
feeSignatures,
|
||||||
|
formattedFeePercentage,
|
||||||
|
feeRecipientAddress,
|
||||||
|
{
|
||||||
|
value: ethAmount,
|
||||||
|
from: normalizedTakerAddress,
|
||||||
|
gas: orderTransactionOpts.gasLimit,
|
||||||
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
return txHash;
|
return txHash;
|
||||||
@ -118,9 +141,10 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
* @param feePercentage The percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
|
* @param feePercentage The percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
|
||||||
* Defaults to 0.
|
* Defaults to 0.
|
||||||
* @param feeRecipientAddress The address that will receive ETH when signedFeeOrders are filled.
|
* @param feeRecipientAddress The address that will receive ETH when signedFeeOrders are filled.
|
||||||
* @param txOpts Transaction parameters.
|
* @param orderTransactionOpts Transaction parameters.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
|
@decorators.asyncZeroExErrorHandler
|
||||||
public async marketBuyOrdersWithEthAsync(
|
public async marketBuyOrdersWithEthAsync(
|
||||||
signedOrders: SignedOrder[],
|
signedOrders: SignedOrder[],
|
||||||
makerAssetFillAmount: BigNumber,
|
makerAssetFillAmount: BigNumber,
|
||||||
@ -129,7 +153,7 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
signedFeeOrders: SignedOrder[] = [],
|
signedFeeOrders: SignedOrder[] = [],
|
||||||
feePercentage: number = 0,
|
feePercentage: number = 0,
|
||||||
feeRecipientAddress: string = constants.NULL_ADDRESS,
|
feeRecipientAddress: string = constants.NULL_ADDRESS,
|
||||||
txOpts: TransactionOpts = {},
|
orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
// type assertions
|
// type assertions
|
||||||
assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
|
assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
|
||||||
@ -139,7 +163,7 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
|
assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
|
||||||
assert.isNumber('feePercentage', feePercentage);
|
assert.isNumber('feePercentage', feePercentage);
|
||||||
assert.isETHAddressHex('feeRecipientAddress', feeRecipientAddress);
|
assert.isETHAddressHex('feeRecipientAddress', feeRecipientAddress);
|
||||||
assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
|
assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
|
||||||
// other assertions
|
// other assertions
|
||||||
assert.ordersCanBeUsedForForwarderContract(signedOrders, this.getEtherTokenAddress());
|
assert.ordersCanBeUsedForForwarderContract(signedOrders, this.getEtherTokenAddress());
|
||||||
assert.feeOrdersCanBeUsedForForwarderContract(
|
assert.feeOrdersCanBeUsedForForwarderContract(
|
||||||
@ -155,21 +179,43 @@ export class ForwarderWrapper extends ContractWrapper {
|
|||||||
// optimize orders
|
// optimize orders
|
||||||
const optimizedMarketOrders = calldataOptimizationUtils.optimizeForwarderOrders(signedOrders);
|
const optimizedMarketOrders = calldataOptimizationUtils.optimizeForwarderOrders(signedOrders);
|
||||||
const optimizedFeeOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(signedFeeOrders);
|
const optimizedFeeOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(signedFeeOrders);
|
||||||
// send transaction
|
// compile signatures
|
||||||
|
const signatures = _.map(optimizedMarketOrders, order => order.signature);
|
||||||
|
const feeSignatures = _.map(optimizedFeeOrders, order => order.signature);
|
||||||
|
// get contract
|
||||||
const forwarderContractInstance = await this._getForwarderContractAsync();
|
const forwarderContractInstance = await this._getForwarderContractAsync();
|
||||||
const txHash = await forwarderContractInstance.marketBuyOrdersWithEth.sendTransactionAsync(
|
// validate transaction
|
||||||
|
if (orderTransactionOpts.shouldValidate) {
|
||||||
|
await forwarderContractInstance.marketBuyOrdersWithEth.callAsync(
|
||||||
optimizedMarketOrders,
|
optimizedMarketOrders,
|
||||||
makerAssetFillAmount,
|
makerAssetFillAmount,
|
||||||
_.map(optimizedMarketOrders, order => order.signature),
|
signatures,
|
||||||
optimizedFeeOrders,
|
optimizedFeeOrders,
|
||||||
_.map(optimizedFeeOrders, order => order.signature),
|
feeSignatures,
|
||||||
formattedFeePercentage,
|
formattedFeePercentage,
|
||||||
feeRecipientAddress,
|
feeRecipientAddress,
|
||||||
{
|
{
|
||||||
value: ethAmount,
|
value: ethAmount,
|
||||||
from: normalizedTakerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: txOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// send transaction
|
||||||
|
const txHash = await forwarderContractInstance.marketBuyOrdersWithEth.sendTransactionAsync(
|
||||||
|
optimizedMarketOrders,
|
||||||
|
makerAssetFillAmount,
|
||||||
|
signatures,
|
||||||
|
optimizedFeeOrders,
|
||||||
|
feeSignatures,
|
||||||
|
formattedFeePercentage,
|
||||||
|
feeRecipientAddress,
|
||||||
|
{
|
||||||
|
value: ethAmount,
|
||||||
|
from: normalizedTakerAddress,
|
||||||
|
gas: orderTransactionOpts.gasLimit,
|
||||||
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
return txHash;
|
return txHash;
|
||||||
|
@ -17,6 +17,7 @@ chaiSetup.configure();
|
|||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
|
// tslint:disable:custom-no-magic-numbers
|
||||||
describe('ForwarderWrapper', () => {
|
describe('ForwarderWrapper', () => {
|
||||||
const contractWrappersConfig = {
|
const contractWrappersConfig = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
@ -99,6 +100,25 @@ describe('ForwarderWrapper', () => {
|
|||||||
expect(ordersInfo[0].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
|
expect(ordersInfo[0].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
|
||||||
expect(ordersInfo[1].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
|
expect(ordersInfo[1].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
|
||||||
});
|
});
|
||||||
|
it('should throw when invalid transaction and shouldValidate is true', async () => {
|
||||||
|
const signedOrders = [signedOrder];
|
||||||
|
// request more makerAsset than what is available
|
||||||
|
const makerAssetFillAmount = signedOrder.makerAssetAmount.plus(100);
|
||||||
|
return expect(
|
||||||
|
contractWrappers.forwarder.marketBuyOrdersWithEthAsync(
|
||||||
|
signedOrders,
|
||||||
|
makerAssetFillAmount,
|
||||||
|
takerAddress,
|
||||||
|
makerAssetFillAmount,
|
||||||
|
[],
|
||||||
|
0,
|
||||||
|
constants.NULL_ADDRESS,
|
||||||
|
{
|
||||||
|
shouldValidate: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
).to.be.rejectedWith('COMPLETE_FILL_FAILED');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('#marketSellOrdersWithEthAsync', () => {
|
describe('#marketSellOrdersWithEthAsync', () => {
|
||||||
it('should market sell orders with eth', async () => {
|
it('should market sell orders with eth', async () => {
|
||||||
@ -115,5 +135,33 @@ describe('ForwarderWrapper', () => {
|
|||||||
expect(ordersInfo[1].orderStatus).to.be.equal(OrderStatus.FILLABLE);
|
expect(ordersInfo[1].orderStatus).to.be.equal(OrderStatus.FILLABLE);
|
||||||
expect(ordersInfo[1].orderTakerAssetFilledAmount).to.be.bignumber.equal(new BigNumber(4)); // only 95% of ETH is sold
|
expect(ordersInfo[1].orderTakerAssetFilledAmount).to.be.bignumber.equal(new BigNumber(4)); // only 95% of ETH is sold
|
||||||
});
|
});
|
||||||
|
it('should throw when invalid transaction and shouldValidate is true', async () => {
|
||||||
|
// create an order with fees, we try to fill it but we do not provide enough ETH to cover the fees
|
||||||
|
const signedOrderWithFee = await fillScenarios.createFillableSignedOrderWithFeesAsync(
|
||||||
|
makerAssetData,
|
||||||
|
takerAssetData,
|
||||||
|
constants.ZERO_AMOUNT,
|
||||||
|
new BigNumber(100),
|
||||||
|
makerAddress,
|
||||||
|
constants.NULL_ADDRESS,
|
||||||
|
fillableAmount,
|
||||||
|
constants.NULL_ADDRESS,
|
||||||
|
);
|
||||||
|
const signedOrders = [signedOrderWithFee];
|
||||||
|
const makerAssetFillAmount = signedOrder.makerAssetAmount;
|
||||||
|
return expect(
|
||||||
|
contractWrappers.forwarder.marketSellOrdersWithEthAsync(
|
||||||
|
signedOrders,
|
||||||
|
takerAddress,
|
||||||
|
makerAssetFillAmount,
|
||||||
|
[],
|
||||||
|
0,
|
||||||
|
constants.NULL_ADDRESS,
|
||||||
|
{
|
||||||
|
shouldValidate: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
).to.be.rejectedWith('COMPLETE_FILL_FAILED');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
88
packages/dev-tools-pages/README.md
Normal file
88
packages/dev-tools-pages/README.md
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
## Dev tools pages
|
||||||
|
|
||||||
|
This repository contains our dev tools pages.
|
||||||
|
|
||||||
|
## Local Dev Setup
|
||||||
|
|
||||||
|
Requires Node version 6.9.5 or higher & yarn v1.9.4
|
||||||
|
|
||||||
|
### 1. Install dependencies for monorepo:
|
||||||
|
|
||||||
|
Make sure you install Yarn v1.9.4 (npm won't work!). We rely on our `yarn.lock` file and on Yarn's support for `workspaces` in our monorepo setup.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Initial setup
|
||||||
|
|
||||||
|
To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PKG=@0xproject/dev-tools-pages yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: Ignore the `WARNING in asset size limit` and `WARNING in entrypoint size limit` warnings.
|
||||||
|
|
||||||
|
### 3. Run dev server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/dev-tools-pages
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Visit [http://localhost:3572/](http://localhost:3572/) in your browser.
|
||||||
|
|
||||||
|
The webpage will refresh when source code is changed.
|
||||||
|
|
||||||
|
### 4. Code!
|
||||||
|
|
||||||
|
There are some basic primitives we'd like you to use:
|
||||||
|
|
||||||
|
1. `<Container>Stuff</Container>`: Use containers instead of divs,spans,etc... and use it's props instead of inline styles (e.g `style={{margin: 3}}` should be `margin="3px"`
|
||||||
|
|
||||||
|
2. `<Text>Look ma, text!</Text>`: Use text components whenever rendering text. It has props for manipulating texts, so again no in-line styles. Use `fontColor="red"`, not `style={{color: 'red'}}`.
|
||||||
|
|
||||||
|
3. Styled-components: See the `ui/button.tsx` file for an example of how to use these.
|
||||||
|
|
||||||
|
4. BassCss: This library gives you access to a bunch of [classes](http://basscss.com/) that apply styles in a browser-compatible way, has affordances for responsiveness and alleviates the need for inline styles or LESS/CSS files.
|
||||||
|
|
||||||
|
With the above 4 tools and following the React paradigm, you shouldn't need CSS/LESS files. IF there are special occasions where you do, these is a `all.less` file, but this is a solution of last resort. Use it sparingly.
|
||||||
|
|
||||||
|
### Clean
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn clean
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lint
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lint
|
||||||
|
```
|
||||||
|
|
||||||
|
### Prettier
|
||||||
|
|
||||||
|
Run from the monorepo root directory:
|
||||||
|
|
||||||
|
```
|
||||||
|
yarn prettier
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resources
|
||||||
|
|
||||||
|
##### Toolkit
|
||||||
|
|
||||||
|
* [Styled Components](https://www.styled-components.com/)
|
||||||
|
* [BassCSS](http://basscss.com/)
|
||||||
|
|
||||||
|
##### Recommended Atom packages:
|
||||||
|
|
||||||
|
* [atom-typescript](https://atom.io/packages/atom-typescript)
|
||||||
|
* [linter-tslint](https://atom.io/packages/linter-tslint)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
||||||
|
|
||||||
|
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
0
packages/dev-tools-pages/less/all.less
Normal file
0
packages/dev-tools-pages/less/all.less
Normal file
58
packages/dev-tools-pages/package.json
Normal file
58
packages/dev-tools-pages/package.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"name": "@0xproject/dev-tools-pages",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.12"
|
||||||
|
},
|
||||||
|
"private": true,
|
||||||
|
"description": "0x Dev tools pages",
|
||||||
|
"scripts": {
|
||||||
|
"build": "node --max_old_space_size=8192 ../../node_modules/.bin/webpack --mode production",
|
||||||
|
"build:ci": "yarn build",
|
||||||
|
"build:dev": "../../node_modules/.bin/webpack --mode development",
|
||||||
|
"clean": "shx rm -f public/bundle*",
|
||||||
|
"lint": "tslint --project . 'ts/**/*.ts' 'ts/**/*.tsx'",
|
||||||
|
"dev": "webpack-dev-server --mode development --content-base public"
|
||||||
|
},
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@0xproject/react-shared": "^1.0.15",
|
||||||
|
"basscss": "^8.0.3",
|
||||||
|
"bowser": "^1.9.3",
|
||||||
|
"less": "^2.7.2",
|
||||||
|
"lodash": "^4.17.5",
|
||||||
|
"polished": "^1.9.2",
|
||||||
|
"react": "^16.4.2",
|
||||||
|
"react-document-title": "^2.0.3",
|
||||||
|
"react-dom": "^16.4.2",
|
||||||
|
"react-helmet": "^5.2.0",
|
||||||
|
"styled-components": "^3.3.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/lodash": "4.14.104",
|
||||||
|
"@types/node": "*",
|
||||||
|
"@types/react": "^16.4.2",
|
||||||
|
"@types/react-dom": "^16.0.7",
|
||||||
|
"@types/react-helmet": "^5.0.6",
|
||||||
|
"@types/react-router-dom": "^4.0.4",
|
||||||
|
"@types/react-tap-event-plugin": "0.0.30",
|
||||||
|
"@types/styled-components": "^4.0.0",
|
||||||
|
"awesome-typescript-loader": "^5.2.1",
|
||||||
|
"copyfiles": "^2.0.0",
|
||||||
|
"css-loader": "0.23.x",
|
||||||
|
"less-loader": "^4.1.0",
|
||||||
|
"make-promises-safe": "^1.1.0",
|
||||||
|
"raw-loader": "^0.5.1",
|
||||||
|
"shx": "^0.2.2",
|
||||||
|
"source-map-loader": "^0.2.4",
|
||||||
|
"style-loader": "0.23.x",
|
||||||
|
"terser-webpack-plugin": "^1.1.0",
|
||||||
|
"tslint": "5.11.0",
|
||||||
|
"tslint-config-0xproject": "^0.0.2",
|
||||||
|
"typescript": "3.0.1",
|
||||||
|
"uglifyjs-webpack-plugin": "^2.0.1",
|
||||||
|
"webpack": "^4.20.2",
|
||||||
|
"webpack-cli": "3.1.2",
|
||||||
|
"webpack-dev-server": "^3.1.9"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
/* Custom Basscss Responsive Utilities */
|
||||||
|
|
||||||
|
@media (max-width: 52em) {
|
||||||
|
.sm-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.sm-align-middle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.sm-align-top {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.sm-left-align {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.sm-right-align {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.sm-table-cell {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
.sm-mx-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.sm-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 52em) {
|
||||||
|
.md-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.md-align-middle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.md-align-top {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.md-left-align {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.md-right-align {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.md-table-cell {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
.md-mx-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.md-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 64em) {
|
||||||
|
.lg-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.lg-align-middle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.lg-align-top {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.lg-left-align {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.lg-right-align {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.lg-table-cell {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
.lg-mx-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.lg-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,453 @@
|
|||||||
|
/* Basscss Responsive Margin */
|
||||||
|
|
||||||
|
@media (max-width: 52em) {
|
||||||
|
/* Modified by Fabio Berger to max-width from min-width */
|
||||||
|
|
||||||
|
.sm-m0 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.sm-mt0 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.sm-mr0 {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.sm-mb0 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.sm-ml0 {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
.sm-mx0 {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.sm-my0 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-m1 {
|
||||||
|
margin: 0.5rem;
|
||||||
|
}
|
||||||
|
.sm-mt1 {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
}
|
||||||
|
.sm-mr1 {
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
.sm-mb1 {
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
.sm-ml1 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
}
|
||||||
|
.sm-mx1 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
.sm-my1 {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-m2 {
|
||||||
|
margin: 1rem;
|
||||||
|
}
|
||||||
|
.sm-mt2 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
.sm-mr2 {
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
.sm-mb2 {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.sm-ml2 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
}
|
||||||
|
.sm-mx2 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
.sm-my2 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-m3 {
|
||||||
|
margin: 2rem;
|
||||||
|
}
|
||||||
|
.sm-mt3 {
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
.sm-mr3 {
|
||||||
|
margin-right: 2rem;
|
||||||
|
}
|
||||||
|
.sm-mb3 {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
.sm-ml3 {
|
||||||
|
margin-left: 2rem;
|
||||||
|
}
|
||||||
|
.sm-mx3 {
|
||||||
|
margin-left: 2rem;
|
||||||
|
margin-right: 2rem;
|
||||||
|
}
|
||||||
|
.sm-my3 {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-m4 {
|
||||||
|
margin: 4rem;
|
||||||
|
}
|
||||||
|
.sm-mt4 {
|
||||||
|
margin-top: 4rem;
|
||||||
|
}
|
||||||
|
.sm-mr4 {
|
||||||
|
margin-right: 4rem;
|
||||||
|
}
|
||||||
|
.sm-mb4 {
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
.sm-ml4 {
|
||||||
|
margin-left: 4rem;
|
||||||
|
}
|
||||||
|
.sm-mx4 {
|
||||||
|
margin-left: 4rem;
|
||||||
|
margin-right: 4rem;
|
||||||
|
}
|
||||||
|
.sm-my4 {
|
||||||
|
margin-top: 4rem;
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-mxn1 {
|
||||||
|
margin-left: -0.5rem;
|
||||||
|
margin-right: -0.5rem;
|
||||||
|
}
|
||||||
|
.sm-mxn2 {
|
||||||
|
margin-left: -1rem;
|
||||||
|
margin-right: -1rem;
|
||||||
|
}
|
||||||
|
.sm-mxn3 {
|
||||||
|
margin-left: -2rem;
|
||||||
|
margin-right: -2rem;
|
||||||
|
}
|
||||||
|
.sm-mxn4 {
|
||||||
|
margin-left: -4rem;
|
||||||
|
margin-right: -4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-ml-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.sm-mr-auto {
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.sm-mx-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 52em) {
|
||||||
|
.md-m0 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.md-mt0 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.md-mr0 {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.md-mb0 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.md-ml0 {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
.md-mx0 {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.md-my0 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-m1 {
|
||||||
|
margin: 0.5rem;
|
||||||
|
}
|
||||||
|
.md-mt1 {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
}
|
||||||
|
.md-mr1 {
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
.md-mb1 {
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
.md-ml1 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
}
|
||||||
|
.md-mx1 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
.md-my1 {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-m2 {
|
||||||
|
margin: 1rem;
|
||||||
|
}
|
||||||
|
.md-mt2 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
.md-mr2 {
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
.md-mb2 {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.md-ml2 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
}
|
||||||
|
.md-mx2 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
.md-my2 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-m3 {
|
||||||
|
margin: 2rem;
|
||||||
|
}
|
||||||
|
.md-mt3 {
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
.md-mr3 {
|
||||||
|
margin-right: 2rem;
|
||||||
|
}
|
||||||
|
.md-mb3 {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
.md-ml3 {
|
||||||
|
margin-left: 2rem;
|
||||||
|
}
|
||||||
|
.md-mx3 {
|
||||||
|
margin-left: 2rem;
|
||||||
|
margin-right: 2rem;
|
||||||
|
}
|
||||||
|
.md-my3 {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-m4 {
|
||||||
|
margin: 4rem;
|
||||||
|
}
|
||||||
|
.md-mt4 {
|
||||||
|
margin-top: 4rem;
|
||||||
|
}
|
||||||
|
.md-mr4 {
|
||||||
|
margin-right: 4rem;
|
||||||
|
}
|
||||||
|
.md-mb4 {
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
.md-ml4 {
|
||||||
|
margin-left: 4rem;
|
||||||
|
}
|
||||||
|
.md-mx4 {
|
||||||
|
margin-left: 4rem;
|
||||||
|
margin-right: 4rem;
|
||||||
|
}
|
||||||
|
.md-my4 {
|
||||||
|
margin-top: 4rem;
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-mxn1 {
|
||||||
|
margin-left: -0.5rem;
|
||||||
|
margin-right: -0.5rem;
|
||||||
|
}
|
||||||
|
.md-mxn2 {
|
||||||
|
margin-left: -1rem;
|
||||||
|
margin-right: -1rem;
|
||||||
|
}
|
||||||
|
.md-mxn3 {
|
||||||
|
margin-left: -2rem;
|
||||||
|
margin-right: -2rem;
|
||||||
|
}
|
||||||
|
.md-mxn4 {
|
||||||
|
margin-left: -4rem;
|
||||||
|
margin-right: -4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-ml-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.md-mr-auto {
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.md-mx-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 64em) {
|
||||||
|
.lg-m0 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.lg-mt0 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.lg-mr0 {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.lg-mb0 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.lg-ml0 {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
.lg-mx0 {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.lg-my0 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-m1 {
|
||||||
|
margin: 0.5rem;
|
||||||
|
}
|
||||||
|
.lg-mt1 {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
}
|
||||||
|
.lg-mr1 {
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
.lg-mb1 {
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
.lg-ml1 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
}
|
||||||
|
.lg-mx1 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
.lg-my1 {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-m2 {
|
||||||
|
margin: 1rem;
|
||||||
|
}
|
||||||
|
.lg-mt2 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
.lg-mr2 {
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
.lg-mb2 {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.lg-ml2 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
}
|
||||||
|
.lg-mx2 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
.lg-my2 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-m3 {
|
||||||
|
margin: 2rem;
|
||||||
|
}
|
||||||
|
.lg-mt3 {
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
.lg-mr3 {
|
||||||
|
margin-right: 2rem;
|
||||||
|
}
|
||||||
|
.lg-mb3 {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
.lg-ml3 {
|
||||||
|
margin-left: 2rem;
|
||||||
|
}
|
||||||
|
.lg-mx3 {
|
||||||
|
margin-left: 2rem;
|
||||||
|
margin-right: 2rem;
|
||||||
|
}
|
||||||
|
.lg-my3 {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-m4 {
|
||||||
|
margin: 4rem;
|
||||||
|
}
|
||||||
|
.lg-mt4 {
|
||||||
|
margin-top: 4rem;
|
||||||
|
}
|
||||||
|
.lg-mr4 {
|
||||||
|
margin-right: 4rem;
|
||||||
|
}
|
||||||
|
.lg-mb4 {
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
.lg-ml4 {
|
||||||
|
margin-left: 4rem;
|
||||||
|
}
|
||||||
|
.lg-mx4 {
|
||||||
|
margin-left: 4rem;
|
||||||
|
margin-right: 4rem;
|
||||||
|
}
|
||||||
|
.lg-my4 {
|
||||||
|
margin-top: 4rem;
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-mxn1 {
|
||||||
|
margin-left: -0.5rem;
|
||||||
|
margin-right: -0.5rem;
|
||||||
|
}
|
||||||
|
.lg-mxn2 {
|
||||||
|
margin-left: -1rem;
|
||||||
|
margin-right: -1rem;
|
||||||
|
}
|
||||||
|
.lg-mxn3 {
|
||||||
|
margin-left: -2rem;
|
||||||
|
margin-right: -2rem;
|
||||||
|
}
|
||||||
|
.lg-mxn4 {
|
||||||
|
margin-left: -4rem;
|
||||||
|
margin-right: -4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-ml-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.lg-mr-auto {
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
.lg-mx-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,134 @@
|
|||||||
|
/* Basscss Responsive Padding */
|
||||||
|
/* Modified by Fabio Berger to include xs prefix */
|
||||||
|
|
||||||
|
@media (max-width: 52em) { /* Modified by Fabio Berger to max-width from min-width */
|
||||||
|
|
||||||
|
.sm-p0 { padding: 0 }
|
||||||
|
.sm-pt0 { padding-top: 0 }
|
||||||
|
.sm-pr0 { padding-right: 0 }
|
||||||
|
.sm-pb0 { padding-bottom: 0 }
|
||||||
|
.sm-pl0 { padding-left: 0 }
|
||||||
|
.sm-px0 { padding-left: 0; padding-right: 0 }
|
||||||
|
.sm-py0 { padding-top: 0; padding-bottom: 0 }
|
||||||
|
|
||||||
|
.sm-p1 { padding: .5rem }
|
||||||
|
.sm-pt1 { padding-top: .5rem }
|
||||||
|
.sm-pr1 { padding-right: .5rem }
|
||||||
|
.sm-pb1 { padding-bottom: .5rem }
|
||||||
|
.sm-pl1 { padding-left: .5rem }
|
||||||
|
.sm-px1 { padding-left: .5rem; padding-right: .5rem }
|
||||||
|
.sm-py1 { padding-top: .5rem; padding-bottom: .5rem }
|
||||||
|
|
||||||
|
.sm-p2 { padding: 1rem }
|
||||||
|
.sm-pt2 { padding-top: 1rem }
|
||||||
|
.sm-pr2 { padding-right: 1rem }
|
||||||
|
.sm-pb2 { padding-bottom: 1rem }
|
||||||
|
.sm-pl2 { padding-left: 1rem }
|
||||||
|
.sm-px2 { padding-left: 1rem; padding-right: 1rem }
|
||||||
|
.sm-py2 { padding-top: 1rem; padding-bottom: 1rem }
|
||||||
|
|
||||||
|
.sm-p3 { padding: 2rem }
|
||||||
|
.sm-pt3 { padding-top: 2rem }
|
||||||
|
.sm-pr3 { padding-right: 2rem }
|
||||||
|
.sm-pb3 { padding-bottom: 2rem }
|
||||||
|
.sm-pl3 { padding-left: 2rem }
|
||||||
|
.sm-px3 { padding-left: 2rem; padding-right: 2rem }
|
||||||
|
.sm-py3 { padding-top: 2rem; padding-bottom: 2rem }
|
||||||
|
|
||||||
|
.sm-p4 { padding: 4rem }
|
||||||
|
.sm-pt4 { padding-top: 4rem }
|
||||||
|
.sm-pr4 { padding-right: 4rem }
|
||||||
|
.sm-pb4 { padding-bottom: 4rem }
|
||||||
|
.sm-pl4 { padding-left: 4rem }
|
||||||
|
.sm-px4 { padding-left: 4rem; padding-right: 4rem }
|
||||||
|
.sm-py4 { padding-top: 4rem; padding-bottom: 4rem }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 52em) {
|
||||||
|
|
||||||
|
.md-p0 { padding: 0 }
|
||||||
|
.md-pt0 { padding-top: 0 }
|
||||||
|
.md-pr0 { padding-right: 0 }
|
||||||
|
.md-pb0 { padding-bottom: 0 }
|
||||||
|
.md-pl0 { padding-left: 0 }
|
||||||
|
.md-px0 { padding-left: 0; padding-right: 0 }
|
||||||
|
.md-py0 { padding-top: 0; padding-bottom: 0 }
|
||||||
|
|
||||||
|
.md-p1 { padding: .5rem }
|
||||||
|
.md-pt1 { padding-top: .5rem }
|
||||||
|
.md-pr1 { padding-right: .5rem }
|
||||||
|
.md-pb1 { padding-bottom: .5rem }
|
||||||
|
.md-pl1 { padding-left: .5rem }
|
||||||
|
.md-px1 { padding-left: .5rem; padding-right: .5rem }
|
||||||
|
.md-py1 { padding-top: .5rem; padding-bottom: .5rem }
|
||||||
|
|
||||||
|
.md-p2 { padding: 1rem }
|
||||||
|
.md-pt2 { padding-top: 1rem }
|
||||||
|
.md-pr2 { padding-right: 1rem }
|
||||||
|
.md-pb2 { padding-bottom: 1rem }
|
||||||
|
.md-pl2 { padding-left: 1rem }
|
||||||
|
.md-px2 { padding-left: 1rem; padding-right: 1rem }
|
||||||
|
.md-py2 { padding-top: 1rem; padding-bottom: 1rem }
|
||||||
|
|
||||||
|
.md-p3 { padding: 2rem }
|
||||||
|
.md-pt3 { padding-top: 2rem }
|
||||||
|
.md-pr3 { padding-right: 2rem }
|
||||||
|
.md-pb3 { padding-bottom: 2rem }
|
||||||
|
.md-pl3 { padding-left: 2rem }
|
||||||
|
.md-px3 { padding-left: 2rem; padding-right: 2rem }
|
||||||
|
.md-py3 { padding-top: 2rem; padding-bottom: 2rem }
|
||||||
|
|
||||||
|
.md-p4 { padding: 4rem }
|
||||||
|
.md-pt4 { padding-top: 4rem }
|
||||||
|
.md-pr4 { padding-right: 4rem }
|
||||||
|
.md-pb4 { padding-bottom: 4rem }
|
||||||
|
.md-pl4 { padding-left: 4rem }
|
||||||
|
.md-px4 { padding-left: 4rem; padding-right: 4rem }
|
||||||
|
.md-py4 { padding-top: 4rem; padding-bottom: 4rem }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 64em) {
|
||||||
|
|
||||||
|
.lg-p0 { padding: 0 }
|
||||||
|
.lg-pt0 { padding-top: 0 }
|
||||||
|
.lg-pr0 { padding-right: 0 }
|
||||||
|
.lg-pb0 { padding-bottom: 0 }
|
||||||
|
.lg-pl0 { padding-left: 0 }
|
||||||
|
.lg-px0 { padding-left: 0; padding-right: 0 }
|
||||||
|
.lg-py0 { padding-top: 0; padding-bottom: 0 }
|
||||||
|
|
||||||
|
.lg-p1 { padding: .5rem }
|
||||||
|
.lg-pt1 { padding-top: .5rem }
|
||||||
|
.lg-pr1 { padding-right: .5rem }
|
||||||
|
.lg-pb1 { padding-bottom: .5rem }
|
||||||
|
.lg-pl1 { padding-left: .5rem }
|
||||||
|
.lg-px1 { padding-left: .5rem; padding-right: .5rem }
|
||||||
|
.lg-py1 { padding-top: .5rem; padding-bottom: .5rem }
|
||||||
|
|
||||||
|
.lg-p2 { padding: 1rem }
|
||||||
|
.lg-pt2 { padding-top: 1rem }
|
||||||
|
.lg-pr2 { padding-right: 1rem }
|
||||||
|
.lg-pb2 { padding-bottom: 1rem }
|
||||||
|
.lg-pl2 { padding-left: 1rem }
|
||||||
|
.lg-px2 { padding-left: 1rem; padding-right: 1rem }
|
||||||
|
.lg-py2 { padding-top: 1rem; padding-bottom: 1rem }
|
||||||
|
|
||||||
|
.lg-p3 { padding: 2rem }
|
||||||
|
.lg-pt3 { padding-top: 2rem }
|
||||||
|
.lg-pr3 { padding-right: 2rem }
|
||||||
|
.lg-pb3 { padding-bottom: 2rem }
|
||||||
|
.lg-pl3 { padding-left: 2rem }
|
||||||
|
.lg-px3 { padding-left: 2rem; padding-right: 2rem }
|
||||||
|
.lg-py3 { padding-top: 2rem; padding-bottom: 2rem }
|
||||||
|
|
||||||
|
.lg-p4 { padding: 4rem }
|
||||||
|
.lg-pt4 { padding-top: 4rem }
|
||||||
|
.lg-pr4 { padding-right: 4rem }
|
||||||
|
.lg-pb4 { padding-bottom: 4rem }
|
||||||
|
.lg-pl4 { padding-left: 4rem }
|
||||||
|
.lg-px4 { padding-left: 4rem; padding-right: 4rem }
|
||||||
|
.lg-py4 { padding-top: 4rem; padding-bottom: 4rem }
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
/* Basscss Responsive Type Scale */
|
||||||
|
/* Modified by Fabio Berger to include xs prefix */
|
||||||
|
|
||||||
|
@media (max-width: 52em) { /* Modified by Fabio Berger to max-width from min-width */
|
||||||
|
.sm-h00 { font-size: 4rem }
|
||||||
|
.sm-h0 { font-size: 3rem }
|
||||||
|
.sm-h1 { font-size: 2rem }
|
||||||
|
.sm-h2 { font-size: 1.5rem }
|
||||||
|
.sm-h3 { font-size: 1.25rem }
|
||||||
|
.sm-h4 { font-size: 1rem }
|
||||||
|
.sm-h5 { font-size: .875rem }
|
||||||
|
.sm-h6 { font-size: .75rem }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 52em) {
|
||||||
|
.md-h00 { font-size: 4rem }
|
||||||
|
.md-h0 { font-size: 3rem }
|
||||||
|
.md-h1 { font-size: 2rem }
|
||||||
|
.md-h2 { font-size: 1.5rem }
|
||||||
|
.md-h3 { font-size: 1.25rem }
|
||||||
|
.md-h4 { font-size: 1rem }
|
||||||
|
.md-h5 { font-size: .875rem }
|
||||||
|
.md-h6 { font-size: .75rem }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 64em) {
|
||||||
|
.lg-h00 { font-size: 4rem }
|
||||||
|
.lg-h0 { font-size: 3rem }
|
||||||
|
.lg-h1 { font-size: 2rem }
|
||||||
|
.lg-h2 { font-size: 1.5rem }
|
||||||
|
.lg-h3 { font-size: 1.25rem }
|
||||||
|
.lg-h4 { font-size: 1rem }
|
||||||
|
.lg-h5 { font-size: .875rem }
|
||||||
|
.lg-h6 { font-size: .75rem }
|
||||||
|
}
|
BIN
packages/dev-tools-pages/public/images/favicon/favicon-2-16x16.png
Executable file
BIN
packages/dev-tools-pages/public/images/favicon/favicon-2-16x16.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 684 B |
BIN
packages/dev-tools-pages/public/images/favicon/favicon-2-32x32.png
Executable file
BIN
packages/dev-tools-pages/public/images/favicon/favicon-2-32x32.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
packages/dev-tools-pages/public/images/favicon/favicon.ico
Executable file
BIN
packages/dev-tools-pages/public/images/favicon/favicon.ico
Executable file
Binary file not shown.
After Width: | Height: | Size: 5.3 KiB |
26
packages/dev-tools-pages/public/index.html
Normal file
26
packages/dev-tools-pages/public/index.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="description" content="" />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:title" content="0x" />
|
||||||
|
<meta property="og:description" content="" />
|
||||||
|
<meta property="og:image" content="/images/og_image.png" />
|
||||||
|
<title>0x: The Protocol for Trading Tokens</title>
|
||||||
|
<link rel="icon" type="image/png" href="/images/favicon/favicon-2-32x32.png" sizes="32x32" />
|
||||||
|
<link rel="icon" type="image/png" href="/images/favicon/favicon-2-16x16.png" sizes="16x16" />
|
||||||
|
<link rel="stylesheet" href="/css/basscss_responsive_custom.css">
|
||||||
|
<link rel="stylesheet" href="/css/basscss_responsive_padding.css">
|
||||||
|
<link rel="stylesheet" href="/css/basscss_responsive_margin.css">
|
||||||
|
<link rel="stylesheet" href="/css/basscss_responsive_type_scale.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="margin: 0px; min-width: 355px;">
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="text/javascript" crossorigin="anonymous" src="/bundle.js" charset="utf-8"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
25
packages/dev-tools-pages/ts/components/meta_tags.tsx
Normal file
25
packages/dev-tools-pages/ts/components/meta_tags.tsx
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { Helmet } from 'react-helmet';
|
||||||
|
|
||||||
|
export interface MetaTagsProps {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
imgSrc?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MetaTags: React.StatelessComponent<MetaTagsProps> = ({ title, description, imgSrc }) => (
|
||||||
|
<Helmet>
|
||||||
|
<title>{title}</title>
|
||||||
|
<meta name="description" content={description} />
|
||||||
|
<meta property="og:title" content={title} />
|
||||||
|
<meta property="og:description" content={description} />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:image" content={imgSrc} />
|
||||||
|
<meta name="twitter:site" content="@0xproject" />
|
||||||
|
<meta name="twitter:image" content={imgSrc} />
|
||||||
|
</Helmet>
|
||||||
|
);
|
||||||
|
|
||||||
|
MetaTags.defaultProps = {
|
||||||
|
imgSrc: '/images/og_image.png',
|
||||||
|
};
|
59
packages/dev-tools-pages/ts/components/ui/button.tsx
Normal file
59
packages/dev-tools-pages/ts/components/ui/button.tsx
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { darken, saturate } from 'polished';
|
||||||
|
import * as React from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AN EXAMPLE OF HOW TO CREATE A STYLED COMPONENT USING STYLED-COMPONENTS
|
||||||
|
* SEE: https://www.styled-components.com/docs/basics#coming-from-css
|
||||||
|
*/
|
||||||
|
export interface ButtonProps {
|
||||||
|
backgroundColor?: string;
|
||||||
|
borderColor?: string;
|
||||||
|
width?: string;
|
||||||
|
padding?: string;
|
||||||
|
type?: string;
|
||||||
|
isDisabled?: boolean;
|
||||||
|
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlainButton: React.StatelessComponent<ButtonProps> = ({ children, isDisabled, onClick, type, className }) => (
|
||||||
|
<button type={type} className={className} onClick={isDisabled ? undefined : onClick} disabled={isDisabled}>
|
||||||
|
{children}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
|
||||||
|
const darkenOnHoverAmount = 0.1;
|
||||||
|
const darkenOnActiveAmount = 0.2;
|
||||||
|
const saturateOnFocusAmount = 0.2;
|
||||||
|
export const Button = styled(PlainButton)`
|
||||||
|
cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
|
||||||
|
transition: background-color, opacity 0.5s ease;
|
||||||
|
padding: ${props => props.padding};
|
||||||
|
border-radius: 3px;
|
||||||
|
outline: none;
|
||||||
|
width: ${props => props.width};
|
||||||
|
background-color: ${props => (props.backgroundColor ? props.backgroundColor : 'none')};
|
||||||
|
border: ${props => (props.borderColor ? `1px solid ${props.backgroundColor}` : 'none')};
|
||||||
|
&:hover {
|
||||||
|
background-color: ${props =>
|
||||||
|
!props.isDisabled ? darken(darkenOnHoverAmount, props.backgroundColor) : ''} !important;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
background-color: ${props => (!props.isDisabled ? darken(darkenOnActiveAmount, props.backgroundColor) : '')};
|
||||||
|
}
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
&:focus {
|
||||||
|
background-color: ${props => saturate(saturateOnFocusAmount, props.backgroundColor)};
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
Button.defaultProps = {
|
||||||
|
backgroundColor: 'red',
|
||||||
|
width: 'auto',
|
||||||
|
isDisabled: false,
|
||||||
|
padding: '1em 2.2em',
|
||||||
|
};
|
||||||
|
Button.displayName = 'Button';
|
55
packages/dev-tools-pages/ts/components/ui/container.tsx
Normal file
55
packages/dev-tools-pages/ts/components/ui/container.tsx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
type StringOrNum = string | number;
|
||||||
|
|
||||||
|
export type ContainerTag = 'div' | 'span';
|
||||||
|
|
||||||
|
export interface ContainerProps {
|
||||||
|
marginTop?: StringOrNum;
|
||||||
|
marginBottom?: StringOrNum;
|
||||||
|
marginRight?: StringOrNum;
|
||||||
|
marginLeft?: StringOrNum;
|
||||||
|
padding?: StringOrNum;
|
||||||
|
paddingTop?: StringOrNum;
|
||||||
|
paddingBottom?: StringOrNum;
|
||||||
|
paddingRight?: StringOrNum;
|
||||||
|
paddingLeft?: StringOrNum;
|
||||||
|
backgroundColor?: string;
|
||||||
|
borderRadius?: StringOrNum;
|
||||||
|
maxWidth?: StringOrNum;
|
||||||
|
maxHeight?: StringOrNum;
|
||||||
|
width?: StringOrNum;
|
||||||
|
height?: StringOrNum;
|
||||||
|
minWidth?: StringOrNum;
|
||||||
|
minHeight?: StringOrNum;
|
||||||
|
isHidden?: boolean;
|
||||||
|
className?: string;
|
||||||
|
position?: 'absolute' | 'fixed' | 'relative' | 'unset';
|
||||||
|
display?: 'inline-block' | 'block' | 'inline-flex' | 'inline';
|
||||||
|
top?: string;
|
||||||
|
left?: string;
|
||||||
|
right?: string;
|
||||||
|
bottom?: string;
|
||||||
|
zIndex?: number;
|
||||||
|
Tag?: ContainerTag;
|
||||||
|
cursor?: string;
|
||||||
|
id?: string;
|
||||||
|
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
||||||
|
overflowX?: 'scroll' | 'hidden' | 'auto' | 'visible';
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Container: React.StatelessComponent<ContainerProps> = props => {
|
||||||
|
const { children, className, Tag, isHidden, id, onClick, ...style } = props;
|
||||||
|
const visibility = isHidden ? 'hidden' : undefined;
|
||||||
|
return (
|
||||||
|
<Tag id={id} style={{ ...style, visibility }} className={className} onClick={onClick}>
|
||||||
|
{children}
|
||||||
|
</Tag>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Container.defaultProps = {
|
||||||
|
Tag: 'div',
|
||||||
|
};
|
||||||
|
|
||||||
|
Container.displayName = 'Container';
|
74
packages/dev-tools-pages/ts/components/ui/text.tsx
Normal file
74
packages/dev-tools-pages/ts/components/ui/text.tsx
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import { colors } from '@0xproject/react-shared';
|
||||||
|
import { darken } from 'polished';
|
||||||
|
import * as React from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
export type TextTag = 'p' | 'div' | 'span' | 'label' | 'h1' | 'h2' | 'h3' | 'h4' | 'i';
|
||||||
|
|
||||||
|
export interface TextProps {
|
||||||
|
className?: string;
|
||||||
|
Tag?: TextTag;
|
||||||
|
fontSize?: string;
|
||||||
|
fontFamily?: string;
|
||||||
|
fontStyle?: string;
|
||||||
|
fontColor?: string;
|
||||||
|
lineHeight?: string;
|
||||||
|
minHeight?: string;
|
||||||
|
center?: boolean;
|
||||||
|
fontWeight?: number | string;
|
||||||
|
textDecorationLine?: string;
|
||||||
|
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
||||||
|
hoverColor?: string;
|
||||||
|
noWrap?: boolean;
|
||||||
|
display?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlainText: React.StatelessComponent<TextProps> = ({ children, className, onClick, Tag }) => (
|
||||||
|
<Tag className={className} onClick={onClick}>
|
||||||
|
{children}
|
||||||
|
</Tag>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const Text = styled(PlainText)`
|
||||||
|
font-family: ${props => props.fontFamily};
|
||||||
|
font-style: ${props => props.fontStyle};
|
||||||
|
font-weight: ${props => props.fontWeight};
|
||||||
|
font-size: ${props => props.fontSize};
|
||||||
|
text-decoration-line: ${props => props.textDecorationLine};
|
||||||
|
${props => (props.lineHeight ? `line-height: ${props.lineHeight}` : '')};
|
||||||
|
${props => (props.center ? 'text-align: center' : '')};
|
||||||
|
color: ${props => props.fontColor};
|
||||||
|
${props => (props.minHeight ? `min-height: ${props.minHeight}` : '')};
|
||||||
|
${props => (props.onClick ? 'cursor: pointer' : '')};
|
||||||
|
transition: color 0.5s ease;
|
||||||
|
${props => (props.noWrap ? 'white-space: nowrap' : '')};
|
||||||
|
${props => (props.display ? `display: ${props.display}` : '')};
|
||||||
|
&:hover {
|
||||||
|
${props => (props.onClick ? `color: ${props.hoverColor || darken(0.3, props.fontColor || 'black')}` : '')};
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
Text.defaultProps = {
|
||||||
|
fontFamily: 'Roboto',
|
||||||
|
fontStyle: 'normal',
|
||||||
|
fontWeight: 400,
|
||||||
|
fontColor: colors.black,
|
||||||
|
fontSize: '15px',
|
||||||
|
lineHeight: '1.5em',
|
||||||
|
textDecorationLine: 'none',
|
||||||
|
Tag: 'div',
|
||||||
|
noWrap: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
Text.displayName = 'Text';
|
||||||
|
|
||||||
|
export const Title: React.StatelessComponent<TextProps> = props => <Text {...props} />;
|
||||||
|
|
||||||
|
Title.defaultProps = {
|
||||||
|
Tag: 'h2',
|
||||||
|
fontSize: '20px',
|
||||||
|
fontWeight: 600,
|
||||||
|
fontColor: colors.black,
|
||||||
|
};
|
||||||
|
|
||||||
|
Title.displayName = 'Title';
|
9
packages/dev-tools-pages/ts/globals.d.ts
vendored
Normal file
9
packages/dev-tools-pages/ts/globals.d.ts
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
declare module 'whatwg-fetch';
|
||||||
|
declare module 'react-document-title';
|
||||||
|
|
||||||
|
declare module '*.json' {
|
||||||
|
const json: any;
|
||||||
|
/* tslint:disable */
|
||||||
|
export default json;
|
||||||
|
/* tslint:enable */
|
||||||
|
}
|
17
packages/dev-tools-pages/ts/index.tsx
Normal file
17
packages/dev-tools-pages/ts/index.tsx
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { render } from 'react-dom';
|
||||||
|
import { MetaTags } from 'ts/components/meta_tags';
|
||||||
|
import { Landing } from 'ts/pages/landing';
|
||||||
|
|
||||||
|
import 'basscss/css/basscss.css';
|
||||||
|
|
||||||
|
const DOCUMENT_TITLE = '';
|
||||||
|
const DOCUMENT_DESCRIPTION = '';
|
||||||
|
|
||||||
|
render(
|
||||||
|
<div>
|
||||||
|
<MetaTags title={DOCUMENT_TITLE} description={DOCUMENT_DESCRIPTION} />
|
||||||
|
<Landing />
|
||||||
|
</div>,
|
||||||
|
document.getElementById('app'),
|
||||||
|
);
|
27
packages/dev-tools-pages/ts/pages/landing.tsx
Normal file
27
packages/dev-tools-pages/ts/pages/landing.tsx
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import * as _ from 'lodash';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { Button } from '../components/ui/button';
|
||||||
|
import { Container } from '../components/ui/container';
|
||||||
|
import { Text } from '../components/ui/text';
|
||||||
|
|
||||||
|
interface LandingProps {}
|
||||||
|
|
||||||
|
interface LandingState {}
|
||||||
|
|
||||||
|
export class Landing extends React.Component<LandingProps, LandingState> {
|
||||||
|
constructor(props: LandingProps) {
|
||||||
|
super(props);
|
||||||
|
}
|
||||||
|
public render(): React.ReactNode {
|
||||||
|
return (
|
||||||
|
<Container id="landing" className="clearfix">
|
||||||
|
<Container className="mx-auto p4" width="200px">
|
||||||
|
<Button>
|
||||||
|
<Text fontColor="white">Click me!</Text>
|
||||||
|
</Button>
|
||||||
|
</Container>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
32
packages/dev-tools-pages/ts/utils/utils.ts
Normal file
32
packages/dev-tools-pages/ts/utils/utils.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import * as bowser from 'bowser';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
|
export const utils = {
|
||||||
|
getColSize(items: number): number {
|
||||||
|
const bassCssGridSize = 12; // Source: http://basscss.com/#basscss-grid
|
||||||
|
const colSize = bassCssGridSize / items;
|
||||||
|
if (!_.isInteger(colSize)) {
|
||||||
|
throw new Error(`Number of cols must be divisible by ${bassCssGridSize}`);
|
||||||
|
}
|
||||||
|
return colSize;
|
||||||
|
},
|
||||||
|
getCurrentBaseUrl(): string {
|
||||||
|
const port = window.location.port;
|
||||||
|
const hasPort = !_.isUndefined(port);
|
||||||
|
const baseUrl = `https://${window.location.hostname}${hasPort ? `:${port}` : ''}`;
|
||||||
|
return baseUrl;
|
||||||
|
},
|
||||||
|
onPageLoadPromise: new Promise<void>((resolve, _reject) => {
|
||||||
|
if (document.readyState === 'complete') {
|
||||||
|
resolve();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.onload = () => resolve();
|
||||||
|
}),
|
||||||
|
openUrl(url: string): void {
|
||||||
|
window.open(url, '_blank');
|
||||||
|
},
|
||||||
|
isMobileOperatingSystem(): boolean {
|
||||||
|
return bowser.mobile;
|
||||||
|
},
|
||||||
|
};
|
22
packages/dev-tools-pages/tsconfig.json
Normal file
22
packages/dev-tools-pages/tsconfig.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"outDir": "./transpiled/",
|
||||||
|
"jsx": "react",
|
||||||
|
"baseUrl": "./",
|
||||||
|
"allowJs": true,
|
||||||
|
"strictNullChecks": false,
|
||||||
|
"noImplicitThis": false,
|
||||||
|
// tsconfig.json at the monorepo root contains some options required for
|
||||||
|
// project references which do not work for website. We override those
|
||||||
|
// options here.
|
||||||
|
"declaration": false,
|
||||||
|
"declarationMap": false,
|
||||||
|
"composite": false,
|
||||||
|
"paths": {
|
||||||
|
"*": ["node_modules/@types/*", "*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["./ts/**/*"]
|
||||||
|
}
|
10
packages/dev-tools-pages/tslint.json
Normal file
10
packages/dev-tools-pages/tslint.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extends": ["@0xproject/tslint-config"],
|
||||||
|
"rules": {
|
||||||
|
"no-implicit-dependencies": false,
|
||||||
|
"no-object-literal-type-assertion": false,
|
||||||
|
"completed-docs": false,
|
||||||
|
"prefer-function-over-method": false,
|
||||||
|
"custom-no-magic-numbers": false
|
||||||
|
}
|
||||||
|
}
|
86
packages/dev-tools-pages/webpack.config.js
Normal file
86
packages/dev-tools-pages/webpack.config.js
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const TerserPlugin = require('terser-webpack-plugin');
|
||||||
|
const childProcess = require('child_process');
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
entry: ['./ts/index.tsx'],
|
||||||
|
output: {
|
||||||
|
path: path.join(__dirname, '/public'),
|
||||||
|
filename: 'bundle.js',
|
||||||
|
chunkFilename: 'bundle-[name].js',
|
||||||
|
publicPath: '/',
|
||||||
|
},
|
||||||
|
devtool: 'source-map',
|
||||||
|
resolve: {
|
||||||
|
modules: [path.join(__dirname, '/ts'), 'node_modules'],
|
||||||
|
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
|
||||||
|
alias: {
|
||||||
|
ts: path.join(__dirname, '/ts'),
|
||||||
|
less: path.join(__dirname, '/less'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
loader: 'source-map-loader',
|
||||||
|
exclude: [
|
||||||
|
// instead of /\/node_modules\//
|
||||||
|
path.join(process.cwd(), 'node_modules'),
|
||||||
|
path.join(process.cwd(), '../..', 'node_modules'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.tsx?$/,
|
||||||
|
loader: 'awesome-typescript-loader',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.md$/,
|
||||||
|
use: 'raw-loader',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.less$/,
|
||||||
|
loader: 'style-loader!css-loader!less-loader',
|
||||||
|
exclude: /node_modules/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
loaders: ['style-loader', 'css-loader'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
optimization: {
|
||||||
|
minimizer: [
|
||||||
|
new TerserPlugin({
|
||||||
|
sourceMap: true,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
devServer: {
|
||||||
|
port: 3572,
|
||||||
|
disableHostCheck: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = (_env, argv) => {
|
||||||
|
let plugins = [];
|
||||||
|
if (argv.mode === 'development') {
|
||||||
|
config.mode = 'development';
|
||||||
|
} else {
|
||||||
|
config.mode = 'production';
|
||||||
|
plugins = plugins.concat([
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.env': {
|
||||||
|
NODE_ENV: JSON.stringify(process.env.NODE_ENV),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
console.log('i 「atl」: Mode: ', config.mode);
|
||||||
|
|
||||||
|
config.plugins = plugins;
|
||||||
|
console.log('i 「atl」: Plugin Count: ', config.plugins.length);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "2.1.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added getStats function and returns a Stats object",
|
||||||
|
"pr": 1118
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@ -7,6 +7,7 @@ export {
|
|||||||
OrderState,
|
OrderState,
|
||||||
ExchangeContractErrs,
|
ExchangeContractErrs,
|
||||||
OrderRelevantState,
|
OrderRelevantState,
|
||||||
|
Stats,
|
||||||
} from '@0xproject/types';
|
} from '@0xproject/types';
|
||||||
|
|
||||||
export { OnOrderStateChangeCallback, OrderWatcherConfig } from './types';
|
export { OnOrderStateChangeCallback, OrderWatcherConfig } from './types';
|
||||||
|
@ -30,7 +30,7 @@ import {
|
|||||||
orderHashUtils,
|
orderHashUtils,
|
||||||
OrderStateUtils,
|
OrderStateUtils,
|
||||||
} from '@0xproject/order-utils';
|
} from '@0xproject/order-utils';
|
||||||
import { AssetProxyId, ExchangeContractErrs, OrderState, SignedOrder } from '@0xproject/types';
|
import { AssetProxyId, ExchangeContractErrs, OrderState, SignedOrder, Stats } from '@0xproject/types';
|
||||||
import { errorUtils, intervalUtils } from '@0xproject/utils';
|
import { errorUtils, intervalUtils } from '@0xproject/utils';
|
||||||
import { BlockParamLiteral, LogEntryEvent, LogWithDecodedArgs, Provider } from 'ethereum-types';
|
import { BlockParamLiteral, LogEntryEvent, LogWithDecodedArgs, Provider } from 'ethereum-types';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@ -213,6 +213,14 @@ export class OrderWatcher {
|
|||||||
this._expirationWatcher.unsubscribe();
|
this._expirationWatcher.unsubscribe();
|
||||||
intervalUtils.clearAsyncExcludingInterval(this._cleanupJobIntervalIdIfExists);
|
intervalUtils.clearAsyncExcludingInterval(this._cleanupJobIntervalIdIfExists);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Gets statistics of the OrderWatcher Instance.
|
||||||
|
*/
|
||||||
|
public getStats(): Stats {
|
||||||
|
return {
|
||||||
|
orderCount: _.size(this._orderByOrderHash),
|
||||||
|
};
|
||||||
|
}
|
||||||
private async _cleanupAsync(): Promise<void> {
|
private async _cleanupAsync(): Promise<void> {
|
||||||
for (const orderHash of _.keys(this._orderByOrderHash)) {
|
for (const orderHash of _.keys(this._orderByOrderHash)) {
|
||||||
this._cleanupOrderRelatedState(orderHash);
|
this._cleanupOrderRelatedState(orderHash);
|
||||||
|
@ -140,6 +140,23 @@ describe('OrderWatcher', () => {
|
|||||||
expect(() => orderWatcher.subscribe(_.noop.bind(_))).to.throw(OrderWatcherError.SubscriptionAlreadyPresent);
|
expect(() => orderWatcher.subscribe(_.noop.bind(_))).to.throw(OrderWatcherError.SubscriptionAlreadyPresent);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('#getStats', async () => {
|
||||||
|
it('orderCount should increment and decrement with order additions and removals', async () => {
|
||||||
|
signedOrder = await fillScenarios.createFillableSignedOrderAsync(
|
||||||
|
makerAssetData,
|
||||||
|
takerAssetData,
|
||||||
|
makerAddress,
|
||||||
|
takerAddress,
|
||||||
|
fillableAmount,
|
||||||
|
);
|
||||||
|
const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||||
|
expect(orderWatcher.getStats().orderCount).to.be.eq(0);
|
||||||
|
await orderWatcher.addOrderAsync(signedOrder);
|
||||||
|
expect(orderWatcher.getStats().orderCount).to.be.eq(1);
|
||||||
|
orderWatcher.removeOrder(orderHash);
|
||||||
|
expect(orderWatcher.getStats().orderCount).to.be.eq(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
describe('tests with cleanup', async () => {
|
describe('tests with cleanup', async () => {
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
orderWatcher.unsubscribe();
|
orderWatcher.unsubscribe();
|
||||||
|
@ -622,3 +622,7 @@ export interface EIP712TypedData {
|
|||||||
message: EIP712Object;
|
message: EIP712Object;
|
||||||
primaryType: string;
|
primaryType: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface Stats {
|
||||||
|
orderCount: number;
|
||||||
|
}
|
||||||
|
@ -59,6 +59,7 @@
|
|||||||
"react-typist": "^2.0.4",
|
"react-typist": "^2.0.4",
|
||||||
"redux": "^3.6.0",
|
"redux": "^3.6.0",
|
||||||
"redux-devtools-extension": "^2.13.2",
|
"redux-devtools-extension": "^2.13.2",
|
||||||
|
"rollbar": "^2.4.7",
|
||||||
"semver-sort": "0.0.4",
|
"semver-sort": "0.0.4",
|
||||||
"styled-components": "^3.3.0",
|
"styled-components": "^3.3.0",
|
||||||
"thenby": "^1.2.3",
|
"thenby": "^1.2.3",
|
||||||
|
BIN
packages/website/public/images/team/steve.png
Normal file
BIN
packages/website/public/images/team/steve.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
@ -240,6 +240,16 @@ const teamRow8: ProfileInfo[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const teamRow9: ProfileInfo[] = [
|
||||||
|
{
|
||||||
|
name: 'Steve Klebanoff',
|
||||||
|
title: 'Senior Engineer',
|
||||||
|
description: ` Full-stack engineer. Previously Staff Software Engineer at Appfolio. Computer Science & Cognitive Psychology at Northeastern University.`,
|
||||||
|
image: 'images/team/steve.png',
|
||||||
|
linkedIn: 'https://www.linkedin.com/in/steveklebanoff/',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const advisors1: ProfileInfo[] = [
|
const advisors1: ProfileInfo[] = [
|
||||||
{
|
{
|
||||||
name: 'Fred Ehrsam',
|
name: 'Fred Ehrsam',
|
||||||
@ -348,6 +358,7 @@ export class About extends React.Component<AboutProps, AboutState> {
|
|||||||
<div className="clearfix">{this._renderProfiles(teamRow6)}</div>
|
<div className="clearfix">{this._renderProfiles(teamRow6)}</div>
|
||||||
<div className="clearfix">{this._renderProfiles(teamRow7)}</div>
|
<div className="clearfix">{this._renderProfiles(teamRow7)}</div>
|
||||||
<div className="clearfix">{this._renderProfiles(teamRow8)}</div>
|
<div className="clearfix">{this._renderProfiles(teamRow8)}</div>
|
||||||
|
<div className="clearfix">{this._renderProfiles(teamRow9)}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="pt3 pb2">
|
<div className="pt3 pb2">
|
||||||
<div
|
<div
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { logUtils } from '@0xproject/utils';
|
import { logUtils } from '@0xproject/utils';
|
||||||
|
import Rollbar = require('rollbar');
|
||||||
import { configs } from 'ts/utils/configs';
|
import { configs } from 'ts/utils/configs';
|
||||||
import { constants } from 'ts/utils/constants';
|
import { constants } from 'ts/utils/constants';
|
||||||
import { utils } from 'ts/utils/utils';
|
import { utils } from 'ts/utils/utils';
|
||||||
@ -36,8 +37,8 @@ const rollbarConfig = {
|
|||||||
'SecurityError (DOM Exception 18)',
|
'SecurityError (DOM Exception 18)',
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
import Rollbar = require('../../public/js/rollbar.umd.min.js');
|
|
||||||
const rollbar = Rollbar.init(rollbarConfig);
|
const rollbar = new Rollbar(rollbarConfig);
|
||||||
|
|
||||||
export const errorReporter = {
|
export const errorReporter = {
|
||||||
report(err: Error): void {
|
report(err: Error): void {
|
||||||
|
17
python-packages/order_utils/package.json
Normal file
17
python-packages/order_utils/package.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"comment": "this file exists as an entry point to building this project, specifically for humans that are familiar with yarn and already have it installed. this file is not used in any automation or CI.",
|
||||||
|
"scripts": {
|
||||||
|
"install": "pip install -e .[dev]",
|
||||||
|
"build": "python setup.py build && yarn build:docs",
|
||||||
|
"build:docs": "python setup.py build_sphinx && sphinx-apidoc -o build/docs/api src",
|
||||||
|
"test:comment": "test in local environment. to test in all environments, use test:all",
|
||||||
|
"test": "python setup.py test",
|
||||||
|
"test:all": "tox",
|
||||||
|
"test:coverage": "coverage run setup.py test && coveralls",
|
||||||
|
"lint": "python setup.py lint",
|
||||||
|
"clean": "python setup.py clean"
|
||||||
|
},
|
||||||
|
"dependencies:comment": "managed in setup.py",
|
||||||
|
"devDependencies:comment": "managed in setup.py",
|
||||||
|
"license": "Apache-2.0"
|
||||||
|
}
|
128
python-packages/order_utils/setup.py
Normal file
128
python-packages/order_utils/setup.py
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
"""setuptools module for order_utils package."""
|
||||||
|
|
||||||
|
import subprocess # nosec
|
||||||
|
from shutil import rmtree
|
||||||
|
from os import path, remove, walk
|
||||||
|
|
||||||
|
from distutils.command.clean import clean # type: ignore
|
||||||
|
from setuptools import setup # type: ignore
|
||||||
|
import setuptools.command.build_py # type: ignore
|
||||||
|
from setuptools.command.test import test as TestCommand # type: ignore
|
||||||
|
|
||||||
|
|
||||||
|
class TestCommandExtension(TestCommand):
|
||||||
|
"""Run pytest tests."""
|
||||||
|
|
||||||
|
def run_tests(self):
|
||||||
|
"""Invoke pytest."""
|
||||||
|
import pytest # type: ignore
|
||||||
|
|
||||||
|
pytest.main()
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=too-many-ancestors
|
||||||
|
class LintCommand(setuptools.command.build_py.build_py):
|
||||||
|
"""Custom setuptools command class for running linters."""
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Run linter shell commands."""
|
||||||
|
lint_commands = [
|
||||||
|
# formatter:
|
||||||
|
"black --line-length 79 --check --diff src test setup.py".split(),
|
||||||
|
# style guide checker (formerly pep8):
|
||||||
|
"pycodestyle src test setup.py".split(),
|
||||||
|
# docstring style checker:
|
||||||
|
"pydocstyle src test setup.py".split(),
|
||||||
|
# static type checker:
|
||||||
|
"mypy src setup.py".split(),
|
||||||
|
# security issue checker:
|
||||||
|
"bandit -r src ./setup.py".split(),
|
||||||
|
# general linter:
|
||||||
|
"pylint src test setup.py".split(),
|
||||||
|
# pylint takes relatively long to run, so it runs last, to enable
|
||||||
|
# fast failures.
|
||||||
|
]
|
||||||
|
for lint_command in lint_commands:
|
||||||
|
print(
|
||||||
|
"Running lint command `", " ".join(lint_command).strip(), "`"
|
||||||
|
)
|
||||||
|
subprocess.check_call(lint_command) # nosec
|
||||||
|
|
||||||
|
|
||||||
|
class CleanCommandExtension(clean):
|
||||||
|
"""Custom command to do custom cleanup."""
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Run the regular clean, followed by our custom commands."""
|
||||||
|
super().run()
|
||||||
|
rmtree("build", ignore_errors=True)
|
||||||
|
rmtree(".mypy_cache", ignore_errors=True)
|
||||||
|
rmtree(".tox", ignore_errors=True)
|
||||||
|
rmtree(".pytest_cache", ignore_errors=True)
|
||||||
|
rmtree("src/order_utils.egg-info", ignore_errors=True)
|
||||||
|
# delete all .pyc files
|
||||||
|
for root, _, files in walk("."):
|
||||||
|
for file in files:
|
||||||
|
(_, extension) = path.splitext(file)
|
||||||
|
if extension == ".pyc":
|
||||||
|
remove(path.join(root, file))
|
||||||
|
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name="order_utils",
|
||||||
|
version="1.0.0",
|
||||||
|
description="Order utilities for 0x applications",
|
||||||
|
author="F. Eugene Aumson",
|
||||||
|
cmdclass={
|
||||||
|
"clean": CleanCommandExtension,
|
||||||
|
"lint": LintCommand,
|
||||||
|
"test": TestCommandExtension,
|
||||||
|
},
|
||||||
|
include_package_data=True,
|
||||||
|
install_requires=["web3"],
|
||||||
|
extras_require={
|
||||||
|
"dev": [
|
||||||
|
"bandit",
|
||||||
|
"black",
|
||||||
|
"coverage",
|
||||||
|
"coveralls",
|
||||||
|
"mypy",
|
||||||
|
"pycodestyle",
|
||||||
|
"pydocstyle",
|
||||||
|
"pylint",
|
||||||
|
"pytest",
|
||||||
|
"sphinx",
|
||||||
|
"tox",
|
||||||
|
]
|
||||||
|
},
|
||||||
|
python_requires=">=3.6, <4",
|
||||||
|
package_data={"zero_ex.order_utils": ["py.typed"]},
|
||||||
|
package_dir={"": "src"},
|
||||||
|
license="Apache 2.0",
|
||||||
|
keywords=(
|
||||||
|
"ethereum cryptocurrency 0x decentralized blockchain dex exchange"
|
||||||
|
),
|
||||||
|
packages=["zero_ex.order_utils"],
|
||||||
|
classifiers=[
|
||||||
|
"Development Status :: 1 - Planning",
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"Intended Audience :: Financial and Insurance Industry",
|
||||||
|
"License :: OSI Approved :: Apache Software License",
|
||||||
|
"Natural Language :: English",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python",
|
||||||
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
|
"Programming Language :: Python :: 3.6",
|
||||||
|
"Programming Language :: Python :: 3.7",
|
||||||
|
"Topic :: Office/Business :: Financial",
|
||||||
|
"Topic :: Software Development :: Libraries",
|
||||||
|
"Topic :: Utilities",
|
||||||
|
],
|
||||||
|
zip_safe=False,
|
||||||
|
command_options={
|
||||||
|
"build_sphinx": {
|
||||||
|
"source_dir": ("setup.py", "src"),
|
||||||
|
"build_dir": ("setup.py", "build/docs"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
50
python-packages/order_utils/src/conf.py
Normal file
50
python-packages/order_utils/src/conf.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
"""Configuration file for the Sphinx documentation builder."""
|
||||||
|
|
||||||
|
# Reference: http://www.sphinx-doc.org/en/master/config
|
||||||
|
|
||||||
|
# pylint: disable=invalid-name
|
||||||
|
# because these variables are not named in upper case, as globals should be.
|
||||||
|
|
||||||
|
project = "order_utils.py"
|
||||||
|
# pylint: disable=redefined-builtin
|
||||||
|
copyright = "2018, ZeroEx, Intl."
|
||||||
|
author = "F. Eugene Aumson"
|
||||||
|
version = "" # The short X.Y version
|
||||||
|
release = "" # The full version, including alpha/beta/rc tags
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
"sphinx.ext.autodoc",
|
||||||
|
"sphinx.ext.doctest",
|
||||||
|
"sphinx.ext.intersphinx",
|
||||||
|
"sphinx.ext.coverage",
|
||||||
|
"sphinx.ext.viewcode",
|
||||||
|
]
|
||||||
|
|
||||||
|
templates_path = ["doc_templates"]
|
||||||
|
|
||||||
|
source_suffix = ".rst"
|
||||||
|
# eg: source_suffix = [".rst", ".md"]
|
||||||
|
|
||||||
|
master_doc = "index" # The master toctree document.
|
||||||
|
|
||||||
|
language = None
|
||||||
|
|
||||||
|
exclude_patterns = [] # type: ignore
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = None
|
||||||
|
|
||||||
|
html_theme = "alabaster"
|
||||||
|
|
||||||
|
html_static_path = ["doc_static"]
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = "order_utilspydoc"
|
||||||
|
|
||||||
|
# -- Extension configuration:
|
||||||
|
|
||||||
|
# Example configuration for intersphinx: refer to the Python standard library.
|
||||||
|
intersphinx_mapping = {"https://docs.python.org/": None}
|
22
python-packages/order_utils/src/index.rst
Normal file
22
python-packages/order_utils/src/index.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.. source for the sphinx-generated build/docs/web/index.html
|
||||||
|
|
||||||
|
order_utils.py
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Contents:
|
||||||
|
|
||||||
|
.. automodule:: zero_ex.order_utils
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: zero_ex.order_utils.signature_utils
|
||||||
|
:members:
|
||||||
|
|
||||||
|
|
||||||
|
Indices and tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`modindex`
|
||||||
|
* :ref:`search`
|
1
python-packages/order_utils/src/zero_ex/__init__.py
Normal file
1
python-packages/order_utils/src/zero_ex/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""0x Python API."""
|
@ -0,0 +1 @@
|
|||||||
|
"""Order utilities for 0x applications."""
|
@ -0,0 +1,13 @@
|
|||||||
|
"""Signature utilities."""
|
||||||
|
|
||||||
|
|
||||||
|
def ec_sign_order_hash():
|
||||||
|
"""Signs an orderHash.
|
||||||
|
|
||||||
|
Returns its elliptic curve signature and signature type. This method
|
||||||
|
currently supports TestRPC, Geth, and Parity above and below v1.6.6.
|
||||||
|
|
||||||
|
>>> ec_sign_order_hash()
|
||||||
|
'stub return value'
|
||||||
|
"""
|
||||||
|
return "stub return value"
|
0
python-packages/order_utils/src/zero_ex/py.typed
Normal file
0
python-packages/order_utils/src/zero_ex/py.typed
Normal file
1
python-packages/order_utils/test/__init__.py
Normal file
1
python-packages/order_utils/test/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""Tests of zero_x.order_utils."""
|
10
python-packages/order_utils/test/test_doctest.py
Normal file
10
python-packages/order_utils/test/test_doctest.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
"""Exercise doctests for order_utils module."""
|
||||||
|
|
||||||
|
from doctest import testmod
|
||||||
|
from zero_ex.order_utils import signature_utils
|
||||||
|
|
||||||
|
|
||||||
|
def test_doctest():
|
||||||
|
"""Invoke doctest on the module."""
|
||||||
|
(failure_count, _) = testmod(signature_utils)
|
||||||
|
assert failure_count == 0
|
8
python-packages/order_utils/test/test_signature_utils.py
Normal file
8
python-packages/order_utils/test/test_signature_utils.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
"""Tests of 0x.order_utils.signature_utils.*."""
|
||||||
|
|
||||||
|
from zero_ex.order_utils.signature_utils import ec_sign_order_hash
|
||||||
|
|
||||||
|
|
||||||
|
def test_ec_sign_order_hash():
|
||||||
|
"""Test the signing of order hashes."""
|
||||||
|
assert ec_sign_order_hash() == "stub return value"
|
12
python-packages/order_utils/tox.ini
Normal file
12
python-packages/order_utils/tox.ini
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# tox (https://tox.readthedocs.io/) is a tool for running tests
|
||||||
|
# in multiple virtualenvs. This configuration file will run the
|
||||||
|
# test suite on all supported python versions. To use it, "pip install tox"
|
||||||
|
# and then run "tox" from this directory.
|
||||||
|
|
||||||
|
[tox]
|
||||||
|
envlist = py37
|
||||||
|
|
||||||
|
[testenv]
|
||||||
|
commands =
|
||||||
|
pip install -e .[dev]
|
||||||
|
python setup.py test
|
89
yarn.lock
89
yarn.lock
@ -1302,6 +1302,13 @@
|
|||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.npmjs.org/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.1.tgz#29ff386773a72a06c8a9c40c666d2a1cea53c2ed"
|
resolved "https://registry.npmjs.org/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.1.tgz#29ff386773a72a06c8a9c40c666d2a1cea53c2ed"
|
||||||
|
|
||||||
|
"@types/styled-components@^4.0.0":
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-4.0.0.tgz#33b47071885003878a62689e0883aa2fc59f970a"
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
|
||||||
"@types/tmp@^0.0.33":
|
"@types/tmp@^0.0.33":
|
||||||
version "0.0.33"
|
version "0.0.33"
|
||||||
resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
|
resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
|
||||||
@ -1585,10 +1592,6 @@ aes-js@^0.2.3:
|
|||||||
version "0.2.4"
|
version "0.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-0.2.4.tgz#94b881ab717286d015fa219e08fb66709dda5a3d"
|
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-0.2.4.tgz#94b881ab717286d015fa219e08fb66709dda5a3d"
|
||||||
|
|
||||||
aes-js@^3.1.1:
|
|
||||||
version "3.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.1.tgz#89fd1f94ae51b4c72d62466adc1a7323ff52f072"
|
|
||||||
|
|
||||||
ajv-errors@^1.0.0:
|
ajv-errors@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
|
resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
|
||||||
@ -2989,7 +2992,7 @@ bs-logger@0.x:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fast-json-stable-stringify "^2.0.0"
|
fast-json-stable-stringify "^2.0.0"
|
||||||
|
|
||||||
bs58@=4.0.1, bs58@^4.0.0:
|
bs58@=4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
|
resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -3012,14 +3015,6 @@ bs58check@^1.0.8:
|
|||||||
bs58 "^3.1.0"
|
bs58 "^3.1.0"
|
||||||
create-hash "^1.1.0"
|
create-hash "^1.1.0"
|
||||||
|
|
||||||
bs58check@^2.1.2:
|
|
||||||
version "2.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
|
|
||||||
dependencies:
|
|
||||||
bs58 "^4.0.0"
|
|
||||||
create-hash "^1.1.0"
|
|
||||||
safe-buffer "^5.1.2"
|
|
||||||
|
|
||||||
bser@^2.0.0:
|
bser@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
|
resolved "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
|
||||||
@ -3872,6 +3867,10 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
|
|||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
|
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
|
||||||
|
|
||||||
|
console-polyfill@0.3.0:
|
||||||
|
version "0.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861"
|
||||||
|
|
||||||
constant-case@^2.0.0:
|
constant-case@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46"
|
resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46"
|
||||||
@ -5067,6 +5066,12 @@ error-ex@^1.2.0, error-ex@^1.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.2.1"
|
is-arrayish "^0.2.1"
|
||||||
|
|
||||||
|
error-stack-parser@1.3.3:
|
||||||
|
version "1.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-1.3.3.tgz#fada6e3a9cd2b0e080e6d6fc751418649734f35c"
|
||||||
|
dependencies:
|
||||||
|
stackframe "^0.3.1"
|
||||||
|
|
||||||
es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1:
|
es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1:
|
||||||
version "1.12.0"
|
version "1.12.0"
|
||||||
resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
|
resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
|
||||||
@ -5574,19 +5579,6 @@ ethereumjs-wallet@0.6.0:
|
|||||||
utf8 "^2.1.1"
|
utf8 "^2.1.1"
|
||||||
uuid "^2.0.1"
|
uuid "^2.0.1"
|
||||||
|
|
||||||
ethereumjs-wallet@~0.6.0:
|
|
||||||
version "0.6.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.2.tgz#67244b6af3e8113b53d709124b25477b64aeccda"
|
|
||||||
dependencies:
|
|
||||||
aes-js "^3.1.1"
|
|
||||||
bs58check "^2.1.2"
|
|
||||||
ethereumjs-util "^5.2.0"
|
|
||||||
hdkey "^1.0.0"
|
|
||||||
safe-buffer "^5.1.2"
|
|
||||||
scrypt.js "^0.2.0"
|
|
||||||
utf8 "^3.0.0"
|
|
||||||
uuid "^3.3.2"
|
|
||||||
|
|
||||||
ethers@3.0.22:
|
ethers@3.0.22:
|
||||||
version "3.0.22"
|
version "3.0.22"
|
||||||
resolved "https://registry.yarnpkg.com/ethers/-/ethers-3.0.22.tgz#7fab1ea16521705837aa43c15831877b2716b436"
|
resolved "https://registry.yarnpkg.com/ethers/-/ethers-3.0.22.tgz#7fab1ea16521705837aa43c15831877b2716b436"
|
||||||
@ -6409,7 +6401,7 @@ ganache-core@0xProject/ganache-core#monorepo-dep:
|
|||||||
ethereumjs-tx "0xProject/ethereumjs-tx#fake-tx-include-signature-by-default"
|
ethereumjs-tx "0xProject/ethereumjs-tx#fake-tx-include-signature-by-default"
|
||||||
ethereumjs-util "^5.2.0"
|
ethereumjs-util "^5.2.0"
|
||||||
ethereumjs-vm "2.3.5"
|
ethereumjs-vm "2.3.5"
|
||||||
ethereumjs-wallet "~0.6.0"
|
ethereumjs-wallet "0.6.0"
|
||||||
fake-merkle-patricia-tree "~1.0.1"
|
fake-merkle-patricia-tree "~1.0.1"
|
||||||
heap "~0.2.6"
|
heap "~0.2.6"
|
||||||
js-scrypt "^0.2.0"
|
js-scrypt "^0.2.0"
|
||||||
@ -7096,14 +7088,6 @@ hdkey@^0.7.0, hdkey@^0.7.1:
|
|||||||
coinstring "^2.0.0"
|
coinstring "^2.0.0"
|
||||||
secp256k1 "^3.0.1"
|
secp256k1 "^3.0.1"
|
||||||
|
|
||||||
hdkey@^1.0.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.0.tgz#e74e7b01d2c47f797fa65d1d839adb7a44639f29"
|
|
||||||
dependencies:
|
|
||||||
coinstring "^2.0.0"
|
|
||||||
safe-buffer "^5.1.1"
|
|
||||||
secp256k1 "^3.0.1"
|
|
||||||
|
|
||||||
he@1.1.1:
|
he@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
||||||
@ -7977,6 +7961,10 @@ is-wsl@^1.1.0:
|
|||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
|
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
|
||||||
|
|
||||||
|
is_js@^0.9.0:
|
||||||
|
version "0.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is_js/-/is_js-0.9.0.tgz#0ab94540502ba7afa24c856aa985561669e9c52d"
|
||||||
|
|
||||||
isarray@0.0.1:
|
isarray@0.0.1:
|
||||||
version "0.0.1"
|
version "0.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
|
||||||
@ -12682,6 +12670,12 @@ request-ip@~1.2.3:
|
|||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-1.2.3.tgz#66988f0e22406ec4af630d19b573fe4b447c3b49"
|
resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-1.2.3.tgz#66988f0e22406ec4af630d19b573fe4b447c3b49"
|
||||||
|
|
||||||
|
request-ip@~2.0.1:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-2.0.2.tgz#deeae6d4af21768497db8cd05fa37143f8f1257e"
|
||||||
|
dependencies:
|
||||||
|
is_js "^0.9.0"
|
||||||
|
|
||||||
request-promise-core@1.1.1:
|
request-promise-core@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
|
resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
|
||||||
@ -12978,6 +12972,21 @@ rollbar@^0.6.5:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
decache "^3.0.5"
|
decache "^3.0.5"
|
||||||
|
|
||||||
|
rollbar@^2.4.7:
|
||||||
|
version "2.4.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-2.4.7.tgz#9b1de1a0fab6b6e63fcfcd322c26081a1d8242e8"
|
||||||
|
dependencies:
|
||||||
|
async "~1.2.1"
|
||||||
|
console-polyfill "0.3.0"
|
||||||
|
debug "2.6.9"
|
||||||
|
error-stack-parser "1.3.3"
|
||||||
|
json-stringify-safe "~5.0.0"
|
||||||
|
lru-cache "~2.2.1"
|
||||||
|
request-ip "~2.0.1"
|
||||||
|
uuid "3.0.x"
|
||||||
|
optionalDependencies:
|
||||||
|
decache "^3.0.5"
|
||||||
|
|
||||||
rst-selector-parser@^2.2.3:
|
rst-selector-parser@^2.2.3:
|
||||||
version "2.2.3"
|
version "2.2.3"
|
||||||
resolved "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
|
resolved "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
|
||||||
@ -13832,6 +13841,10 @@ stack-utils@^1.0.1:
|
|||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
|
resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
|
||||||
|
|
||||||
|
stackframe@^0.3.1:
|
||||||
|
version "0.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4"
|
||||||
|
|
||||||
state-toggle@^1.0.0:
|
state-toggle@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425"
|
resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425"
|
||||||
@ -15218,10 +15231,6 @@ utf8@^2.1.1:
|
|||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96"
|
resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96"
|
||||||
|
|
||||||
utf8@^3.0.0:
|
|
||||||
version "3.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
|
|
||||||
|
|
||||||
util-deprecate@~1.0.1:
|
util-deprecate@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||||
@ -15258,7 +15267,7 @@ uuid@2.0.1:
|
|||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac"
|
||||||
|
|
||||||
uuid@3.0.1, uuid@~3.0.0:
|
uuid@3.0.1, uuid@3.0.x, uuid@~3.0.0:
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user