Compare commits
91 Commits
@0x/react-
...
@0x/react-
Author | SHA1 | Date | |
---|---|---|---|
|
fe1b7f15e8 | ||
|
3f647c259a | ||
|
06dcf24496 | ||
|
77c77631e1 | ||
|
b0e9f58033 | ||
|
4fc457b78b | ||
|
2f6b1273aa | ||
|
da9de70bbc | ||
|
b174a891bc | ||
|
bb79a5e324 | ||
|
9e0c232a73 | ||
|
e02dc13805 | ||
|
820ab062a6 | ||
|
7b4f63a39c | ||
|
3a3fe0e69a | ||
|
5c21d3f6af | ||
|
baba78f545 | ||
|
f03afe6f1b | ||
|
a824264da2 | ||
|
a66c03aa21 | ||
|
bed134c1da | ||
|
d36cf58b82 | ||
|
5527de62ff | ||
|
11f0bebd7f | ||
|
3fb29041b0 | ||
|
161a935003 | ||
|
e8afc66a5a | ||
|
49a9345bf4 | ||
|
d73faf1b81 | ||
|
0c6110b736 | ||
|
2da258f5be | ||
|
e9bf7206bd | ||
|
2b4dcb419e | ||
|
c67632dff5 | ||
|
01b36b4949 | ||
|
711b307e6c | ||
|
1ab19a7c23 | ||
|
7068f7b4d1 | ||
|
79f0324abc | ||
|
b82148ea60 | ||
|
add1cfd261 | ||
|
cdf78494d5 | ||
|
789f573452 | ||
|
22f217807d | ||
|
08797392e0 | ||
|
853c77dc09 | ||
|
a4a46dc076 | ||
|
0d565fe32f | ||
|
320460feb9 | ||
|
dbce3f8935 | ||
|
76b3caa124 | ||
|
0101cd73aa | ||
|
6ef628613e | ||
|
498be7ac41 | ||
|
0391f93490 | ||
|
399a7d5fec | ||
|
0d201173ef | ||
|
2d43f312c8 | ||
|
1ec8a4115f | ||
|
753b33aec5 | ||
|
7626d1d6fe | ||
|
a8a1ea92a6 | ||
|
ff027ee36a | ||
|
ba292ead45 | ||
|
5355f3c538 | ||
|
478330c12d | ||
|
b1376059d3 | ||
|
2bba01c664 | ||
|
433fb3597d | ||
|
7460f2796a | ||
|
7249cc7b49 | ||
|
b598827708 | ||
|
128abb39dd | ||
|
79a533940e | ||
|
3a51bd1e69 | ||
|
3f1f19e344 | ||
|
3aa831ad77 | ||
|
3fd667b3be | ||
|
fa7bd072d0 | ||
|
daa011f7cb | ||
|
239eada7d9 | ||
|
a50f0ca997 | ||
|
39ae21d693 | ||
|
fc138cd73d | ||
|
990d510d05 | ||
|
801004be66 | ||
|
81fb8d614f | ||
|
3e75daafa1 | ||
|
6696aa46ee | ||
|
14a9770d57 | ||
|
b8d2cc1221 |
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "2.0.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "2.0.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v2.0.4 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v2.0.3 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v2.0.2 - _November 12, 2018_
|
## v2.0.2 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "0x.js",
|
"name": "0x.js",
|
||||||
"version": "2.0.2",
|
"version": "2.0.4",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -42,11 +42,11 @@
|
|||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^1.0.15",
|
"@0x/abi-gen": "^1.0.16",
|
||||||
"@0x/abi-gen-wrappers": "^1.0.3",
|
"@0x/abi-gen-wrappers": "^1.0.5",
|
||||||
"@0x/contract-addresses": "^1.1.0",
|
"@0x/contract-addresses": "^1.1.0",
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/migrations": "^2.0.2",
|
"@0x/migrations": "^2.0.4",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
@@ -73,16 +73,16 @@
|
|||||||
"webpack": "^4.20.2"
|
"webpack": "^4.20.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/contract-wrappers": "^4.0.0",
|
"@0x/contract-wrappers": "^4.0.2",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/order-watcher": "^2.2.2",
|
"@0x/order-watcher": "^2.2.4",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"@types/web3-provider-engine": "^14.0.0",
|
"@types/web3-provider-engine": "^14.0.0",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethers": "~4.0.4",
|
"ethers": "~4.0.4",
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "1.0.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "1.0.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.5 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.0.4 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.0.3 - _November 12, 2018_
|
## v1.0.3 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/abi-gen-wrappers",
|
"name": "@0x/abi-gen-wrappers",
|
||||||
"version": "1.0.3",
|
"version": "1.0.5",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -30,17 +30,17 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen-wrappers/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen-wrappers/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^1.0.15",
|
"@0x/abi-gen": "^1.0.16",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethers": "~4.0.4",
|
"ethers": "~4.0.4",
|
||||||
"lodash": "^4.17.5",
|
"lodash": "^4.17.5",
|
||||||
"shx": "^0.2.2"
|
"shx": "^0.2.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^3.0.4"
|
"@0x/base-contract": "^3.0.6"
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "1.0.16",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "1.0.15",
|
"version": "1.0.15",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.16 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.0.15 - _November 9, 2018_
|
## v1.0.15 - _November 9, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/abi-gen",
|
"name": "@0x/abi-gen",
|
||||||
"version": "1.0.15",
|
"version": "1.0.16",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"chalk": "^2.3.0",
|
"chalk": "^2.3.0",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"glob": "^7.1.2",
|
"glob": "^7.1.2",
|
||||||
|
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "1.0.17",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "1.0.16",
|
"version": "1.0.16",
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.17 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.0.16 - _November 12, 2018_
|
## v1.0.16 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/assert",
|
"name": "@0x/assert",
|
||||||
"version": "1.0.16",
|
"version": "1.0.17",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -44,9 +44,9 @@
|
|||||||
"typescript": "3.0.1"
|
"typescript": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"lodash": "^4.17.5",
|
"lodash": "^4.17.5",
|
||||||
"valid-url": "^1.0.9"
|
"valid-url": "^1.0.9"
|
||||||
},
|
},
|
||||||
|
@@ -1,4 +1,23 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "3.0.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "update `getBuyQuoteAsync` to return eth spent on assets instead of per unit amount",
|
||||||
|
"pr": 1252
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1542208198
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "2.2.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v3.0.0 - _November 14, 2018_
|
||||||
|
|
||||||
|
* update `getBuyQuoteAsync` to return eth spent on assets instead of per unit amount (#1252)
|
||||||
|
|
||||||
|
## v2.2.2 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v2.2.1 - _November 12, 2018_
|
## v2.2.1 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/asset-buyer",
|
"name": "@0x/asset-buyer",
|
||||||
"version": "2.2.1",
|
"version": "3.0.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -36,16 +36,16 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/asset-buyer/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/asset-buyer/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/connect": "^3.0.4",
|
"@0x/connect": "^3.0.6",
|
||||||
"@0x/contract-wrappers": "^4.0.0",
|
"@0x/contract-wrappers": "^4.0.2",
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"lodash": "^4.17.10"
|
"lodash": "^4.17.10"
|
||||||
},
|
},
|
||||||
|
@@ -54,12 +54,12 @@ export interface BuyQuote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ethPerAssetPrice: The price of one unit of the desired asset in ETH
|
* assetEthAmount: The amount of eth required to pay for the requested asset.
|
||||||
* feeEthAmount: The amount of eth required to pay the affiliate fee.
|
* feeEthAmount: The amount of eth required to pay the affiliate fee.
|
||||||
* totalEthAmount: the total amount of eth required to complete the buy. (Filling orders, feeOrders, and paying affiliate fee)
|
* totalEthAmount: The total amount of eth required to complete the buy (filling orders, feeOrders, and paying affiliate fee).
|
||||||
*/
|
*/
|
||||||
export interface BuyQuoteInfo {
|
export interface BuyQuoteInfo {
|
||||||
ethPerAssetPrice: BigNumber;
|
assetEthAmount: BigNumber;
|
||||||
feeEthAmount: BigNumber;
|
feeEthAmount: BigNumber;
|
||||||
totalEthAmount: BigNumber;
|
totalEthAmount: BigNumber;
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,7 @@ export const assert = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
isValidBuyQuoteInfo(variableName: string, buyQuoteInfo: BuyQuoteInfo): void {
|
isValidBuyQuoteInfo(variableName: string, buyQuoteInfo: BuyQuoteInfo): void {
|
||||||
sharedAssert.isBigNumber(`${variableName}.ethPerAssetPrice`, buyQuoteInfo.ethPerAssetPrice);
|
sharedAssert.isBigNumber(`${variableName}.assetEthAmount`, buyQuoteInfo.assetEthAmount);
|
||||||
sharedAssert.isBigNumber(`${variableName}.feeEthAmount`, buyQuoteInfo.feeEthAmount);
|
sharedAssert.isBigNumber(`${variableName}.feeEthAmount`, buyQuoteInfo.feeEthAmount);
|
||||||
sharedAssert.isBigNumber(`${variableName}.totalEthAmount`, buyQuoteInfo.totalEthAmount);
|
sharedAssert.isBigNumber(`${variableName}.totalEthAmount`, buyQuoteInfo.totalEthAmount);
|
||||||
},
|
},
|
||||||
|
@@ -106,28 +106,28 @@ function calculateQuoteInfo(
|
|||||||
isMakerAssetZrxToken: boolean,
|
isMakerAssetZrxToken: boolean,
|
||||||
): BuyQuoteInfo {
|
): BuyQuoteInfo {
|
||||||
// find the total eth and zrx needed to buy assetAmount from the resultOrders from left to right
|
// find the total eth and zrx needed to buy assetAmount from the resultOrders from left to right
|
||||||
let ethAmountToBuyAsset = constants.ZERO_AMOUNT;
|
let assetEthAmount = constants.ZERO_AMOUNT;
|
||||||
let ethAmountToBuyZrx = constants.ZERO_AMOUNT;
|
let zrxEthAmount = constants.ZERO_AMOUNT;
|
||||||
if (isMakerAssetZrxToken) {
|
if (isMakerAssetZrxToken) {
|
||||||
ethAmountToBuyAsset = findEthAmountNeededToBuyZrx(ordersAndFillableAmounts, assetBuyAmount);
|
assetEthAmount = findEthAmountNeededToBuyZrx(ordersAndFillableAmounts, assetBuyAmount);
|
||||||
} else {
|
} else {
|
||||||
// find eth and zrx amounts needed to buy
|
// find eth and zrx amounts needed to buy
|
||||||
const ethAndZrxAmountToBuyAsset = findEthAndZrxAmountNeededToBuyAsset(ordersAndFillableAmounts, assetBuyAmount);
|
const ethAndZrxAmountToBuyAsset = findEthAndZrxAmountNeededToBuyAsset(ordersAndFillableAmounts, assetBuyAmount);
|
||||||
ethAmountToBuyAsset = ethAndZrxAmountToBuyAsset[0];
|
assetEthAmount = ethAndZrxAmountToBuyAsset[0];
|
||||||
const zrxAmountToBuyAsset = ethAndZrxAmountToBuyAsset[1];
|
const zrxAmountToBuyAsset = ethAndZrxAmountToBuyAsset[1];
|
||||||
// find eth amount needed to buy zrx
|
// find eth amount needed to buy zrx
|
||||||
ethAmountToBuyZrx = findEthAmountNeededToBuyZrx(feeOrdersAndFillableAmounts, zrxAmountToBuyAsset);
|
zrxEthAmount = findEthAmountNeededToBuyZrx(feeOrdersAndFillableAmounts, zrxAmountToBuyAsset);
|
||||||
}
|
}
|
||||||
/// find the eth amount needed to buy the affiliate fee
|
// eth amount needed to buy the affiliate fee
|
||||||
const ethAmountToBuyAffiliateFee = ethAmountToBuyAsset.mul(feePercentage).ceil();
|
const affiliateFeeEthAmount = assetEthAmount.mul(feePercentage).ceil();
|
||||||
const totalEthAmountWithoutAffiliateFee = ethAmountToBuyAsset.plus(ethAmountToBuyZrx);
|
// eth amount needed for fees is the sum of affiliate fee and zrx fee
|
||||||
const ethAmountTotal = totalEthAmountWithoutAffiliateFee.plus(ethAmountToBuyAffiliateFee);
|
const feeEthAmount = affiliateFeeEthAmount.plus(zrxEthAmount);
|
||||||
// divide into the assetBuyAmount in order to find rate of makerAsset / WETH
|
// eth amount needed in total is the sum of the amount needed for the asset and the amount needed for fees
|
||||||
const ethPerAssetPrice = totalEthAmountWithoutAffiliateFee.div(assetBuyAmount);
|
const totalEthAmount = assetEthAmount.plus(feeEthAmount);
|
||||||
return {
|
return {
|
||||||
totalEthAmount: ethAmountTotal,
|
assetEthAmount,
|
||||||
feeEthAmount: ethAmountToBuyAffiliateFee,
|
feeEthAmount,
|
||||||
ethPerAssetPrice,
|
totalEthAmount,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -108,17 +108,17 @@ describe('buyQuoteCalculator', () => {
|
|||||||
// 50 eth to fill the first order + 100 eth for fees
|
// 50 eth to fill the first order + 100 eth for fees
|
||||||
const expectedEthAmountForAsset = new BigNumber(50);
|
const expectedEthAmountForAsset = new BigNumber(50);
|
||||||
const expectedEthAmountForZrxFees = new BigNumber(100);
|
const expectedEthAmountForZrxFees = new BigNumber(100);
|
||||||
const expectedFillEthAmount = expectedEthAmountForAsset.plus(expectedEthAmountForZrxFees);
|
const expectedFillEthAmount = expectedEthAmountForAsset;
|
||||||
const expectedFeeEthAmount = expectedEthAmountForAsset.mul(feePercentage);
|
const expectedAffiliateFeeEthAmount = expectedEthAmountForAsset.mul(feePercentage);
|
||||||
|
const expectedFeeEthAmount = expectedAffiliateFeeEthAmount.plus(expectedEthAmountForZrxFees);
|
||||||
const expectedTotalEthAmount = expectedFillEthAmount.plus(expectedFeeEthAmount);
|
const expectedTotalEthAmount = expectedFillEthAmount.plus(expectedFeeEthAmount);
|
||||||
const expectedEthPerAssetPrice = expectedFillEthAmount.div(assetBuyAmount);
|
expect(buyQuote.bestCaseQuoteInfo.assetEthAmount).to.bignumber.equal(expectedFillEthAmount);
|
||||||
expect(buyQuote.bestCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedFeeEthAmount);
|
expect(buyQuote.bestCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedFeeEthAmount);
|
||||||
expect(buyQuote.bestCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedTotalEthAmount);
|
expect(buyQuote.bestCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedTotalEthAmount);
|
||||||
expect(buyQuote.bestCaseQuoteInfo.ethPerAssetPrice).to.bignumber.equal(expectedEthPerAssetPrice);
|
|
||||||
// because we have no slippage protection, minRate is equal to maxRate
|
// because we have no slippage protection, minRate is equal to maxRate
|
||||||
|
expect(buyQuote.worstCaseQuoteInfo.assetEthAmount).to.bignumber.equal(expectedFillEthAmount);
|
||||||
expect(buyQuote.worstCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedFeeEthAmount);
|
expect(buyQuote.worstCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedFeeEthAmount);
|
||||||
expect(buyQuote.worstCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedTotalEthAmount);
|
expect(buyQuote.worstCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedTotalEthAmount);
|
||||||
expect(buyQuote.worstCaseQuoteInfo.ethPerAssetPrice).to.bignumber.equal(expectedEthPerAssetPrice);
|
|
||||||
// test if feePercentage gets passed through
|
// test if feePercentage gets passed through
|
||||||
expect(buyQuote.feePercentage).to.equal(feePercentage);
|
expect(buyQuote.feePercentage).to.equal(feePercentage);
|
||||||
});
|
});
|
||||||
@@ -146,23 +146,23 @@ describe('buyQuoteCalculator', () => {
|
|||||||
// 50 eth to fill the first order + 100 eth for fees
|
// 50 eth to fill the first order + 100 eth for fees
|
||||||
const expectedEthAmountForAsset = new BigNumber(50);
|
const expectedEthAmountForAsset = new BigNumber(50);
|
||||||
const expectedEthAmountForZrxFees = new BigNumber(100);
|
const expectedEthAmountForZrxFees = new BigNumber(100);
|
||||||
const expectedFillEthAmount = expectedEthAmountForAsset.plus(expectedEthAmountForZrxFees);
|
const expectedFillEthAmount = expectedEthAmountForAsset;
|
||||||
const expectedFeeEthAmount = expectedEthAmountForAsset.mul(feePercentage);
|
const expectedAffiliateFeeEthAmount = expectedEthAmountForAsset.mul(feePercentage);
|
||||||
|
const expectedFeeEthAmount = expectedAffiliateFeeEthAmount.plus(expectedEthAmountForZrxFees);
|
||||||
const expectedTotalEthAmount = expectedFillEthAmount.plus(expectedFeeEthAmount);
|
const expectedTotalEthAmount = expectedFillEthAmount.plus(expectedFeeEthAmount);
|
||||||
const expectedEthPerAssetPrice = expectedFillEthAmount.div(assetBuyAmount);
|
expect(buyQuote.bestCaseQuoteInfo.assetEthAmount).to.bignumber.equal(expectedFillEthAmount);
|
||||||
expect(buyQuote.bestCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedFeeEthAmount);
|
expect(buyQuote.bestCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedFeeEthAmount);
|
||||||
expect(buyQuote.bestCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedTotalEthAmount);
|
expect(buyQuote.bestCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedTotalEthAmount);
|
||||||
expect(buyQuote.bestCaseQuoteInfo.ethPerAssetPrice).to.bignumber.equal(expectedEthPerAssetPrice);
|
|
||||||
// 100 eth to fill the first order + 208 eth for fees
|
// 100 eth to fill the first order + 208 eth for fees
|
||||||
const expectedWorstEthAmountForAsset = new BigNumber(100);
|
const expectedWorstEthAmountForAsset = new BigNumber(100);
|
||||||
const expectedWorstEthAmountForZrxFees = new BigNumber(208);
|
const expectedWorstEthAmountForZrxFees = new BigNumber(208);
|
||||||
const expectedWorstFillEthAmount = expectedWorstEthAmountForAsset.plus(expectedWorstEthAmountForZrxFees);
|
const expectedWorstFillEthAmount = expectedWorstEthAmountForAsset;
|
||||||
const expectedWorstFeeEthAmount = expectedWorstEthAmountForAsset.mul(feePercentage);
|
const expectedWorstAffiliateFeeEthAmount = expectedWorstEthAmountForAsset.mul(feePercentage);
|
||||||
|
const expectedWorstFeeEthAmount = expectedWorstAffiliateFeeEthAmount.plus(expectedWorstEthAmountForZrxFees);
|
||||||
const expectedWorstTotalEthAmount = expectedWorstFillEthAmount.plus(expectedWorstFeeEthAmount);
|
const expectedWorstTotalEthAmount = expectedWorstFillEthAmount.plus(expectedWorstFeeEthAmount);
|
||||||
const expectedWorstEthPerAssetPrice = expectedWorstFillEthAmount.div(assetBuyAmount);
|
expect(buyQuote.worstCaseQuoteInfo.assetEthAmount).to.bignumber.equal(expectedWorstFillEthAmount);
|
||||||
expect(buyQuote.worstCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedWorstFeeEthAmount);
|
expect(buyQuote.worstCaseQuoteInfo.feeEthAmount).to.bignumber.equal(expectedWorstFeeEthAmount);
|
||||||
expect(buyQuote.worstCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedWorstTotalEthAmount);
|
expect(buyQuote.worstCaseQuoteInfo.totalEthAmount).to.bignumber.equal(expectedWorstTotalEthAmount);
|
||||||
expect(buyQuote.worstCaseQuoteInfo.ethPerAssetPrice).to.bignumber.equal(expectedWorstEthPerAssetPrice);
|
|
||||||
// test if feePercentage gets passed through
|
// test if feePercentage gets passed through
|
||||||
expect(buyQuote.feePercentage).to.equal(feePercentage);
|
expect(buyQuote.feePercentage).to.equal(feePercentage);
|
||||||
});
|
});
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "3.0.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "3.0.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v3.0.6 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.0.5 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v3.0.4 - _November 12, 2018_
|
## v3.0.4 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/base-contract",
|
"name": "@0x/base-contract",
|
||||||
"version": "3.0.4",
|
"version": "3.0.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethers": "~4.0.4",
|
"ethers": "~4.0.4",
|
||||||
"lodash": "^4.17.5"
|
"lodash": "^4.17.5"
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "3.0.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "3.0.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v3.0.6 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.0.5 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v3.0.4 - _November 12, 2018_
|
## v3.0.4 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/connect",
|
"name": "@0x/connect",
|
||||||
"version": "3.0.4",
|
"version": "3.0.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -44,12 +44,12 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"lodash": "^4.17.5",
|
"lodash": "^4.17.5",
|
||||||
"query-string": "^5.0.1",
|
"query-string": "^5.0.1",
|
||||||
"sinon": "^4.0.0",
|
"sinon": "^4.0.0",
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "4.0.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "4.0.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v4.0.2 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.0.1 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v4.0.0 - _November 12, 2018_
|
## v4.0.0 - _November 12, 2018_
|
||||||
|
|
||||||
* Add signature validation, regular cancellation and `cancelledUpTo` checks to `validateOrderFillableOrThrowAsync` (#1235)
|
* Add signature validation, regular cancellation and `cancelledUpTo` checks to `validateOrderFillableOrThrowAsync` (#1235)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contract-wrappers",
|
"name": "@0x/contract-wrappers",
|
||||||
"version": "4.0.0",
|
"version": "4.0.2",
|
||||||
"description": "Smart TS wrappers for 0x smart contracts",
|
"description": "Smart TS wrappers for 0x smart contracts",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"0xproject",
|
"0xproject",
|
||||||
@@ -37,9 +37,9 @@
|
|||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/migrations": "^2.0.2",
|
"@0x/migrations": "^2.0.4",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
@@ -65,17 +65,17 @@
|
|||||||
"web3-provider-engine": "14.0.6"
|
"web3-provider-engine": "14.0.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/abi-gen-wrappers": "^1.0.3",
|
"@0x/abi-gen-wrappers": "^1.0.5",
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/contract-addresses": "^1.1.0",
|
"@0x/contract-addresses": "^1.1.0",
|
||||||
"@0x/contract-artifacts": "^1.1.0",
|
"@0x/contract-artifacts": "^1.1.0",
|
||||||
"@0x/fill-scenarios": "^1.0.10",
|
"@0x/fill-scenarios": "^1.0.12",
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethereumjs-blockstream": "6.0.0",
|
"ethereumjs-blockstream": "6.0.0",
|
||||||
"ethereumjs-util": "^5.1.1",
|
"ethereumjs-util": "^5.1.1",
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "contracts",
|
"name": "contracts",
|
||||||
"version": "2.1.52",
|
"version": "2.1.54",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -45,11 +45,11 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^1.0.15",
|
"@0x/abi-gen": "^1.0.16",
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/sol-compiler": "^1.1.10",
|
"@0x/sol-compiler": "^1.1.12",
|
||||||
"@0x/sol-cov": "^2.1.10",
|
"@0x/sol-cov": "^2.1.12",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@types/bn.js": "^4.11.0",
|
"@types/bn.js": "^4.11.0",
|
||||||
"@types/ethereumjs-abi": "^0.6.0",
|
"@types/ethereumjs-abi": "^0.6.0",
|
||||||
@@ -71,12 +71,12 @@
|
|||||||
"yargs": "^10.0.3"
|
"yargs": "^10.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"@types/js-combinatorics": "^0.5.29",
|
"@types/js-combinatorics": "^0.5.29",
|
||||||
"bn.js": "^4.11.8",
|
"bn.js": "^4.11.8",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/dev-tools-pages",
|
"name": "@0x/dev-tools-pages",
|
||||||
"version": "0.0.4",
|
"version": "0.0.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/react-shared": "^1.0.19",
|
"@0x/react-shared": "^1.0.21",
|
||||||
"basscss": "^8.0.3",
|
"basscss": "^8.0.3",
|
||||||
"bowser": "^1.9.3",
|
"bowser": "^1.9.3",
|
||||||
"less": "^2.7.2",
|
"less": "^2.7.2",
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "1.0.17",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "1.0.16",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "1.0.15",
|
"version": "1.0.15",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.17 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.0.16 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.0.15 - _November 12, 2018_
|
## v1.0.15 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/dev-utils",
|
"name": "@0x/dev-utils",
|
||||||
"version": "1.0.15",
|
"version": "1.0.17",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -41,11 +41,11 @@
|
|||||||
"typescript": "3.0.1"
|
"typescript": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"@types/web3-provider-engine": "^14.0.0",
|
"@types/web3-provider-engine": "^14.0.0",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "1.0.12",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "1.0.11",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "1.0.10",
|
"version": "1.0.10",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.12 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.0.11 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.0.10 - _November 12, 2018_
|
## v1.0.10 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/fill-scenarios",
|
"name": "@0x/fill-scenarios",
|
||||||
"version": "1.0.10",
|
"version": "1.0.12",
|
||||||
"description": "0x order fill scenario generator",
|
"description": "0x order fill scenario generator",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"types": "lib/index.d.ts",
|
"types": "lib/index.d.ts",
|
||||||
@@ -28,14 +28,14 @@
|
|||||||
"typescript": "3.0.1"
|
"typescript": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/abi-gen-wrappers": "^1.0.3",
|
"@0x/abi-gen-wrappers": "^1.0.5",
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/contract-artifacts": "^1.1.0",
|
"@0x/contract-artifacts": "^1.1.0",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethers": "~4.0.4",
|
"ethers": "~4.0.4",
|
||||||
"lodash": "^4.17.5"
|
"lodash": "^4.17.5"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/instant",
|
"name": "@0x/instant",
|
||||||
"version": "0.0.5",
|
"version": "0.0.7",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -45,15 +45,15 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/instant/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/instant/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/asset-buyer": "^2.2.1",
|
"@0x/asset-buyer": "^3.0.0",
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"copy-to-clipboard": "^3.0.8",
|
"copy-to-clipboard": "^3.0.8",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"lodash": "^4.17.10",
|
"lodash": "^4.17.10",
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { OptionallyScreenSpecific } from '../../style/media';
|
import { OptionallyScreenSpecific } from '../../style/media';
|
||||||
|
import { SlideAnimationState } from '../../types';
|
||||||
|
|
||||||
import { PositionAnimation, PositionAnimationSettings } from './position_animation';
|
import { PositionAnimation, PositionAnimationSettings } from './position_animation';
|
||||||
|
|
||||||
export type SlideAnimationState = 'slidIn' | 'slidOut' | 'none';
|
|
||||||
export interface SlideAnimationProps {
|
export interface SlideAnimationProps {
|
||||||
animationState: SlideAnimationState;
|
animationState: SlideAnimationState;
|
||||||
slideInSettings: OptionallyScreenSpecific<PositionAnimationSettings>;
|
slideInSettings: OptionallyScreenSpecific<PositionAnimationSettings>;
|
||||||
|
@@ -43,7 +43,6 @@ export class BuyButton extends React.Component<BuyButtonProps> {
|
|||||||
onClick={this._handleClick}
|
onClick={this._handleClick}
|
||||||
isDisabled={shouldDisableButton}
|
isDisabled={shouldDisableButton}
|
||||||
fontColor={ColorOption.white}
|
fontColor={ColorOption.white}
|
||||||
fontSize="20px"
|
|
||||||
>
|
>
|
||||||
Buy
|
Buy
|
||||||
</Button>
|
</Button>
|
||||||
|
@@ -12,7 +12,6 @@ export interface BuyOrderProgressProps {
|
|||||||
|
|
||||||
export const BuyOrderProgress: React.StatelessComponent<BuyOrderProgressProps> = props => {
|
export const BuyOrderProgress: React.StatelessComponent<BuyOrderProgressProps> = props => {
|
||||||
const { buyOrderState } = props;
|
const { buyOrderState } = props;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
buyOrderState.processState === OrderProcessState.Processing ||
|
buyOrderState.processState === OrderProcessState.Processing ||
|
||||||
buyOrderState.processState === OrderProcessState.Success ||
|
buyOrderState.processState === OrderProcessState.Success ||
|
||||||
@@ -30,6 +29,5 @@ export const BuyOrderProgress: React.StatelessComponent<BuyOrderProgressProps> =
|
|||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
@@ -35,7 +35,7 @@ export const BuyOrderStateButtons: React.StatelessComponent<BuyOrderStateButtonP
|
|||||||
if (props.buyOrderProcessingState === OrderProcessState.Failure) {
|
if (props.buyOrderProcessingState === OrderProcessState.Failure) {
|
||||||
return (
|
return (
|
||||||
<Flex justify="space-between">
|
<Flex justify="space-between">
|
||||||
<Button width="48%" onClick={props.onRetry} fontColor={ColorOption.white} fontSize="16px">
|
<Button width="48%" onClick={props.onRetry} fontColor={ColorOption.white}>
|
||||||
Back
|
Back
|
||||||
</Button>
|
</Button>
|
||||||
<SecondaryButton width="48%" onClick={props.onViewTransaction}>
|
<SecondaryButton width="48%" onClick={props.onViewTransaction}>
|
||||||
|
@@ -29,13 +29,18 @@ export class ERC20TokenSelector extends React.Component<ERC20TokenSelectorProps>
|
|||||||
const { tokens, onTokenSelect } = this.props;
|
const { tokens, onTokenSelect } = this.props;
|
||||||
return (
|
return (
|
||||||
<Container height="100%">
|
<Container height="100%">
|
||||||
|
<Container marginBottom="10px">
|
||||||
|
<Text fontColor={ColorOption.darkGrey} fontSize="18px" fontWeight="600" lineHeight="22px">
|
||||||
|
Select Token
|
||||||
|
</Text>
|
||||||
|
</Container>
|
||||||
<SearchInput
|
<SearchInput
|
||||||
placeholder="Search tokens..."
|
placeholder="Search tokens..."
|
||||||
width="100%"
|
width="100%"
|
||||||
value={this.state.searchQuery}
|
value={this.state.searchQuery}
|
||||||
onChange={this._handleSearchInputChange}
|
onChange={this._handleSearchInputChange}
|
||||||
/>
|
/>
|
||||||
<Container overflow="scroll" height="calc(100% - 80px)" marginTop="10px">
|
<Container overflow="scroll" height="calc(100% - 90px)" marginTop="10px">
|
||||||
{_.map(tokens, token => {
|
{_.map(tokens, token => {
|
||||||
if (!this._isTokenQueryMatch(token)) {
|
if (!this._isTokenQueryMatch(token)) {
|
||||||
return null;
|
return null;
|
||||||
|
@@ -0,0 +1,32 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { META_MASK_CHROME_STORE_URL, META_MASK_SITE_URL } from '../constants';
|
||||||
|
import { ColorOption } from '../style/theme';
|
||||||
|
|
||||||
|
import { MetaMaskLogo } from './meta_mask_logo';
|
||||||
|
import { StandardPanelContent } from './standard_panel_content';
|
||||||
|
import { Button } from './ui/button';
|
||||||
|
|
||||||
|
export interface InstallWalletPanelContentProps {}
|
||||||
|
|
||||||
|
export const InstallWalletPanelContent: React.StatelessComponent<InstallWalletPanelContentProps> = () => (
|
||||||
|
<StandardPanelContent
|
||||||
|
image={<MetaMaskLogo width={85} height={80} />}
|
||||||
|
title="Install MetaMask"
|
||||||
|
description="Please install the MetaMask wallet extension from the Chrome Store."
|
||||||
|
moreInfoSettings={{
|
||||||
|
href: META_MASK_SITE_URL,
|
||||||
|
text: 'What is MetaMask?',
|
||||||
|
}}
|
||||||
|
action={
|
||||||
|
<Button
|
||||||
|
href={META_MASK_CHROME_STORE_URL}
|
||||||
|
width="100%"
|
||||||
|
fontColor={ColorOption.white}
|
||||||
|
backgroundColor={ColorOption.darkOrange}
|
||||||
|
>
|
||||||
|
Get Chrome Extension
|
||||||
|
</Button>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
@@ -15,8 +15,8 @@ import { Spinner } from './ui/spinner';
|
|||||||
import { Text } from './ui/text';
|
import { Text } from './ui/text';
|
||||||
|
|
||||||
export interface InstantHeadingProps {
|
export interface InstantHeadingProps {
|
||||||
selectedAssetAmount?: BigNumber;
|
selectedAssetUnitAmount?: BigNumber;
|
||||||
totalEthBaseAmount?: BigNumber;
|
totalEthBaseUnitAmount?: BigNumber;
|
||||||
ethUsdPrice?: BigNumber;
|
ethUsdPrice?: BigNumber;
|
||||||
quoteRequestState: AsyncProcessState;
|
quoteRequestState: AsyncProcessState;
|
||||||
buyOrderState: OrderState;
|
buyOrderState: OrderState;
|
||||||
@@ -104,7 +104,7 @@ export class InstantHeading extends React.Component<InstantHeadingProps, {}> {
|
|||||||
if (this.props.quoteRequestState === AsyncProcessState.Pending) {
|
if (this.props.quoteRequestState === AsyncProcessState.Pending) {
|
||||||
return <AmountPlaceholder isPulsating={true} color={PLACEHOLDER_COLOR} />;
|
return <AmountPlaceholder isPulsating={true} color={PLACEHOLDER_COLOR} />;
|
||||||
}
|
}
|
||||||
if (_.isUndefined(this.props.selectedAssetAmount)) {
|
if (_.isUndefined(this.props.selectedAssetUnitAmount)) {
|
||||||
return <AmountPlaceholder isPulsating={false} color={PLACEHOLDER_COLOR} />;
|
return <AmountPlaceholder isPulsating={false} color={PLACEHOLDER_COLOR} />;
|
||||||
}
|
}
|
||||||
return amountFunction();
|
return amountFunction();
|
||||||
@@ -113,8 +113,8 @@ export class InstantHeading extends React.Component<InstantHeadingProps, {}> {
|
|||||||
private readonly _renderEthAmount = (): React.ReactNode => {
|
private readonly _renderEthAmount = (): React.ReactNode => {
|
||||||
return (
|
return (
|
||||||
<Text fontSize="16px" fontColor={ColorOption.white} fontWeight={500}>
|
<Text fontSize="16px" fontColor={ColorOption.white} fontWeight={500}>
|
||||||
{format.ethBaseAmount(
|
{format.ethBaseUnitAmount(
|
||||||
this.props.totalEthBaseAmount,
|
this.props.totalEthBaseUnitAmount,
|
||||||
4,
|
4,
|
||||||
<AmountPlaceholder isPulsating={false} color={PLACEHOLDER_COLOR} />,
|
<AmountPlaceholder isPulsating={false} color={PLACEHOLDER_COLOR} />,
|
||||||
)}
|
)}
|
||||||
@@ -125,8 +125,8 @@ export class InstantHeading extends React.Component<InstantHeadingProps, {}> {
|
|||||||
private readonly _renderDollarAmount = (): React.ReactNode => {
|
private readonly _renderDollarAmount = (): React.ReactNode => {
|
||||||
return (
|
return (
|
||||||
<Text fontSize="16px" fontColor={ColorOption.white}>
|
<Text fontSize="16px" fontColor={ColorOption.white}>
|
||||||
{format.ethBaseAmountInUsd(
|
{format.ethBaseUnitAmountInUsd(
|
||||||
this.props.totalEthBaseAmount,
|
this.props.totalEthBaseUnitAmount,
|
||||||
this.props.ethUsdPrice,
|
this.props.ethUsdPrice,
|
||||||
2,
|
2,
|
||||||
<AmountPlaceholder isPulsating={false} color={ColorOption.white} />,
|
<AmountPlaceholder isPulsating={false} color={ColorOption.white} />,
|
||||||
|
78
packages/instant/src/components/meta_mask_logo.tsx
Normal file
78
packages/instant/src/components/meta_mask_logo.tsx
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
export interface MetaMaskLogoProps {
|
||||||
|
width?: number;
|
||||||
|
height?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MetaMaskLogo: React.StatelessComponent<MetaMaskLogoProps> = ({ width, height }) => (
|
||||||
|
<svg width={width} height={height} viewBox="0 0 85 80" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M80.578 0L47.7107 24.8648L53.542 10.2702L80.578 0Z" fill="#E2761B" />
|
||||||
|
<path d="M4.24075 0L37.1081 25.4053L31.2768 10.2702L4.24075 0Z" fill="#E4761B" />
|
||||||
|
<path d="M68.9152 57.8379L59.9032 71.8919L78.9874 77.2973L84.2886 58.3785L68.9152 57.8379Z" fill="#E4761B" />
|
||||||
|
<path d="M0.53006 58.3785L5.83124 77.2973L24.9155 71.8919L15.9035 57.8379L0.53006 58.3785Z" fill="#E4761B" />
|
||||||
|
<path d="M23.8552 34.5941L18.554 42.7022L37.1082 43.7833L36.5781 23.2428L23.8552 34.5941Z" fill="#E4761B" />
|
||||||
|
<path d="M60.9635 34.5941L47.7106 23.2428V43.7833L66.2647 42.7022L60.9635 34.5941Z" fill="#E4761B" />
|
||||||
|
<path d="M24.9156 71.8914L36.0481 66.4861L26.5059 58.378L24.9156 71.8914Z" fill="#E4761B" />
|
||||||
|
<path d="M48.7709 66.4861L59.9034 71.8914L58.313 58.378L48.7709 66.4861Z" fill="#E4761B" />
|
||||||
|
<path d="M59.9034 71.8919L48.7709 66.4865L49.301 73.5135V76.7567L59.9034 71.8919Z" fill="#D7C1B3" />
|
||||||
|
<path d="M24.9157 71.892L35.518 76.7568V73.5136L36.0482 66.4866L24.9157 71.892Z" fill="#D7C1B3" />
|
||||||
|
<path d="M35.5179 53.5138L25.9758 50.8111L32.8673 47.5678L35.5179 53.5138Z" fill="#233447" />
|
||||||
|
<path d="M49.3009 53.5138L51.9515 47.5678L58.843 50.8111L49.3009 53.5138Z" fill="#233447" />
|
||||||
|
<path d="M24.9155 71.892L26.5059 57.838L15.9035 58.3785L24.9155 71.892Z" fill="#CD6116" />
|
||||||
|
<path d="M58.313 57.838L59.9034 71.892L68.9154 58.3785L58.313 57.838Z" fill="#CD6116" />
|
||||||
|
<path
|
||||||
|
d="M66.2648 42.7025L47.7106 43.7836L49.301 53.5132L51.9516 47.5673L58.8431 50.8106L66.2648 42.7025Z"
|
||||||
|
fill="#CD6116"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M25.9758 50.8106L32.8673 47.5673L35.5179 53.5132L37.1083 43.7836L18.5541 42.7025L25.9758 50.8106Z"
|
||||||
|
fill="#CD6116"
|
||||||
|
/>
|
||||||
|
<path d="M18.5541 42.7024L26.5059 58.378L25.9758 50.8105L18.5541 42.7024Z" fill="#E4751F" />
|
||||||
|
<path d="M58.8431 50.8106L58.313 58.3781L66.2647 42.7025L58.8431 50.8106Z" fill="#E4751F" />
|
||||||
|
<path d="M37.1083 43.7838L35.518 53.5135L37.6384 65.4053L38.1686 49.7297L37.1083 43.7838Z" fill="#E4751F" />
|
||||||
|
<path d="M47.7105 43.7838L46.6503 49.7297L47.1804 65.4053L49.3009 53.5135L47.7105 43.7838Z" fill="#E4751F" />
|
||||||
|
<path
|
||||||
|
d="M49.301 53.5134L47.1805 65.4052L48.7709 66.4863L58.313 58.3782L58.8431 50.8107L49.301 53.5134Z"
|
||||||
|
fill="#F6851B"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M25.9758 50.8107L26.5059 58.3782L36.048 66.4863L37.6384 65.4052L35.5179 53.5134L25.9758 50.8107Z"
|
||||||
|
fill="#F6851B"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M49.3011 76.7568V73.5135L48.771 72.973H36.0482L35.518 73.5135V76.7568L24.9157 71.8919L28.6265 75.1351L36.0482 80H48.771L56.1927 75.1351L59.9035 71.8919L49.3011 76.7568Z"
|
||||||
|
fill="#C0AD9E"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M48.771 66.486L47.1806 65.405H37.6385L36.0482 66.486L35.518 73.513L36.0482 72.9725H48.771L49.3011 73.513L48.771 66.486Z"
|
||||||
|
fill="#161616"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M82.1685 26.4864L84.8191 12.9729L80.5781 0L48.771 24.3242L60.9637 34.5945L78.4576 39.9998L82.1685 35.6755L80.5781 34.0539L83.2287 31.8918L81.1082 30.2702L83.7588 28.108L82.1685 26.4864Z"
|
||||||
|
fill="#763D16"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M0 12.9729L2.65059 26.4864L1.06024 28.108L3.71083 30.2702L1.59036 31.8918L4.24095 34.0539L2.65059 35.6755L6.36142 39.9998L23.8553 34.5945L36.0481 24.3242L4.24095 0L0 12.9729Z"
|
||||||
|
fill="#763D16"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M78.4575 39.9993L60.9636 34.5939L66.2648 42.702L58.313 58.3776H68.9154H84.2888L78.4575 39.9993Z"
|
||||||
|
fill="#F6851B"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M23.8554 34.5939L6.36147 39.9993L0.530167 58.3776H15.9036H26.506L18.5542 42.702L23.8554 34.5939Z"
|
||||||
|
fill="#F6851B"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M47.7106 43.7833L48.7709 24.3239L53.5419 10.2699H31.2769L36.048 24.3239L37.1083 43.7833L37.6384 49.7292V65.4048H47.1805V49.7292L47.7106 43.7833Z"
|
||||||
|
fill="#F6851B"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
|
||||||
|
MetaMaskLogo.defaultProps = {
|
||||||
|
width: 85,
|
||||||
|
height: 80,
|
||||||
|
};
|
@@ -4,6 +4,7 @@ import * as _ from 'lodash';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { oc } from 'ts-optchain';
|
import { oc } from 'ts-optchain';
|
||||||
|
|
||||||
|
import { BIG_NUMBER_ZERO } from '../constants';
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { format } from '../util/format';
|
import { format } from '../util/format';
|
||||||
|
|
||||||
@@ -15,16 +16,23 @@ import { Text } from './ui/text';
|
|||||||
|
|
||||||
export interface OrderDetailsProps {
|
export interface OrderDetailsProps {
|
||||||
buyQuoteInfo?: BuyQuoteInfo;
|
buyQuoteInfo?: BuyQuoteInfo;
|
||||||
|
selectedAssetUnitAmount?: BigNumber;
|
||||||
ethUsdPrice?: BigNumber;
|
ethUsdPrice?: BigNumber;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
}
|
}
|
||||||
export class OrderDetails extends React.Component<OrderDetailsProps> {
|
export class OrderDetails extends React.Component<OrderDetailsProps> {
|
||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
const { buyQuoteInfo, ethUsdPrice } = this.props;
|
const { buyQuoteInfo, ethUsdPrice, selectedAssetUnitAmount } = this.props;
|
||||||
const buyQuoteAccessor = oc(buyQuoteInfo);
|
const buyQuoteAccessor = oc(buyQuoteInfo);
|
||||||
const ethAssetPrice = buyQuoteAccessor.ethPerAssetPrice();
|
const assetEthBaseUnitAmount = buyQuoteAccessor.assetEthAmount();
|
||||||
const ethTokenFee = buyQuoteAccessor.feeEthAmount();
|
const feeEthBaseUnitAmount = buyQuoteAccessor.feeEthAmount();
|
||||||
const totalEthAmount = buyQuoteAccessor.totalEthAmount();
|
const totalEthBaseUnitAmount = buyQuoteAccessor.totalEthAmount();
|
||||||
|
const pricePerTokenEth =
|
||||||
|
!_.isUndefined(assetEthBaseUnitAmount) &&
|
||||||
|
!_.isUndefined(selectedAssetUnitAmount) &&
|
||||||
|
!selectedAssetUnitAmount.eq(BIG_NUMBER_ZERO)
|
||||||
|
? assetEthBaseUnitAmount.div(selectedAssetUnitAmount).ceil()
|
||||||
|
: undefined;
|
||||||
return (
|
return (
|
||||||
<Container padding="20px" width="100%" flexGrow={1}>
|
<Container padding="20px" width="100%" flexGrow={1}>
|
||||||
<Container marginBottom="10px">
|
<Container marginBottom="10px">
|
||||||
@@ -40,20 +48,19 @@ export class OrderDetails extends React.Component<OrderDetailsProps> {
|
|||||||
</Container>
|
</Container>
|
||||||
<EthAmountRow
|
<EthAmountRow
|
||||||
rowLabel="Token Price"
|
rowLabel="Token Price"
|
||||||
ethAmount={ethAssetPrice}
|
ethAmount={pricePerTokenEth}
|
||||||
ethUsdPrice={ethUsdPrice}
|
ethUsdPrice={ethUsdPrice}
|
||||||
isEthAmountInBaseUnits={false}
|
|
||||||
isLoading={this.props.isLoading}
|
isLoading={this.props.isLoading}
|
||||||
/>
|
/>
|
||||||
<EthAmountRow
|
<EthAmountRow
|
||||||
rowLabel="Fee"
|
rowLabel="Fee"
|
||||||
ethAmount={ethTokenFee}
|
ethAmount={feeEthBaseUnitAmount}
|
||||||
ethUsdPrice={ethUsdPrice}
|
ethUsdPrice={ethUsdPrice}
|
||||||
isLoading={this.props.isLoading}
|
isLoading={this.props.isLoading}
|
||||||
/>
|
/>
|
||||||
<EthAmountRow
|
<EthAmountRow
|
||||||
rowLabel="Total Cost"
|
rowLabel="Total Cost"
|
||||||
ethAmount={totalEthAmount}
|
ethAmount={totalEthBaseUnitAmount}
|
||||||
ethUsdPrice={ethUsdPrice}
|
ethUsdPrice={ethUsdPrice}
|
||||||
shouldEmphasize={true}
|
shouldEmphasize={true}
|
||||||
isLoading={this.props.isLoading}
|
isLoading={this.props.isLoading}
|
||||||
@@ -81,7 +88,7 @@ export class EthAmountRow extends React.Component<EthAmountRowProps> {
|
|||||||
const { rowLabel, ethAmount, isEthAmountInBaseUnits, shouldEmphasize, isLoading } = this.props;
|
const { rowLabel, ethAmount, isEthAmountInBaseUnits, shouldEmphasize, isLoading } = this.props;
|
||||||
|
|
||||||
const fontWeight = shouldEmphasize ? 700 : 400;
|
const fontWeight = shouldEmphasize ? 700 : 400;
|
||||||
const ethFormatter = isEthAmountInBaseUnits ? format.ethBaseAmount : format.ethUnitAmount;
|
const ethFormatter = isEthAmountInBaseUnits ? format.ethBaseUnitAmount : format.ethUnitAmount;
|
||||||
return (
|
return (
|
||||||
<Container padding="10px 0px" borderTop="1px dashed" borderColor={ColorOption.feintGrey}>
|
<Container padding="10px 0px" borderTop="1px dashed" borderColor={ColorOption.feintGrey}>
|
||||||
<Flex justify="space-between">
|
<Flex justify="space-between">
|
||||||
@@ -105,7 +112,9 @@ export class EthAmountRow extends React.Component<EthAmountRowProps> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
private _renderUsdSection(): React.ReactNode {
|
private _renderUsdSection(): React.ReactNode {
|
||||||
const usdFormatter = this.props.isEthAmountInBaseUnits ? format.ethBaseAmountInUsd : format.ethUnitAmountInUsd;
|
const usdFormatter = this.props.isEthAmountInBaseUnits
|
||||||
|
? format.ethBaseUnitAmountInUsd
|
||||||
|
: format.ethUnitAmountInUsd;
|
||||||
const shouldHideUsdPriceSection = _.isUndefined(this.props.ethUsdPrice) || _.isUndefined(this.props.ethAmount);
|
const shouldHideUsdPriceSection = _.isUndefined(this.props.ethUsdPrice) || _.isUndefined(this.props.ethAmount);
|
||||||
return shouldHideUsdPriceSection ? null : (
|
return shouldHideUsdPriceSection ? null : (
|
||||||
<Container marginRight="3px" display="inline-block">
|
<Container marginRight="3px" display="inline-block">
|
||||||
|
@@ -1,45 +1,132 @@
|
|||||||
import { BigNumber } from '@0x/utils';
|
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { Network } from '../types';
|
import { Account, AccountState, Network } from '../types';
|
||||||
|
|
||||||
|
import { MetaMaskLogo } from './meta_mask_logo';
|
||||||
import { PaymentMethodDropdown } from './payment_method_dropdown';
|
import { PaymentMethodDropdown } from './payment_method_dropdown';
|
||||||
import { Circle } from './ui/circle';
|
import { Circle } from './ui/circle';
|
||||||
import { Container } from './ui/container';
|
import { Container } from './ui/container';
|
||||||
import { Flex } from './ui/flex';
|
import { Flex } from './ui/flex';
|
||||||
|
import { Icon } from './ui/icon';
|
||||||
import { Text } from './ui/text';
|
import { Text } from './ui/text';
|
||||||
|
|
||||||
export interface PaymentMethodProps {}
|
export interface PaymentMethodProps {
|
||||||
|
account: Account;
|
||||||
|
network: Network;
|
||||||
|
onInstallWalletClick: () => void;
|
||||||
|
onUnlockWalletClick: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
export const PaymentMethod: React.StatelessComponent<PaymentMethodProps> = () => (
|
export class PaymentMethod extends React.Component<PaymentMethodProps> {
|
||||||
<Container padding="20px" width="100%">
|
public render(): React.ReactNode {
|
||||||
<Container marginBottom="10px">
|
return (
|
||||||
<Flex justify="space-between">
|
<Container padding="20px" width="100%">
|
||||||
<Text
|
<Container marginBottom="12px">
|
||||||
letterSpacing="1px"
|
<Flex justify="space-between">
|
||||||
fontColor={ColorOption.primaryColor}
|
<Text
|
||||||
fontWeight={600}
|
letterSpacing="1px"
|
||||||
textTransform="uppercase"
|
fontColor={ColorOption.primaryColor}
|
||||||
fontSize="14px"
|
fontWeight={600}
|
||||||
>
|
textTransform="uppercase"
|
||||||
Payment Method
|
fontSize="14px"
|
||||||
</Text>
|
>
|
||||||
<Flex>
|
{this._renderTitleText()}
|
||||||
<Circle color={ColorOption.green} diameter={8} />
|
</Text>
|
||||||
|
<Flex>{this._renderTitleLabel()}</Flex>
|
||||||
|
</Flex>
|
||||||
|
</Container>
|
||||||
|
{this._renderMainContent()}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
private readonly _renderTitleText = (): string => {
|
||||||
|
const { account } = this.props;
|
||||||
|
switch (account.state) {
|
||||||
|
case AccountState.Loading:
|
||||||
|
return 'loading...';
|
||||||
|
case AccountState.Locked:
|
||||||
|
case AccountState.None:
|
||||||
|
return 'connect your wallet';
|
||||||
|
case AccountState.Ready:
|
||||||
|
return 'payment method';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private readonly _renderTitleLabel = (): React.ReactNode => {
|
||||||
|
const { account } = this.props;
|
||||||
|
if (account.state === AccountState.Ready || account.state === AccountState.Locked) {
|
||||||
|
const circleColor: ColorOption = account.state === AccountState.Ready ? ColorOption.green : ColorOption.red;
|
||||||
|
return (
|
||||||
|
<React.Fragment>
|
||||||
|
<Circle diameter={8} color={circleColor} />
|
||||||
<Container marginLeft="3px">
|
<Container marginLeft="3px">
|
||||||
<Text fontColor={ColorOption.darkGrey} fontSize="12px">
|
<Text fontColor={ColorOption.darkGrey} fontSize="12px">
|
||||||
MetaMask
|
MetaMask
|
||||||
</Text>
|
</Text>
|
||||||
</Container>
|
</Container>
|
||||||
</Flex>
|
</React.Fragment>
|
||||||
</Flex>
|
);
|
||||||
</Container>
|
}
|
||||||
<PaymentMethodDropdown
|
return null;
|
||||||
accountAddress="0xa1b2c3d4e5f6g7h8j9k10"
|
};
|
||||||
accountEthBalanceInWei={new BigNumber(10500000000000000000)}
|
private readonly _renderMainContent = (): React.ReactNode => {
|
||||||
network={Network.Mainnet}
|
const { account, network } = this.props;
|
||||||
/>
|
switch (account.state) {
|
||||||
|
case AccountState.Loading:
|
||||||
|
// Just take up the same amount of space as the other states.
|
||||||
|
return <Container height="52px" />;
|
||||||
|
case AccountState.Locked:
|
||||||
|
return (
|
||||||
|
<WalletPrompt
|
||||||
|
onClick={this.props.onUnlockWalletClick}
|
||||||
|
image={<Icon width={13} icon="lock" color={ColorOption.black} />}
|
||||||
|
>
|
||||||
|
Please Unlock MetaMask
|
||||||
|
</WalletPrompt>
|
||||||
|
);
|
||||||
|
case AccountState.None:
|
||||||
|
return (
|
||||||
|
<WalletPrompt
|
||||||
|
onClick={this.props.onInstallWalletClick}
|
||||||
|
image={<MetaMaskLogo width={19} height={18} />}
|
||||||
|
>
|
||||||
|
Install MetaMask
|
||||||
|
</WalletPrompt>
|
||||||
|
);
|
||||||
|
case AccountState.Ready:
|
||||||
|
return (
|
||||||
|
<PaymentMethodDropdown
|
||||||
|
accountAddress={account.address}
|
||||||
|
accountEthBalanceInWei={account.ethBalanceInWei}
|
||||||
|
network={network}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
interface WalletPromptProps {
|
||||||
|
image: React.ReactNode;
|
||||||
|
onClick?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const WalletPrompt: React.StatelessComponent<WalletPromptProps> = ({ onClick, image, children }) => (
|
||||||
|
<Container
|
||||||
|
padding="14.5px"
|
||||||
|
border={`1px solid ${ColorOption.darkOrange}`}
|
||||||
|
backgroundColor={ColorOption.lightOrange}
|
||||||
|
width="100%"
|
||||||
|
borderRadius="4px"
|
||||||
|
onClick={onClick}
|
||||||
|
cursor={onClick ? 'pointer' : undefined}
|
||||||
|
boxShadowOnHover={!!onClick}
|
||||||
|
>
|
||||||
|
<Flex>
|
||||||
|
<Container marginRight="10px">{image}</Container>
|
||||||
|
<Text fontSize="16px" fontColor={ColorOption.darkOrange}>
|
||||||
|
{children}
|
||||||
|
</Text>
|
||||||
|
</Flex>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
@@ -18,7 +18,7 @@ export class PaymentMethodDropdown extends React.Component<PaymentMethodDropdown
|
|||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
const { accountAddress, accountEthBalanceInWei } = this.props;
|
const { accountAddress, accountEthBalanceInWei } = this.props;
|
||||||
const value = format.ethAddress(accountAddress);
|
const value = format.ethAddress(accountAddress);
|
||||||
const label = format.ethBaseAmount(accountEthBalanceInWei, 4, '') as string;
|
const label = format.ethBaseUnitAmount(accountEthBalanceInWei, 4, '') as string;
|
||||||
return <Dropdown value={value} label={label} items={this._getDropdownItemConfigs()} />;
|
return <Dropdown value={value} label={label} items={this._getDropdownItemConfigs()} />;
|
||||||
}
|
}
|
||||||
private readonly _getDropdownItemConfigs = (): DropdownItemConfig[] => {
|
private readonly _getDropdownItemConfigs = (): DropdownItemConfig[] => {
|
||||||
|
@@ -7,9 +7,9 @@ import { Container } from './ui/container';
|
|||||||
import { Spinner } from './ui/spinner';
|
import { Spinner } from './ui/spinner';
|
||||||
|
|
||||||
export const PlacingOrderButton: React.StatelessComponent<{}> = props => (
|
export const PlacingOrderButton: React.StatelessComponent<{}> = props => (
|
||||||
<Button isDisabled={true} width="100%" fontColor={ColorOption.white} fontSize="20px">
|
<Button isDisabled={true} width="100%" fontColor={ColorOption.white}>
|
||||||
<Container display="inline-block" position="relative" top="3px" marginRight="8px">
|
<Container display="inline-block" position="relative" top="3px" marginRight="8px">
|
||||||
<Spinner widthPx={20} heightPx={20} />
|
<Spinner widthPx={16} heightPx={16} />
|
||||||
</Container>
|
</Container>
|
||||||
Placing Order…
|
Placing Order…
|
||||||
</Button>
|
</Button>
|
||||||
|
@@ -156,8 +156,6 @@ export class ScalingInput extends React.Component<ScalingInputProps, ScalingInpu
|
|||||||
return `${width}px`;
|
return `${width}px`;
|
||||||
}
|
}
|
||||||
return `${textLengthThreshold}ch`;
|
return `${textLengthThreshold}ch`;
|
||||||
default:
|
|
||||||
return '1ch';
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
private readonly _calculateFontSize = (phase: ScalingInputPhase): number => {
|
private readonly _calculateFontSize = (phase: ScalingInputPhase): number => {
|
||||||
|
@@ -15,8 +15,6 @@ export const SecondaryButton: React.StatelessComponent<SecondaryButtonProps> = p
|
|||||||
borderColor={ColorOption.lightGrey}
|
borderColor={ColorOption.lightGrey}
|
||||||
width={props.width}
|
width={props.width}
|
||||||
onClick={props.onClick}
|
onClick={props.onClick}
|
||||||
fontColor={ColorOption.primaryColor}
|
|
||||||
fontSize="16px"
|
|
||||||
{...buttonProps}
|
{...buttonProps}
|
||||||
>
|
>
|
||||||
{props.children}
|
{props.children}
|
||||||
|
@@ -3,9 +3,10 @@ import * as React from 'react';
|
|||||||
import { ScreenSpecification } from '../style/media';
|
import { ScreenSpecification } from '../style/media';
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { zIndex } from '../style/z_index';
|
import { zIndex } from '../style/z_index';
|
||||||
|
import { SlideAnimationState } from '../types';
|
||||||
|
|
||||||
import { PositionAnimationSettings } from './animations/position_animation';
|
import { PositionAnimationSettings } from './animations/position_animation';
|
||||||
import { SlideAnimation, SlideAnimationState } from './animations/slide_animation';
|
import { SlideAnimation } from './animations/slide_animation';
|
||||||
|
|
||||||
import { Container } from './ui/container';
|
import { Container } from './ui/container';
|
||||||
import { Flex } from './ui/flex';
|
import { Flex } from './ui/flex';
|
||||||
|
@@ -2,35 +2,25 @@ import * as React from 'react';
|
|||||||
|
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { zIndex } from '../style/z_index';
|
import { zIndex } from '../style/z_index';
|
||||||
|
import { SlideAnimationState } from '../types';
|
||||||
|
|
||||||
import { PositionAnimationSettings } from './animations/position_animation';
|
import { PositionAnimationSettings } from './animations/position_animation';
|
||||||
import { SlideAnimation, SlideAnimationState } from './animations/slide_animation';
|
import { SlideAnimation } from './animations/slide_animation';
|
||||||
|
|
||||||
import { Container } from './ui/container';
|
import { Container } from './ui/container';
|
||||||
import { Flex } from './ui/flex';
|
import { Flex } from './ui/flex';
|
||||||
import { Icon } from './ui/icon';
|
import { Icon } from './ui/icon';
|
||||||
import { Text } from './ui/text';
|
|
||||||
|
|
||||||
export interface PanelProps {
|
export interface PanelProps {
|
||||||
title?: string;
|
|
||||||
onClose?: () => void;
|
onClose?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Panel: React.StatelessComponent<PanelProps> = ({ title, children, onClose }) => (
|
export const Panel: React.StatelessComponent<PanelProps> = ({ children, onClose }) => (
|
||||||
<Container backgroundColor={ColorOption.white} width="100%" height="100%" zIndex={zIndex.panel} padding="20px">
|
<Container backgroundColor={ColorOption.white} width="100%" height="100%" zIndex={zIndex.panel} padding="20px">
|
||||||
<Flex justify="space-between">
|
<Flex justify="flex-end">
|
||||||
{title && (
|
<Icon padding="5px" width={12} color={ColorOption.lightGrey} icon="closeX" onClick={onClose} />
|
||||||
<Container marginTop="3px">
|
|
||||||
<Text fontColor={ColorOption.darkGrey} fontSize="18px" fontWeight="600" lineHeight="22px">
|
|
||||||
{title}
|
|
||||||
</Text>
|
|
||||||
</Container>
|
|
||||||
)}
|
|
||||||
<Container position="relative" bottom="7px">
|
|
||||||
<Icon width={12} color={ColorOption.lightGrey} icon="closeX" onClick={onClose} />
|
|
||||||
</Container>
|
|
||||||
</Flex>
|
</Flex>
|
||||||
<Container marginTop="10px" height="100%">
|
<Container position="relative" top="-10px" height="100%">
|
||||||
{children}
|
{children}
|
||||||
</Container>
|
</Container>
|
||||||
</Container>
|
</Container>
|
||||||
|
60
packages/instant/src/components/standard_panel_content.tsx
Normal file
60
packages/instant/src/components/standard_panel_content.tsx
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { ColorOption } from '../style/theme';
|
||||||
|
|
||||||
|
import { Container } from './ui/container';
|
||||||
|
import { Flex } from './ui/flex';
|
||||||
|
import { Text } from './ui/text';
|
||||||
|
|
||||||
|
export interface MoreInfoSettings {
|
||||||
|
text: string;
|
||||||
|
href: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StandardPanelContentProps {
|
||||||
|
image: React.ReactNode;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
moreInfoSettings?: MoreInfoSettings;
|
||||||
|
action: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SPACING_BETWEEN_PX = '20px';
|
||||||
|
|
||||||
|
export const StandardPanelContent: React.StatelessComponent<StandardPanelContentProps> = ({
|
||||||
|
image,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
moreInfoSettings,
|
||||||
|
action,
|
||||||
|
}) => (
|
||||||
|
<Container height="100%">
|
||||||
|
<Flex direction="column" height="calc(100% - 58px)">
|
||||||
|
<Container marginBottom={SPACING_BETWEEN_PX}>{image}</Container>
|
||||||
|
<Container marginBottom={SPACING_BETWEEN_PX}>
|
||||||
|
<Text fontSize="20px" fontWeight={700} fontColor={ColorOption.black}>
|
||||||
|
{title}
|
||||||
|
</Text>
|
||||||
|
</Container>
|
||||||
|
<Container marginBottom={SPACING_BETWEEN_PX}>
|
||||||
|
<Text fontSize="14px" fontColor={ColorOption.grey} center={true}>
|
||||||
|
{description}
|
||||||
|
</Text>
|
||||||
|
</Container>
|
||||||
|
<Container marginBottom={SPACING_BETWEEN_PX}>
|
||||||
|
{moreInfoSettings && (
|
||||||
|
<Text
|
||||||
|
center={true}
|
||||||
|
fontSize="13px"
|
||||||
|
textDecorationLine="underline"
|
||||||
|
fontColor={ColorOption.lightGrey}
|
||||||
|
href={moreInfoSettings.href}
|
||||||
|
>
|
||||||
|
{moreInfoSettings.text}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
|
</Container>
|
||||||
|
</Flex>
|
||||||
|
<Container>{action}</Container>
|
||||||
|
</Container>
|
||||||
|
);
|
29
packages/instant/src/components/standard_sliding_panel.tsx
Normal file
29
packages/instant/src/components/standard_sliding_panel.tsx
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { SlideAnimationState, StandardSlidingPanelContent, StandardSlidingPanelSettings } from '../types';
|
||||||
|
|
||||||
|
import { InstallWalletPanelContent } from './install_wallet_panel_content';
|
||||||
|
import { SlidingPanel } from './sliding_panel';
|
||||||
|
|
||||||
|
export interface StandardSlidingPanelProps extends StandardSlidingPanelSettings {
|
||||||
|
onClose: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StandardSlidingPanel extends React.Component<StandardSlidingPanelProps> {
|
||||||
|
public render(): React.ReactNode {
|
||||||
|
const { animationState, content, onClose } = this.props;
|
||||||
|
return (
|
||||||
|
<SlidingPanel animationState={animationState} onClose={onClose}>
|
||||||
|
{this._getNodeForContent(content)}
|
||||||
|
</SlidingPanel>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
private readonly _getNodeForContent = (content: StandardSlidingPanelContent): React.ReactNode => {
|
||||||
|
switch (content) {
|
||||||
|
case StandardSlidingPanelContent.InstallWallet:
|
||||||
|
return <InstallWalletPanelContent />;
|
||||||
|
case StandardSlidingPanelContent.None:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@@ -2,7 +2,7 @@ import * as _ from 'lodash';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { PROGRESS_FINISH_ANIMATION_TIME_MS, PROGRESS_STALL_AT_WIDTH } from '../constants';
|
import { PROGRESS_FINISH_ANIMATION_TIME_MS, PROGRESS_STALL_AT_WIDTH } from '../constants';
|
||||||
import { ColorOption, keyframes, styled } from '../style/theme';
|
import { ColorOption, css, keyframes, styled } from '../style/theme';
|
||||||
|
|
||||||
import { Container } from './ui/container';
|
import { Container } from './ui/container';
|
||||||
|
|
||||||
@@ -20,15 +20,11 @@ export class TimedProgressBar extends React.Component<TimedProgressBarProps, {}>
|
|||||||
private readonly _barRef = React.createRef<HTMLDivElement>();
|
private readonly _barRef = React.createRef<HTMLDivElement>();
|
||||||
|
|
||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
const timedProgressProps = this._calculateTimedProgressProps();
|
const widthAnimationSettings = this._calculateWidthAnimationSettings();
|
||||||
return (
|
return <ProgressBar animationSettings={widthAnimationSettings} ref={this._barRef} />;
|
||||||
<Container width="100%" backgroundColor={ColorOption.lightGrey} borderRadius="6px">
|
|
||||||
<TimedProgress {...timedProgressProps} ref={this._barRef as any} />
|
|
||||||
</Container>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private _calculateTimedProgressProps(): TimedProgressProps {
|
private _calculateWidthAnimationSettings(): WidthAnimationSettings {
|
||||||
if (this.props.hasEnded) {
|
if (this.props.hasEnded) {
|
||||||
if (!this._barRef.current) {
|
if (!this._barRef.current) {
|
||||||
throw new Error('ended but no reference');
|
throw new Error('ended but no reference');
|
||||||
@@ -60,21 +56,45 @@ const expandingWidthKeyframes = (fromWidth: string, toWidth: string) => {
|
|||||||
`;
|
`;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface TimedProgressProps {
|
export interface WidthAnimationSettings {
|
||||||
timeMs: number;
|
timeMs: number;
|
||||||
fromWidth: string;
|
fromWidth: string;
|
||||||
toWidth: string;
|
toWidth: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TimedProgress =
|
interface ProgressProps {
|
||||||
|
width?: string;
|
||||||
|
animationSettings?: WidthAnimationSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Progress =
|
||||||
styled.div <
|
styled.div <
|
||||||
TimedProgressProps >
|
ProgressProps >
|
||||||
`
|
`
|
||||||
&& {
|
&& {
|
||||||
background-color: ${props => props.theme[ColorOption.primaryColor]};
|
background-color: ${props => props.theme[ColorOption.primaryColor]};
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
height: 6px;
|
height: 6px;
|
||||||
animation: ${props => expandingWidthKeyframes(props.fromWidth, props.toWidth)}
|
${props => (props.width ? `width: ${props.width};` : '')}
|
||||||
${props => props.timeMs}ms linear 1 forwards;
|
${props =>
|
||||||
|
props.animationSettings
|
||||||
|
? css`
|
||||||
|
animation: ${expandingWidthKeyframes(
|
||||||
|
props.animationSettings.fromWidth,
|
||||||
|
props.animationSettings.toWidth,
|
||||||
|
)}
|
||||||
|
${props.animationSettings.timeMs}ms linear 1 forwards;
|
||||||
|
`
|
||||||
|
: ''}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export interface ProgressBarProps extends ProgressProps {}
|
||||||
|
|
||||||
|
export const ProgressBar: React.ComponentType<ProgressBarProps & React.ClassAttributes<{}>> = React.forwardRef(
|
||||||
|
(props, ref) => (
|
||||||
|
<Container width="100%" backgroundColor={ColorOption.lightGrey} borderRadius="6px">
|
||||||
|
<Progress {...props} ref={ref as any} />
|
||||||
|
</Container>
|
||||||
|
),
|
||||||
|
);
|
||||||
|
@@ -2,6 +2,9 @@ import { darken, saturate } from 'polished';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { ColorOption, styled } from '../../style/theme';
|
import { ColorOption, styled } from '../../style/theme';
|
||||||
|
import { util } from '../../util/util';
|
||||||
|
|
||||||
|
export type ButtonOnClickHandler = (event: React.MouseEvent<HTMLElement>) => void;
|
||||||
|
|
||||||
export interface ButtonProps {
|
export interface ButtonProps {
|
||||||
backgroundColor?: ColorOption;
|
backgroundColor?: ColorOption;
|
||||||
@@ -12,15 +15,26 @@ export interface ButtonProps {
|
|||||||
padding?: string;
|
padding?: string;
|
||||||
type?: string;
|
type?: string;
|
||||||
isDisabled?: boolean;
|
isDisabled?: boolean;
|
||||||
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
href?: string;
|
||||||
|
onClick?: ButtonOnClickHandler;
|
||||||
className?: string;
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const PlainButton: React.StatelessComponent<ButtonProps> = ({ children, isDisabled, onClick, type, className }) => (
|
const PlainButton: React.StatelessComponent<ButtonProps> = ({
|
||||||
<button type={type} className={className} onClick={isDisabled ? undefined : onClick} disabled={isDisabled}>
|
children,
|
||||||
{children}
|
isDisabled,
|
||||||
</button>
|
onClick,
|
||||||
);
|
href,
|
||||||
|
type,
|
||||||
|
className,
|
||||||
|
}) => {
|
||||||
|
const computedOnClick = isDisabled ? undefined : href ? util.createOpenUrlInNewWindow(href) : onClick;
|
||||||
|
return (
|
||||||
|
<button type={type} className={className} onClick={computedOnClick} disabled={isDisabled}>
|
||||||
|
{children}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const darkenOnHoverAmount = 0.1;
|
const darkenOnHoverAmount = 0.1;
|
||||||
const darkenOnActiveAmount = 0.2;
|
const darkenOnActiveAmount = 0.2;
|
||||||
@@ -31,7 +45,7 @@ export const Button = styled(PlainButton)`
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-size: ${props => props.fontSize};
|
font-size: ${props => props.fontSize};
|
||||||
font-family: 'Inter UI', sans-serif;
|
font-family: 'Inter UI', sans-serif;
|
||||||
font-weight: 600;
|
font-weight: 500;
|
||||||
color: ${props => props.fontColor && props.theme[props.fontColor]};
|
color: ${props => props.fontColor && props.theme[props.fontColor]};
|
||||||
cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
|
cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
|
||||||
transition: background-color, opacity 0.5s ease;
|
transition: background-color, opacity 0.5s ease;
|
||||||
@@ -64,11 +78,10 @@ export const Button = styled(PlainButton)`
|
|||||||
|
|
||||||
Button.defaultProps = {
|
Button.defaultProps = {
|
||||||
backgroundColor: ColorOption.primaryColor,
|
backgroundColor: ColorOption.primaryColor,
|
||||||
borderColor: ColorOption.primaryColor,
|
|
||||||
width: 'auto',
|
width: 'auto',
|
||||||
isDisabled: false,
|
isDisabled: false,
|
||||||
padding: '.6em 1.2em',
|
padding: '.82em 1.2em',
|
||||||
fontSize: '15px',
|
fontSize: '16px',
|
||||||
};
|
};
|
||||||
|
|
||||||
Button.displayName = 'Button';
|
Button.displayName = 'Button';
|
||||||
|
@@ -20,6 +20,7 @@ interface IconInfoMapping {
|
|||||||
success: IconInfo;
|
success: IconInfo;
|
||||||
chevron: IconInfo;
|
chevron: IconInfo;
|
||||||
search: IconInfo;
|
search: IconInfo;
|
||||||
|
lock: IconInfo;
|
||||||
}
|
}
|
||||||
const ICONS: IconInfoMapping = {
|
const ICONS: IconInfoMapping = {
|
||||||
closeX: {
|
closeX: {
|
||||||
@@ -58,6 +59,11 @@ const ICONS: IconInfoMapping = {
|
|||||||
path:
|
path:
|
||||||
'M8.39404 5.19727C8.39404 6.96289 6.96265 8.39453 5.19702 8.39453C3.4314 8.39453 2 6.96289 2 5.19727C2 3.43164 3.4314 2 5.19702 2C6.96265 2 8.39404 3.43164 8.39404 5.19727ZM8.09668 9.51074C7.26855 10.0684 6.27075 10.3945 5.19702 10.3945C2.3269 10.3945 0 8.06738 0 5.19727C0 2.32715 2.3269 0 5.19702 0C8.06738 0 10.394 2.32715 10.394 5.19727C10.394 6.27051 10.0686 7.26855 9.51074 8.09668L13.6997 12.2861L12.2854 13.7002L8.09668 9.51074Z',
|
'M8.39404 5.19727C8.39404 6.96289 6.96265 8.39453 5.19702 8.39453C3.4314 8.39453 2 6.96289 2 5.19727C2 3.43164 3.4314 2 5.19702 2C6.96265 2 8.39404 3.43164 8.39404 5.19727ZM8.09668 9.51074C7.26855 10.0684 6.27075 10.3945 5.19702 10.3945C2.3269 10.3945 0 8.06738 0 5.19727C0 2.32715 2.3269 0 5.19702 0C8.06738 0 10.394 2.32715 10.394 5.19727C10.394 6.27051 10.0686 7.26855 9.51074 8.09668L13.6997 12.2861L12.2854 13.7002L8.09668 9.51074Z',
|
||||||
},
|
},
|
||||||
|
lock: {
|
||||||
|
viewBox: '0 0 13 16',
|
||||||
|
path:
|
||||||
|
'M6.47619 0C3.79509 0 1.60489 2.21216 1.60489 4.92014V6.33135C0.717479 6.33135 0 7.05602 0 7.95232V14.379C0 15.2753 0.717479 16 1.60489 16H11.3475C12.2349 16 12.9524 15.2753 12.9524 14.379V7.95232C12.9524 7.05602 12.2349 6.33135 11.3475 6.33135V4.92014C11.3475 2.21216 9.1573 0 6.47619 0ZM9.6482 6.33135H3.30418V4.92014C3.30418 3.16567 4.72026 1.71633 6.47619 1.71633C8.23213 1.71633 9.6482 3.16567 9.6482 4.92014V6.33135Z',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface IconProps {
|
export interface IconProps {
|
||||||
|
@@ -2,6 +2,7 @@ import { darken } from 'polished';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { ColorOption, styled } from '../../style/theme';
|
import { ColorOption, styled } from '../../style/theme';
|
||||||
|
import { util } from '../../util/util';
|
||||||
|
|
||||||
export interface TextProps {
|
export interface TextProps {
|
||||||
fontColor?: ColorOption;
|
fontColor?: ColorOption;
|
||||||
@@ -20,10 +21,16 @@ export interface TextProps {
|
|||||||
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
||||||
noWrap?: boolean;
|
noWrap?: boolean;
|
||||||
display?: string;
|
display?: string;
|
||||||
|
href?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const Text: React.StatelessComponent<TextProps> = ({ href, onClick, ...rest }) => {
|
||||||
|
const computedOnClick = href ? util.createOpenUrlInNewWindow(href) : onClick;
|
||||||
|
return <StyledText {...rest} onClick={computedOnClick} />;
|
||||||
|
};
|
||||||
|
|
||||||
const darkenOnHoverAmount = 0.3;
|
const darkenOnHoverAmount = 0.3;
|
||||||
export const Text =
|
export const StyledText =
|
||||||
styled.div <
|
styled.div <
|
||||||
TextProps >
|
TextProps >
|
||||||
`
|
`
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { ZeroExInstantContainer } from '../components/zero_ex_instant_container';
|
||||||
|
|
||||||
import { INJECTED_DIV_CLASS } from '../constants';
|
import { INJECTED_DIV_CLASS } from '../constants';
|
||||||
|
|
||||||
import { ZeroExInstantContainer } from './zero_ex_instant_container';
|
|
||||||
import { ZeroExInstantProvider, ZeroExInstantProviderProps } from './zero_ex_instant_provider';
|
import { ZeroExInstantProvider, ZeroExInstantProviderProps } from './zero_ex_instant_provider';
|
||||||
|
|
||||||
export type ZeroExInstantProps = ZeroExInstantProviderProps;
|
export type ZeroExInstantProps = ZeroExInstantProviderProps;
|
||||||
|
@@ -1,26 +1,29 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { AvailableERC20TokenSelector } from '../containers/available_erc20_token_selector';
|
import { AvailableERC20TokenSelector } from '../containers/available_erc20_token_selector';
|
||||||
|
import { ConnectedBuyOrderProgressOrPaymentMethod } from '../containers/connected_buy_order_progress_or_payment_method';
|
||||||
|
import { CurrentStandardSlidingPanel } from '../containers/current_standard_sliding_panel';
|
||||||
import { LatestBuyQuoteOrderDetails } from '../containers/latest_buy_quote_order_details';
|
import { LatestBuyQuoteOrderDetails } from '../containers/latest_buy_quote_order_details';
|
||||||
import { LatestError } from '../containers/latest_error';
|
import { LatestError } from '../containers/latest_error';
|
||||||
import { SelectedAssetBuyOrderProgress } from '../containers/selected_asset_buy_order_progress';
|
|
||||||
import { SelectedAssetBuyOrderStateButtons } from '../containers/selected_asset_buy_order_state_buttons';
|
import { SelectedAssetBuyOrderStateButtons } from '../containers/selected_asset_buy_order_state_buttons';
|
||||||
import { SelectedAssetInstantHeading } from '../containers/selected_asset_instant_heading';
|
import { SelectedAssetInstantHeading } from '../containers/selected_asset_instant_heading';
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { zIndex } from '../style/z_index';
|
import { zIndex } from '../style/z_index';
|
||||||
|
import { OrderProcessState, SlideAnimationState } from '../types';
|
||||||
|
|
||||||
import { SlideAnimationState } from './animations/slide_animation';
|
|
||||||
import { CSSReset } from './css_reset';
|
import { CSSReset } from './css_reset';
|
||||||
import { SlidingPanel } from './sliding_panel';
|
import { SlidingPanel } from './sliding_panel';
|
||||||
import { Container } from './ui/container';
|
import { Container } from './ui/container';
|
||||||
import { Flex } from './ui/flex';
|
import { Flex } from './ui/flex';
|
||||||
|
|
||||||
export interface ZeroExInstantContainerProps {}
|
export interface ZeroExInstantContainerProps {
|
||||||
|
orderProcessState: OrderProcessState;
|
||||||
|
}
|
||||||
export interface ZeroExInstantContainerState {
|
export interface ZeroExInstantContainerState {
|
||||||
tokenSelectionPanelAnimationState: SlideAnimationState;
|
tokenSelectionPanelAnimationState: SlideAnimationState;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ZeroExInstantContainer extends React.Component<ZeroExInstantContainerProps, ZeroExInstantContainerState> {
|
export class ZeroExInstantContainer extends React.Component<{}, ZeroExInstantContainerState> {
|
||||||
public state = {
|
public state = {
|
||||||
tokenSelectionPanelAnimationState: 'none' as SlideAnimationState,
|
tokenSelectionPanelAnimationState: 'none' as SlideAnimationState,
|
||||||
};
|
};
|
||||||
@@ -47,19 +50,19 @@ export class ZeroExInstantContainer extends React.Component<ZeroExInstantContain
|
|||||||
>
|
>
|
||||||
<Flex direction="column" justify="flex-start" height="100%">
|
<Flex direction="column" justify="flex-start" height="100%">
|
||||||
<SelectedAssetInstantHeading onSelectAssetClick={this._handleSymbolClick} />
|
<SelectedAssetInstantHeading onSelectAssetClick={this._handleSymbolClick} />
|
||||||
<SelectedAssetBuyOrderProgress />
|
<ConnectedBuyOrderProgressOrPaymentMethod />
|
||||||
<LatestBuyQuoteOrderDetails />
|
<LatestBuyQuoteOrderDetails />
|
||||||
<Container padding="20px" width="100%">
|
<Container padding="20px" width="100%">
|
||||||
<SelectedAssetBuyOrderStateButtons />
|
<SelectedAssetBuyOrderStateButtons />
|
||||||
</Container>
|
</Container>
|
||||||
</Flex>
|
</Flex>
|
||||||
<SlidingPanel
|
<SlidingPanel
|
||||||
title="Select Token"
|
|
||||||
animationState={this.state.tokenSelectionPanelAnimationState}
|
animationState={this.state.tokenSelectionPanelAnimationState}
|
||||||
onClose={this._handlePanelClose}
|
onClose={this._handlePanelClose}
|
||||||
>
|
>
|
||||||
<AvailableERC20TokenSelector onTokenSelect={this._handlePanelClose} />
|
<AvailableERC20TokenSelector onTokenSelect={this._handlePanelClose} />
|
||||||
</SlidingPanel>
|
</SlidingPanel>
|
||||||
|
<CurrentStandardSlidingPanel />
|
||||||
</Container>
|
</Container>
|
||||||
</Container>
|
</Container>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { ZeroExInstantContainer } from '../components/zero_ex_instant_container';
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
|
|
||||||
import { Container } from './ui/container';
|
import { Container } from './ui/container';
|
||||||
import { Flex } from './ui/flex';
|
import { Flex } from './ui/flex';
|
||||||
import { Icon } from './ui/icon';
|
import { Icon } from './ui/icon';
|
||||||
import { Overlay } from './ui/overlay';
|
import { Overlay } from './ui/overlay';
|
||||||
import { ZeroExInstantContainer } from './zero_ex_instant_container';
|
|
||||||
import { ZeroExInstantProvider, ZeroExInstantProviderProps } from './zero_ex_instant_provider';
|
import { ZeroExInstantProvider, ZeroExInstantProviderProps } from './zero_ex_instant_provider';
|
||||||
|
|
||||||
export interface ZeroExInstantOverlayProps extends ZeroExInstantProviderProps {
|
export interface ZeroExInstantOverlayProps extends ZeroExInstantProviderProps {
|
||||||
|
@@ -73,7 +73,7 @@ export class ZeroExInstantProvider extends React.Component<ZeroExInstantProvider
|
|||||||
completeAssetMetaDataMap,
|
completeAssetMetaDataMap,
|
||||||
networkId,
|
networkId,
|
||||||
),
|
),
|
||||||
selectedAssetAmount: _.isUndefined(props.defaultAssetBuyAmount)
|
selectedAssetUnitAmount: _.isUndefined(props.defaultAssetBuyAmount)
|
||||||
? undefined
|
? undefined
|
||||||
: new BigNumber(props.defaultAssetBuyAmount),
|
: new BigNumber(props.defaultAssetBuyAmount),
|
||||||
availableAssets: _.isUndefined(props.availableAssetDatas)
|
availableAssets: _.isUndefined(props.availableAssetDatas)
|
||||||
@@ -91,12 +91,13 @@ export class ZeroExInstantProvider extends React.Component<ZeroExInstantProvider
|
|||||||
}
|
}
|
||||||
public componentDidMount(): void {
|
public componentDidMount(): void {
|
||||||
const state = this._store.getState();
|
const state = this._store.getState();
|
||||||
|
const dispatch = this._store.dispatch;
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
asyncData.fetchEthPriceAndDispatchToStore(this._store);
|
asyncData.fetchEthPriceAndDispatchToStore(dispatch);
|
||||||
// fetch available assets if none are specified
|
// fetch available assets if none are specified
|
||||||
if (_.isUndefined(state.availableAssets)) {
|
if (_.isUndefined(state.availableAssets)) {
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
asyncData.fetchAvailableAssetDatasAndDispatchToStore(this._store);
|
asyncData.fetchAvailableAssetDatasAndDispatchToStore(state, dispatch);
|
||||||
}
|
}
|
||||||
if (state.providerState.account.state !== AccountState.None) {
|
if (state.providerState.account.state !== AccountState.None) {
|
||||||
this._accountUpdateHeartbeat = generateAccountHeartbeater({
|
this._accountUpdateHeartbeat = generateAccountHeartbeater({
|
||||||
@@ -112,7 +113,7 @@ export class ZeroExInstantProvider extends React.Component<ZeroExInstantProvider
|
|||||||
});
|
});
|
||||||
this._buyQuoteHeartbeat.start(BUY_QUOTE_UPDATE_INTERVAL_TIME_MS);
|
this._buyQuoteHeartbeat.start(BUY_QUOTE_UPDATE_INTERVAL_TIME_MS);
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
asyncData.fetchCurrentBuyQuoteAndDispatchToStore({ store: this._store, shouldSetPending: true });
|
asyncData.fetchCurrentBuyQuoteAndDispatchToStore(state, dispatch, true);
|
||||||
// warm up the gas price estimator cache just in case we can't
|
// warm up the gas price estimator cache just in case we can't
|
||||||
// grab the gas price estimate when submitting the transaction
|
// grab the gas price estimate when submitting the transaction
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
|
@@ -19,6 +19,9 @@ export const ETH_GAS_STATION_API_BASE_URL = 'https://ethgasstation.info';
|
|||||||
export const COINBASE_API_BASE_URL = 'https://api.coinbase.com/v2';
|
export const COINBASE_API_BASE_URL = 'https://api.coinbase.com/v2';
|
||||||
export const PROGRESS_STALL_AT_WIDTH = '95%';
|
export const PROGRESS_STALL_AT_WIDTH = '95%';
|
||||||
export const PROGRESS_FINISH_ANIMATION_TIME_MS = 200;
|
export const PROGRESS_FINISH_ANIMATION_TIME_MS = 200;
|
||||||
|
export const META_MASK_CHROME_STORE_URL =
|
||||||
|
'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=en';
|
||||||
|
export const META_MASK_SITE_URL = 'https://metamask.io/';
|
||||||
export const ETHEREUM_NODE_URL_BY_NETWORK = {
|
export const ETHEREUM_NODE_URL_BY_NETWORK = {
|
||||||
[Network.Mainnet]: 'https://mainnet.infura.io/',
|
[Network.Mainnet]: 'https://mainnet.infura.io/',
|
||||||
[Network.Kovan]: 'https://kovan.infura.io/',
|
[Network.Kovan]: 'https://kovan.infura.io/',
|
||||||
|
@@ -0,0 +1,59 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { Dispatch } from 'redux';
|
||||||
|
|
||||||
|
import { PaymentMethod, PaymentMethodProps } from '../components/payment_method';
|
||||||
|
import { Action, actions } from '../redux/actions';
|
||||||
|
import { asyncData } from '../redux/async_data';
|
||||||
|
import { State } from '../redux/reducer';
|
||||||
|
import { Network, Omit, ProviderState, StandardSlidingPanelContent } from '../types';
|
||||||
|
|
||||||
|
export interface ConnectedAccountPaymentMethodProps {}
|
||||||
|
|
||||||
|
interface ConnectedState {
|
||||||
|
network: Network;
|
||||||
|
providerState: ProviderState;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConnectedDispatch {
|
||||||
|
onInstallWalletClick: () => void;
|
||||||
|
unlockWalletAndDispatchToStore: (providerState: ProviderState) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConnectedProps = Omit<PaymentMethodProps, keyof ConnectedAccountPaymentMethodProps>;
|
||||||
|
|
||||||
|
type FinalProps = ConnectedProps & ConnectedAccountPaymentMethodProps;
|
||||||
|
|
||||||
|
const mapStateToProps = (state: State, _ownProps: ConnectedAccountPaymentMethodProps): ConnectedState => ({
|
||||||
|
network: state.network,
|
||||||
|
providerState: state.providerState,
|
||||||
|
});
|
||||||
|
|
||||||
|
const mapDispatchToProps = (
|
||||||
|
dispatch: Dispatch<Action>,
|
||||||
|
ownProps: ConnectedAccountPaymentMethodProps,
|
||||||
|
): ConnectedDispatch => ({
|
||||||
|
onInstallWalletClick: () => dispatch(actions.openStandardSlidingPanel(StandardSlidingPanelContent.InstallWallet)),
|
||||||
|
unlockWalletAndDispatchToStore: async (providerState: ProviderState) =>
|
||||||
|
asyncData.fetchAccountInfoAndDispatchToStore(providerState, dispatch, true),
|
||||||
|
});
|
||||||
|
|
||||||
|
const mergeProps = (
|
||||||
|
connectedState: ConnectedState,
|
||||||
|
connectedDispatch: ConnectedDispatch,
|
||||||
|
ownProps: ConnectedAccountPaymentMethodProps,
|
||||||
|
): FinalProps => ({
|
||||||
|
...ownProps,
|
||||||
|
network: connectedState.network,
|
||||||
|
account: connectedState.providerState.account,
|
||||||
|
onInstallWalletClick: connectedDispatch.onInstallWalletClick,
|
||||||
|
onUnlockWalletClick: () => {
|
||||||
|
connectedDispatch.unlockWalletAndDispatchToStore(connectedState.providerState);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ConnectedAccountPaymentMethod: React.ComponentClass<ConnectedAccountPaymentMethodProps> = connect(
|
||||||
|
mapStateToProps,
|
||||||
|
mapDispatchToProps,
|
||||||
|
mergeProps,
|
||||||
|
)(PaymentMethod);
|
@@ -0,0 +1,36 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
import { State } from '../redux/reducer';
|
||||||
|
import { OrderProcessState } from '../types';
|
||||||
|
|
||||||
|
import { ConnectedAccountPaymentMethod } from './connected_account_payment_method';
|
||||||
|
import { SelectedAssetBuyOrderProgress } from './selected_asset_buy_order_progress';
|
||||||
|
|
||||||
|
interface BuyOrderProgressOrPaymentMethodProps {
|
||||||
|
orderProcessState: OrderProcessState;
|
||||||
|
}
|
||||||
|
export const BuyOrderProgressOrPaymentMethod = (props: BuyOrderProgressOrPaymentMethodProps) => {
|
||||||
|
const { orderProcessState } = props;
|
||||||
|
if (
|
||||||
|
orderProcessState === OrderProcessState.Processing ||
|
||||||
|
orderProcessState === OrderProcessState.Success ||
|
||||||
|
orderProcessState === OrderProcessState.Failure
|
||||||
|
) {
|
||||||
|
return <SelectedAssetBuyOrderProgress />;
|
||||||
|
}
|
||||||
|
if (orderProcessState === OrderProcessState.None) {
|
||||||
|
return <ConnectedAccountPaymentMethod />;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface ConnectedState extends BuyOrderProgressOrPaymentMethodProps {}
|
||||||
|
|
||||||
|
export interface ConnectedBuyOrderProgressOrPaymentMethodProps {}
|
||||||
|
const mapStateToProps = (state: State, _ownProps: ConnectedBuyOrderProgressOrPaymentMethodProps): ConnectedState => ({
|
||||||
|
orderProcessState: state.buyOrderState.processState,
|
||||||
|
});
|
||||||
|
export const ConnectedBuyOrderProgressOrPaymentMethod: React.ComponentClass<
|
||||||
|
ConnectedBuyOrderProgressOrPaymentMethodProps
|
||||||
|
> = connect(mapStateToProps)(BuyOrderProgressOrPaymentMethod);
|
@@ -0,0 +1,31 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { Dispatch } from 'redux';
|
||||||
|
|
||||||
|
import { StandardSlidingPanel } from '../components/standard_sliding_panel';
|
||||||
|
import { Action, actions } from '../redux/actions';
|
||||||
|
import { State } from '../redux/reducer';
|
||||||
|
import { StandardSlidingPanelSettings } from '../types';
|
||||||
|
|
||||||
|
export interface CurrentStandardSlidingPanelProps {}
|
||||||
|
|
||||||
|
interface ConnectedState extends StandardSlidingPanelSettings {}
|
||||||
|
|
||||||
|
interface ConnectedDispatch {
|
||||||
|
onClose: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapStateToProps = (state: State, _ownProps: CurrentStandardSlidingPanelProps): ConnectedState =>
|
||||||
|
state.standardSlidingPanelSettings;
|
||||||
|
|
||||||
|
const mapDispatchToProps = (
|
||||||
|
dispatch: Dispatch<Action>,
|
||||||
|
ownProps: CurrentStandardSlidingPanelProps,
|
||||||
|
): ConnectedDispatch => ({
|
||||||
|
onClose: () => dispatch(actions.closeStandardSlidingPanel()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const CurrentStandardSlidingPanel: React.ComponentClass<CurrentStandardSlidingPanelProps> = connect(
|
||||||
|
mapStateToProps,
|
||||||
|
mapDispatchToProps,
|
||||||
|
)(StandardSlidingPanel);
|
@@ -14,6 +14,7 @@ export interface LatestBuyQuoteOrderDetailsProps {}
|
|||||||
|
|
||||||
interface ConnectedState {
|
interface ConnectedState {
|
||||||
buyQuoteInfo?: BuyQuoteInfo;
|
buyQuoteInfo?: BuyQuoteInfo;
|
||||||
|
selectedAssetUnitAmount?: BigNumber;
|
||||||
ethUsdPrice?: BigNumber;
|
ethUsdPrice?: BigNumber;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
}
|
}
|
||||||
@@ -21,6 +22,7 @@ interface ConnectedState {
|
|||||||
const mapStateToProps = (state: State, _ownProps: LatestBuyQuoteOrderDetailsProps): ConnectedState => ({
|
const mapStateToProps = (state: State, _ownProps: LatestBuyQuoteOrderDetailsProps): ConnectedState => ({
|
||||||
// use the worst case quote info
|
// use the worst case quote info
|
||||||
buyQuoteInfo: oc(state).latestBuyQuote.worstCaseQuoteInfo(),
|
buyQuoteInfo: oc(state).latestBuyQuote.worstCaseQuoteInfo(),
|
||||||
|
selectedAssetUnitAmount: state.selectedAssetUnitAmount,
|
||||||
ethUsdPrice: state.ethUsdPrice,
|
ethUsdPrice: state.ethUsdPrice,
|
||||||
isLoading: state.quoteRequestState === AsyncProcessState.Pending,
|
isLoading: state.quoteRequestState === AsyncProcessState.Pending,
|
||||||
});
|
});
|
||||||
|
@@ -3,7 +3,6 @@ import * as React from 'react';
|
|||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { Dispatch } from 'redux';
|
import { Dispatch } from 'redux';
|
||||||
|
|
||||||
import { SlideAnimationState } from '../components/animations/slide_animation';
|
|
||||||
import { SlidingError } from '../components/sliding_error';
|
import { SlidingError } from '../components/sliding_error';
|
||||||
import { Overlay } from '../components/ui/overlay';
|
import { Overlay } from '../components/ui/overlay';
|
||||||
import { Action } from '../redux/actions';
|
import { Action } from '../redux/actions';
|
||||||
@@ -11,7 +10,7 @@ import { State } from '../redux/reducer';
|
|||||||
import { ScreenWidths } from '../style/media';
|
import { ScreenWidths } from '../style/media';
|
||||||
import { generateOverlayBlack } from '../style/theme';
|
import { generateOverlayBlack } from '../style/theme';
|
||||||
import { zIndex } from '../style/z_index';
|
import { zIndex } from '../style/z_index';
|
||||||
import { Asset, DisplayStatus, Omit } from '../types';
|
import { Asset, DisplayStatus, Omit, SlideAnimationState } from '../types';
|
||||||
import { errorFlasher } from '../util/error_flasher';
|
import { errorFlasher } from '../util/error_flasher';
|
||||||
|
|
||||||
export interface LatestErrorComponentProps {
|
export interface LatestErrorComponentProps {
|
||||||
|
@@ -14,16 +14,16 @@ export interface InstantHeadingProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface ConnectedState {
|
interface ConnectedState {
|
||||||
selectedAssetAmount?: BigNumber;
|
selectedAssetUnitAmount?: BigNumber;
|
||||||
totalEthBaseAmount?: BigNumber;
|
totalEthBaseUnitAmount?: BigNumber;
|
||||||
ethUsdPrice?: BigNumber;
|
ethUsdPrice?: BigNumber;
|
||||||
quoteRequestState: AsyncProcessState;
|
quoteRequestState: AsyncProcessState;
|
||||||
buyOrderState: OrderState;
|
buyOrderState: OrderState;
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = (state: State, _ownProps: InstantHeadingProps): ConnectedState => ({
|
const mapStateToProps = (state: State, _ownProps: InstantHeadingProps): ConnectedState => ({
|
||||||
selectedAssetAmount: state.selectedAssetAmount,
|
selectedAssetUnitAmount: state.selectedAssetUnitAmount,
|
||||||
totalEthBaseAmount: oc(state).latestBuyQuote.worstCaseQuoteInfo.totalEthAmount(),
|
totalEthBaseUnitAmount: oc(state).latestBuyQuote.worstCaseQuoteInfo.totalEthAmount(),
|
||||||
ethUsdPrice: state.ethUsdPrice,
|
ethUsdPrice: state.ethUsdPrice,
|
||||||
quoteRequestState: state.quoteRequestState,
|
quoteRequestState: state.quoteRequestState,
|
||||||
buyOrderState: state.buyOrderState,
|
buyOrderState: state.buyOrderState,
|
||||||
|
@@ -6,11 +6,11 @@ import * as React from 'react';
|
|||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { Dispatch } from 'redux';
|
import { Dispatch } from 'redux';
|
||||||
|
|
||||||
import { ERC20AssetAmountInput } from '../components/erc20_asset_amount_input';
|
import { ERC20AssetAmountInput, ERC20AssetAmountInputProps } from '../components/erc20_asset_amount_input';
|
||||||
import { Action, actions } from '../redux/actions';
|
import { Action, actions } from '../redux/actions';
|
||||||
import { State } from '../redux/reducer';
|
import { State } from '../redux/reducer';
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { AffiliateInfo, ERC20Asset, OrderProcessState } from '../types';
|
import { AffiliateInfo, ERC20Asset, Omit, OrderProcessState } from '../types';
|
||||||
import { buyQuoteUpdater } from '../util/buy_quote_updater';
|
import { buyQuoteUpdater } from '../util/buy_quote_updater';
|
||||||
|
|
||||||
export interface SelectedERC20AssetAmountInputProps {
|
export interface SelectedERC20AssetAmountInputProps {
|
||||||
@@ -37,13 +37,7 @@ interface ConnectedDispatch {
|
|||||||
) => void;
|
) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ConnectedProps {
|
type ConnectedProps = Omit<ERC20AssetAmountInputProps, keyof SelectedERC20AssetAmountInputProps>;
|
||||||
value?: BigNumber;
|
|
||||||
asset?: ERC20Asset;
|
|
||||||
onChange: (value?: BigNumber, asset?: ERC20Asset) => void;
|
|
||||||
isDisabled: boolean;
|
|
||||||
numberOfAssetsAvailable?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
type FinalProps = ConnectedProps & SelectedERC20AssetAmountInputProps;
|
type FinalProps = ConnectedProps & SelectedERC20AssetAmountInputProps;
|
||||||
|
|
||||||
@@ -59,7 +53,7 @@ const mapStateToProps = (state: State, _ownProps: SelectedERC20AssetAmountInputP
|
|||||||
const assetBuyer = state.providerState.assetBuyer;
|
const assetBuyer = state.providerState.assetBuyer;
|
||||||
return {
|
return {
|
||||||
assetBuyer,
|
assetBuyer,
|
||||||
value: state.selectedAssetAmount,
|
value: state.selectedAssetUnitAmount,
|
||||||
asset: selectedAsset,
|
asset: selectedAsset,
|
||||||
isDisabled,
|
isDisabled,
|
||||||
numberOfAssetsAvailable,
|
numberOfAssetsAvailable,
|
||||||
|
@@ -8,42 +8,42 @@ export const assetMetaDataMap: ObjectMap<AssetMetaData> = {
|
|||||||
'0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498': {
|
'0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
primaryColor: 'rgb(54, 50, 60)',
|
primaryColor: '#333333',
|
||||||
symbol: 'zrx',
|
symbol: 'zrx',
|
||||||
name: '0x',
|
name: '0x',
|
||||||
},
|
},
|
||||||
'0xf47261b000000000000000000000000042d6622dece394b54999fbd73d108123806f6a18': {
|
'0xf47261b000000000000000000000000042d6622dece394b54999fbd73d108123806f6a18': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
primaryColor: '#ec3e6c',
|
primaryColor: '#EC4F81',
|
||||||
symbol: 'spank',
|
symbol: 'spank',
|
||||||
name: 'Spank',
|
name: 'Spank',
|
||||||
},
|
},
|
||||||
'0xf47261b0000000000000000000000000d26114cd6ee289accf82350c8d8487fedb8a0c07': {
|
'0xf47261b0000000000000000000000000d26114cd6ee289accf82350c8d8487fedb8a0c07': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
primaryColor: '#2e61ea',
|
primaryColor: '#2458E7',
|
||||||
symbol: 'omg',
|
symbol: 'omg',
|
||||||
name: 'OmiseGo',
|
name: 'OmiseGo',
|
||||||
},
|
},
|
||||||
'0xf47261b00000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2': {
|
'0xf47261b00000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
primaryColor: '#87e4ca',
|
primaryColor: '#68CCBB',
|
||||||
symbol: 'mkr',
|
symbol: 'mkr',
|
||||||
name: 'Maker',
|
name: 'Maker',
|
||||||
},
|
},
|
||||||
'0xf47261b00000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef': {
|
'0xf47261b00000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
primaryColor: '#9c326c',
|
primaryColor: '#FF5000',
|
||||||
symbol: 'bat',
|
symbol: 'bat',
|
||||||
name: 'Basic Attention Token',
|
name: 'Basic Attention Token',
|
||||||
},
|
},
|
||||||
'0xf47261b0000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e': {
|
'0xf47261b0000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
primaryColor: '#5663b0',
|
primaryColor: '#4763D7',
|
||||||
symbol: 'snt',
|
symbol: 'snt',
|
||||||
name: 'Status',
|
name: 'Status',
|
||||||
},
|
},
|
||||||
@@ -54,27 +54,6 @@ export const assetMetaDataMap: ObjectMap<AssetMetaData> = {
|
|||||||
symbol: 'mana',
|
symbol: 'mana',
|
||||||
name: 'Decentraland',
|
name: 'Decentraland',
|
||||||
},
|
},
|
||||||
'0xf47261b0000000000000000000000000a74476443119a942de498590fe1f2454d7d4ac0d': {
|
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
|
||||||
decimals: 18,
|
|
||||||
primaryColor: '#263469',
|
|
||||||
symbol: 'gnt',
|
|
||||||
name: 'Golem',
|
|
||||||
},
|
|
||||||
'0xf47261b000000000000000000000000012480e24eb5bec1a9d4369cab6a80cad3c0a377a': {
|
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
|
||||||
decimals: 18,
|
|
||||||
primaryColor: '#de5445',
|
|
||||||
symbol: 'sub',
|
|
||||||
name: 'Substratum',
|
|
||||||
},
|
|
||||||
'0xf47261b000000000000000000000000008d32b0da63e2C3bcF8019c9c5d849d7a9d791e6': {
|
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
|
||||||
decimals: 18,
|
|
||||||
primaryColor: '#000',
|
|
||||||
symbol: 'dentacoin',
|
|
||||||
name: 'Dentacoin',
|
|
||||||
},
|
|
||||||
'0xf47261b00000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e862': {
|
'0xf47261b00000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e862': {
|
||||||
assetProxyId: AssetProxyId.ERC20,
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
decimals: 18,
|
decimals: 18,
|
||||||
@@ -82,4 +61,144 @@ export const assetMetaDataMap: ObjectMap<AssetMetaData> = {
|
|||||||
symbol: 'rep',
|
symbol: 'rep',
|
||||||
name: 'Augur',
|
name: 'Augur',
|
||||||
},
|
},
|
||||||
|
'0xf47261b00000000000000000000000000abdace70d3790235af448c88547603b945604ea': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#2c3c8c',
|
||||||
|
symbol: 'dnt',
|
||||||
|
name: 'district0x',
|
||||||
|
},
|
||||||
|
'0xf47261b000000000000000000000000005f4a42e251f2d52b8ed15e9fedaacfcef1fad27': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 12,
|
||||||
|
primaryColor: '#048998',
|
||||||
|
symbol: 'zil',
|
||||||
|
name: 'Zilliqa',
|
||||||
|
},
|
||||||
|
'0xf47261b00000000000000000000000008f8221afbb33998d8584a2b05749ba73c37a938a': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#58BFD6',
|
||||||
|
symbol: 'req',
|
||||||
|
name: 'Request Network',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000e0b7927c4af23765cb51314a0e0521a9645f0e2a': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 9,
|
||||||
|
primaryColor: '#BC9952',
|
||||||
|
symbol: 'dgd',
|
||||||
|
name: 'DigixDao',
|
||||||
|
},
|
||||||
|
'0xf47261b00000000000000000000000004f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 9,
|
||||||
|
primaryColor: '#DEB564',
|
||||||
|
symbol: 'dgx',
|
||||||
|
name: 'Digix Gold Token',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000419d0d8bdd9af5e606ae2232ed285aff190e711b': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 8,
|
||||||
|
primaryColor: '#E40057',
|
||||||
|
symbol: 'fun',
|
||||||
|
name: 'FunFair',
|
||||||
|
},
|
||||||
|
'0xf47261b000000000000000000000000041e5560054824ea6b0732e656e3ad64e20e94e45': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 8,
|
||||||
|
primaryColor: '#04bc24',
|
||||||
|
symbol: 'cvc',
|
||||||
|
name: 'Civic',
|
||||||
|
},
|
||||||
|
'0xf47261b00000000000000000000000005ca9a71b1d01849c0a95490cc00559717fcf0d1d': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#F7296E',
|
||||||
|
symbol: 'ae',
|
||||||
|
name: 'Aeternity',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000408e41876cccdc0f92210600ef50372656052a38': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#233C5A',
|
||||||
|
symbol: 'ren',
|
||||||
|
name: 'Republic Protocol',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#325CD2',
|
||||||
|
symbol: 'link',
|
||||||
|
name: 'ChainLink',
|
||||||
|
},
|
||||||
|
'0xf47261b00000000000000000000000006810e776880c02933d47db1b9fc05908e5386b96': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#48A4C0',
|
||||||
|
symbol: 'gno',
|
||||||
|
name: 'Gnosis',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000960b236a07cf122663c4303350609a66a7b288c0': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#04a29e',
|
||||||
|
symbol: 'ant',
|
||||||
|
name: 'Aragon',
|
||||||
|
},
|
||||||
|
'0xf47261b00000000000000000000000004156d3342d5c385a87d264f90653733592000581': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 8,
|
||||||
|
primaryColor: '#4CABA7',
|
||||||
|
symbol: 'salt',
|
||||||
|
name: 'Salt',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a361269': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 6,
|
||||||
|
primaryColor: '#5BC9D4',
|
||||||
|
symbol: 'powr',
|
||||||
|
name: 'PowerLedger',
|
||||||
|
},
|
||||||
|
'0xf47261b00000000000000000000000008eb24319393716668d768dcec29356ae9cffe285': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 8,
|
||||||
|
primaryColor: '#523CE8',
|
||||||
|
symbol: 'agi',
|
||||||
|
name: 'SingularityNET',
|
||||||
|
},
|
||||||
|
'0xf47261b000000000000000000000000039bb259f66e1c59d5abef88375979b4d20d98022': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 8,
|
||||||
|
primaryColor: '#EDB740',
|
||||||
|
symbol: 'wax',
|
||||||
|
name: 'WAX',
|
||||||
|
},
|
||||||
|
'0xf47261b0000000000000000000000000beb9ef514a379b997e0798fdcc901ee474b6d9a1': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#333333',
|
||||||
|
symbol: 'mln',
|
||||||
|
name: 'Melon',
|
||||||
|
},
|
||||||
|
'0xf47261b000000000000000000000000058b6a8a3302369daec383334672404ee733ab239': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#232D37',
|
||||||
|
symbol: 'lpt',
|
||||||
|
name: 'Livepeer',
|
||||||
|
},
|
||||||
|
'0xf47261b000000000000000000000000027054b13b1b798b345b591a4d22e6562d47ea75a': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 4,
|
||||||
|
primaryColor: '#3A74F6',
|
||||||
|
symbol: 'ast',
|
||||||
|
name: 'AirSwap',
|
||||||
|
},
|
||||||
|
'0xf47261b000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359': {
|
||||||
|
assetProxyId: AssetProxyId.ERC20,
|
||||||
|
decimals: 18,
|
||||||
|
primaryColor: '#F2B350',
|
||||||
|
symbol: 'dai',
|
||||||
|
name: 'Dai Stablecoin',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
@@ -2,7 +2,7 @@ import { BuyQuote } from '@0x/asset-buyer';
|
|||||||
import { BigNumber } from '@0x/utils';
|
import { BigNumber } from '@0x/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { ActionsUnion, AddressAndEthBalanceInWei, Asset } from '../types';
|
import { ActionsUnion, AddressAndEthBalanceInWei, Asset, StandardSlidingPanelContent } from '../types';
|
||||||
|
|
||||||
export interface PlainAction<T extends string> {
|
export interface PlainAction<T extends string> {
|
||||||
type: T;
|
type: T;
|
||||||
@@ -26,7 +26,7 @@ export enum ActionTypes {
|
|||||||
SET_ACCOUNT_STATE_READY = 'SET_ACCOUNT_STATE_READY',
|
SET_ACCOUNT_STATE_READY = 'SET_ACCOUNT_STATE_READY',
|
||||||
UPDATE_ACCOUNT_ETH_BALANCE = 'UPDATE_ACCOUNT_ETH_BALANCE',
|
UPDATE_ACCOUNT_ETH_BALANCE = 'UPDATE_ACCOUNT_ETH_BALANCE',
|
||||||
UPDATE_ETH_USD_PRICE = 'UPDATE_ETH_USD_PRICE',
|
UPDATE_ETH_USD_PRICE = 'UPDATE_ETH_USD_PRICE',
|
||||||
UPDATE_SELECTED_ASSET_AMOUNT = 'UPDATE_SELECTED_ASSET_AMOUNT',
|
UPDATE_SELECTED_ASSET_UNIT_AMOUNT = 'UPDATE_SELECTED_ASSET_UNIT_AMOUNT',
|
||||||
SET_BUY_ORDER_STATE_NONE = 'SET_BUY_ORDER_STATE_NONE',
|
SET_BUY_ORDER_STATE_NONE = 'SET_BUY_ORDER_STATE_NONE',
|
||||||
SET_BUY_ORDER_STATE_VALIDATING = 'SET_BUY_ORDER_STATE_VALIDATING',
|
SET_BUY_ORDER_STATE_VALIDATING = 'SET_BUY_ORDER_STATE_VALIDATING',
|
||||||
SET_BUY_ORDER_STATE_PROCESSING = 'SET_BUY_ORDER_STATE_PROCESSING',
|
SET_BUY_ORDER_STATE_PROCESSING = 'SET_BUY_ORDER_STATE_PROCESSING',
|
||||||
@@ -41,6 +41,8 @@ export enum ActionTypes {
|
|||||||
HIDE_ERROR = 'HIDE_ERROR',
|
HIDE_ERROR = 'HIDE_ERROR',
|
||||||
CLEAR_ERROR = 'CLEAR_ERROR',
|
CLEAR_ERROR = 'CLEAR_ERROR',
|
||||||
RESET_AMOUNT = 'RESET_AMOUNT',
|
RESET_AMOUNT = 'RESET_AMOUNT',
|
||||||
|
OPEN_STANDARD_SLIDING_PANEL = 'OPEN_STANDARD_SLIDING_PANEL',
|
||||||
|
CLOSE_STANDARD_SLIDING_PANEL = 'CLOSE_STANDARD_SLIDING_PANEL',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const actions = {
|
export const actions = {
|
||||||
@@ -50,7 +52,8 @@ export const actions = {
|
|||||||
updateAccountEthBalance: (addressAndBalance: AddressAndEthBalanceInWei) =>
|
updateAccountEthBalance: (addressAndBalance: AddressAndEthBalanceInWei) =>
|
||||||
createAction(ActionTypes.UPDATE_ACCOUNT_ETH_BALANCE, addressAndBalance),
|
createAction(ActionTypes.UPDATE_ACCOUNT_ETH_BALANCE, addressAndBalance),
|
||||||
updateEthUsdPrice: (price?: BigNumber) => createAction(ActionTypes.UPDATE_ETH_USD_PRICE, price),
|
updateEthUsdPrice: (price?: BigNumber) => createAction(ActionTypes.UPDATE_ETH_USD_PRICE, price),
|
||||||
updateSelectedAssetAmount: (amount?: BigNumber) => createAction(ActionTypes.UPDATE_SELECTED_ASSET_AMOUNT, amount),
|
updateSelectedAssetAmount: (amount?: BigNumber) =>
|
||||||
|
createAction(ActionTypes.UPDATE_SELECTED_ASSET_UNIT_AMOUNT, amount),
|
||||||
setBuyOrderStateNone: () => createAction(ActionTypes.SET_BUY_ORDER_STATE_NONE),
|
setBuyOrderStateNone: () => createAction(ActionTypes.SET_BUY_ORDER_STATE_NONE),
|
||||||
setBuyOrderStateValidating: () => createAction(ActionTypes.SET_BUY_ORDER_STATE_VALIDATING),
|
setBuyOrderStateValidating: () => createAction(ActionTypes.SET_BUY_ORDER_STATE_VALIDATING),
|
||||||
setBuyOrderStateProcessing: (txHash: string, startTimeUnix: number, expectedEndTimeUnix: number) =>
|
setBuyOrderStateProcessing: (txHash: string, startTimeUnix: number, expectedEndTimeUnix: number) =>
|
||||||
@@ -66,4 +69,7 @@ export const actions = {
|
|||||||
hideError: () => createAction(ActionTypes.HIDE_ERROR),
|
hideError: () => createAction(ActionTypes.HIDE_ERROR),
|
||||||
clearError: () => createAction(ActionTypes.CLEAR_ERROR),
|
clearError: () => createAction(ActionTypes.CLEAR_ERROR),
|
||||||
resetAmount: () => createAction(ActionTypes.RESET_AMOUNT),
|
resetAmount: () => createAction(ActionTypes.RESET_AMOUNT),
|
||||||
|
openStandardSlidingPanel: (content: StandardSlidingPanelContent) =>
|
||||||
|
createAction(ActionTypes.OPEN_STANDARD_SLIDING_PANEL, content),
|
||||||
|
closeStandardSlidingPanel: () => createAction(ActionTypes.CLOSE_STANDARD_SLIDING_PANEL),
|
||||||
};
|
};
|
||||||
|
@@ -1,100 +1,102 @@
|
|||||||
import { AssetProxyId } from '@0x/types';
|
import { AssetProxyId } from '@0x/types';
|
||||||
|
import { Web3Wrapper } from '@0x/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
import { Dispatch } from 'redux';
|
||||||
|
|
||||||
import { BIG_NUMBER_ZERO } from '../constants';
|
import { BIG_NUMBER_ZERO } from '../constants';
|
||||||
import { AccountState, ERC20Asset, OrderProcessState } from '../types';
|
import { AccountState, ERC20Asset, OrderProcessState, ProviderState } from '../types';
|
||||||
import { assetUtils } from '../util/asset';
|
import { assetUtils } from '../util/asset';
|
||||||
import { buyQuoteUpdater } from '../util/buy_quote_updater';
|
import { buyQuoteUpdater } from '../util/buy_quote_updater';
|
||||||
import { coinbaseApi } from '../util/coinbase_api';
|
import { coinbaseApi } from '../util/coinbase_api';
|
||||||
import { errorFlasher } from '../util/error_flasher';
|
import { errorFlasher } from '../util/error_flasher';
|
||||||
|
|
||||||
import { actions } from './actions';
|
import { actions } from './actions';
|
||||||
import { Store } from './store';
|
import { State } from './reducer';
|
||||||
|
|
||||||
export const asyncData = {
|
export const asyncData = {
|
||||||
fetchEthPriceAndDispatchToStore: async (store: Store) => {
|
fetchEthPriceAndDispatchToStore: async (dispatch: Dispatch) => {
|
||||||
try {
|
try {
|
||||||
const ethUsdPrice = await coinbaseApi.getEthUsdPrice();
|
const ethUsdPrice = await coinbaseApi.getEthUsdPrice();
|
||||||
store.dispatch(actions.updateEthUsdPrice(ethUsdPrice));
|
dispatch(actions.updateEthUsdPrice(ethUsdPrice));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const errorMessage = 'Error fetching ETH/USD price';
|
const errorMessage = 'Error fetching ETH/USD price';
|
||||||
errorFlasher.flashNewErrorMessage(store.dispatch, errorMessage);
|
errorFlasher.flashNewErrorMessage(dispatch, errorMessage);
|
||||||
store.dispatch(actions.updateEthUsdPrice(BIG_NUMBER_ZERO));
|
dispatch(actions.updateEthUsdPrice(BIG_NUMBER_ZERO));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchAvailableAssetDatasAndDispatchToStore: async (store: Store) => {
|
fetchAvailableAssetDatasAndDispatchToStore: async (state: State, dispatch: Dispatch) => {
|
||||||
const { providerState, assetMetaDataMap, network } = store.getState();
|
const { providerState, assetMetaDataMap, network } = state;
|
||||||
const assetBuyer = providerState.assetBuyer;
|
const assetBuyer = providerState.assetBuyer;
|
||||||
try {
|
try {
|
||||||
const assetDatas = await assetBuyer.getAvailableAssetDatasAsync();
|
const assetDatas = await assetBuyer.getAvailableAssetDatasAsync();
|
||||||
const assets = assetUtils.createAssetsFromAssetDatas(assetDatas, assetMetaDataMap, network);
|
const assets = assetUtils.createAssetsFromAssetDatas(assetDatas, assetMetaDataMap, network);
|
||||||
store.dispatch(actions.setAvailableAssets(assets));
|
dispatch(actions.setAvailableAssets(assets));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const errorMessage = 'Could not find any assets';
|
const errorMessage = 'Could not find any assets';
|
||||||
errorFlasher.flashNewErrorMessage(store.dispatch, errorMessage);
|
errorFlasher.flashNewErrorMessage(dispatch, errorMessage);
|
||||||
// On error, just specify that none are available
|
// On error, just specify that none are available
|
||||||
store.dispatch(actions.setAvailableAssets([]));
|
dispatch(actions.setAvailableAssets([]));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchAccountInfoAndDispatchToStore: async (options: { store: Store; shouldSetToLoading: boolean }) => {
|
fetchAccountInfoAndDispatchToStore: async (
|
||||||
const { store, shouldSetToLoading } = options;
|
providerState: ProviderState,
|
||||||
const { providerState } = store.getState();
|
dispatch: Dispatch,
|
||||||
|
shouldAttemptUnlock: boolean = false,
|
||||||
|
shouldSetToLoading: boolean = false,
|
||||||
|
) => {
|
||||||
const web3Wrapper = providerState.web3Wrapper;
|
const web3Wrapper = providerState.web3Wrapper;
|
||||||
const provider = providerState.provider;
|
const provider = providerState.provider;
|
||||||
if (shouldSetToLoading && providerState.account.state !== AccountState.Loading) {
|
if (shouldSetToLoading && providerState.account.state !== AccountState.Loading) {
|
||||||
store.dispatch(actions.setAccountStateLoading());
|
dispatch(actions.setAccountStateLoading());
|
||||||
}
|
}
|
||||||
let availableAddresses: string[];
|
let availableAddresses: string[];
|
||||||
try {
|
try {
|
||||||
// TODO(bmillman): Add support at the web3Wrapper level for calling `eth_requestAccounts` instead of calling enable here
|
// TODO(bmillman): Add support at the web3Wrapper level for calling `eth_requestAccounts` instead of calling enable here
|
||||||
const isPrivacyModeEnabled = !_.isUndefined((provider as any).enable);
|
const isPrivacyModeEnabled = !_.isUndefined((provider as any).enable);
|
||||||
availableAddresses = isPrivacyModeEnabled
|
availableAddresses =
|
||||||
? await (provider as any).enable()
|
isPrivacyModeEnabled && shouldAttemptUnlock
|
||||||
: await web3Wrapper.getAvailableAddressesAsync();
|
? await (provider as any).enable()
|
||||||
|
: await web3Wrapper.getAvailableAddressesAsync();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
store.dispatch(actions.setAccountStateLocked());
|
dispatch(actions.setAccountStateLocked());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!_.isEmpty(availableAddresses)) {
|
if (!_.isEmpty(availableAddresses)) {
|
||||||
const activeAddress = availableAddresses[0];
|
const activeAddress = availableAddresses[0];
|
||||||
store.dispatch(actions.setAccountStateReady(activeAddress));
|
dispatch(actions.setAccountStateReady(activeAddress));
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
asyncData.fetchAccountBalanceAndDispatchToStore(store);
|
asyncData.fetchAccountBalanceAndDispatchToStore(activeAddress, providerState.web3Wrapper, dispatch);
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(actions.setAccountStateLocked());
|
dispatch(actions.setAccountStateLocked());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchAccountBalanceAndDispatchToStore: async (store: Store) => {
|
fetchAccountBalanceAndDispatchToStore: async (address: string, web3Wrapper: Web3Wrapper, dispatch: Dispatch) => {
|
||||||
const { providerState } = store.getState();
|
|
||||||
const web3Wrapper = providerState.web3Wrapper;
|
|
||||||
const account = providerState.account;
|
|
||||||
if (account.state !== AccountState.Ready) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
const address = account.address;
|
|
||||||
const ethBalanceInWei = await web3Wrapper.getBalanceInWeiAsync(address);
|
const ethBalanceInWei = await web3Wrapper.getBalanceInWeiAsync(address);
|
||||||
store.dispatch(actions.updateAccountEthBalance({ address, ethBalanceInWei }));
|
dispatch(actions.updateAccountEthBalance({ address, ethBalanceInWei }));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// leave balance as is
|
// leave balance as is
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchCurrentBuyQuoteAndDispatchToStore: async (options: { store: Store; shouldSetPending: boolean }) => {
|
fetchCurrentBuyQuoteAndDispatchToStore: async (
|
||||||
const { store, shouldSetPending } = options;
|
state: State,
|
||||||
const { buyOrderState, providerState, selectedAsset, selectedAssetAmount, affiliateInfo } = store.getState();
|
dispatch: Dispatch,
|
||||||
|
shouldSetPending: boolean = false,
|
||||||
|
) => {
|
||||||
|
const { buyOrderState, providerState, selectedAsset, selectedAssetUnitAmount, affiliateInfo } = state;
|
||||||
const assetBuyer = providerState.assetBuyer;
|
const assetBuyer = providerState.assetBuyer;
|
||||||
if (
|
if (
|
||||||
!_.isUndefined(selectedAssetAmount) &&
|
!_.isUndefined(selectedAssetUnitAmount) &&
|
||||||
!_.isUndefined(selectedAsset) &&
|
!_.isUndefined(selectedAsset) &&
|
||||||
buyOrderState.processState === OrderProcessState.None &&
|
buyOrderState.processState === OrderProcessState.None &&
|
||||||
selectedAsset.metaData.assetProxyId === AssetProxyId.ERC20
|
selectedAsset.metaData.assetProxyId === AssetProxyId.ERC20
|
||||||
) {
|
) {
|
||||||
await buyQuoteUpdater.updateBuyQuoteAsync(
|
await buyQuoteUpdater.updateBuyQuoteAsync(
|
||||||
assetBuyer,
|
assetBuyer,
|
||||||
store.dispatch,
|
dispatch,
|
||||||
selectedAsset as ERC20Asset,
|
selectedAsset as ERC20Asset,
|
||||||
selectedAssetAmount,
|
selectedAssetUnitAmount,
|
||||||
shouldSetPending,
|
shouldSetPending,
|
||||||
affiliateInfo,
|
affiliateInfo,
|
||||||
);
|
);
|
||||||
|
@@ -19,6 +19,8 @@ import {
|
|||||||
OrderProcessState,
|
OrderProcessState,
|
||||||
OrderState,
|
OrderState,
|
||||||
ProviderState,
|
ProviderState,
|
||||||
|
StandardSlidingPanelContent,
|
||||||
|
StandardSlidingPanelSettings,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
|
|
||||||
import { Action, ActionTypes } from './actions';
|
import { Action, ActionTypes } from './actions';
|
||||||
@@ -30,6 +32,7 @@ export interface DefaultState {
|
|||||||
buyOrderState: OrderState;
|
buyOrderState: OrderState;
|
||||||
latestErrorDisplayStatus: DisplayStatus;
|
latestErrorDisplayStatus: DisplayStatus;
|
||||||
quoteRequestState: AsyncProcessState;
|
quoteRequestState: AsyncProcessState;
|
||||||
|
standardSlidingPanelSettings: StandardSlidingPanelSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
// State that is required but needs to be derived from the props
|
// State that is required but needs to be derived from the props
|
||||||
@@ -41,7 +44,7 @@ interface PropsDerivedState {
|
|||||||
interface OptionalState {
|
interface OptionalState {
|
||||||
selectedAsset: Asset;
|
selectedAsset: Asset;
|
||||||
availableAssets: Asset[];
|
availableAssets: Asset[];
|
||||||
selectedAssetAmount: BigNumber;
|
selectedAssetUnitAmount: BigNumber;
|
||||||
ethUsdPrice: BigNumber;
|
ethUsdPrice: BigNumber;
|
||||||
latestBuyQuote: BuyQuote;
|
latestBuyQuote: BuyQuote;
|
||||||
latestErrorMessage: string;
|
latestErrorMessage: string;
|
||||||
@@ -56,6 +59,10 @@ export const DEFAULT_STATE: DefaultState = {
|
|||||||
buyOrderState: { processState: OrderProcessState.None },
|
buyOrderState: { processState: OrderProcessState.None },
|
||||||
latestErrorDisplayStatus: DisplayStatus.Hidden,
|
latestErrorDisplayStatus: DisplayStatus.Hidden,
|
||||||
quoteRequestState: AsyncProcessState.None,
|
quoteRequestState: AsyncProcessState.None,
|
||||||
|
standardSlidingPanelSettings: {
|
||||||
|
animationState: 'none',
|
||||||
|
content: StandardSlidingPanelContent.None,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createReducer = (initialState: State) => {
|
export const createReducer = (initialState: State) => {
|
||||||
@@ -66,11 +73,19 @@ export const createReducer = (initialState: State) => {
|
|||||||
case ActionTypes.SET_ACCOUNT_STATE_LOCKED:
|
case ActionTypes.SET_ACCOUNT_STATE_LOCKED:
|
||||||
return reduceStateWithAccount(state, LOCKED_ACCOUNT);
|
return reduceStateWithAccount(state, LOCKED_ACCOUNT);
|
||||||
case ActionTypes.SET_ACCOUNT_STATE_READY: {
|
case ActionTypes.SET_ACCOUNT_STATE_READY: {
|
||||||
const account: AccountReady = {
|
const address = action.data;
|
||||||
|
let newAccount: AccountReady = {
|
||||||
state: AccountState.Ready,
|
state: AccountState.Ready,
|
||||||
address: action.data,
|
address,
|
||||||
};
|
};
|
||||||
return reduceStateWithAccount(state, account);
|
const currentAccount = state.providerState.account;
|
||||||
|
if (currentAccount.state === AccountState.Ready && currentAccount.address === address) {
|
||||||
|
newAccount = {
|
||||||
|
...newAccount,
|
||||||
|
ethBalanceInWei: currentAccount.ethBalanceInWei,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return reduceStateWithAccount(state, newAccount);
|
||||||
}
|
}
|
||||||
case ActionTypes.UPDATE_ACCOUNT_ETH_BALANCE: {
|
case ActionTypes.UPDATE_ACCOUNT_ETH_BALANCE: {
|
||||||
const { address, ethBalanceInWei } = action.data;
|
const { address, ethBalanceInWei } = action.data;
|
||||||
@@ -90,10 +105,10 @@ export const createReducer = (initialState: State) => {
|
|||||||
...state,
|
...state,
|
||||||
ethUsdPrice: action.data,
|
ethUsdPrice: action.data,
|
||||||
};
|
};
|
||||||
case ActionTypes.UPDATE_SELECTED_ASSET_AMOUNT:
|
case ActionTypes.UPDATE_SELECTED_ASSET_UNIT_AMOUNT:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
selectedAssetAmount: action.data,
|
selectedAssetUnitAmount: action.data,
|
||||||
};
|
};
|
||||||
case ActionTypes.UPDATE_LATEST_BUY_QUOTE:
|
case ActionTypes.UPDATE_LATEST_BUY_QUOTE:
|
||||||
const newBuyQuoteIfExists = action.data;
|
const newBuyQuoteIfExists = action.data;
|
||||||
@@ -204,13 +219,29 @@ export const createReducer = (initialState: State) => {
|
|||||||
latestBuyQuote: undefined,
|
latestBuyQuote: undefined,
|
||||||
quoteRequestState: AsyncProcessState.None,
|
quoteRequestState: AsyncProcessState.None,
|
||||||
buyOrderState: { processState: OrderProcessState.None },
|
buyOrderState: { processState: OrderProcessState.None },
|
||||||
selectedAssetAmount: undefined,
|
selectedAssetUnitAmount: undefined,
|
||||||
};
|
};
|
||||||
case ActionTypes.SET_AVAILABLE_ASSETS:
|
case ActionTypes.SET_AVAILABLE_ASSETS:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
availableAssets: action.data,
|
availableAssets: action.data,
|
||||||
};
|
};
|
||||||
|
case ActionTypes.OPEN_STANDARD_SLIDING_PANEL:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
standardSlidingPanelSettings: {
|
||||||
|
content: action.data,
|
||||||
|
animationState: 'slidIn',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
case ActionTypes.CLOSE_STANDARD_SLIDING_PANEL:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
standardSlidingPanelSettings: {
|
||||||
|
content: state.standardSlidingPanelSettings.content,
|
||||||
|
animationState: 'slidOut',
|
||||||
|
},
|
||||||
|
};
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@@ -232,9 +263,9 @@ const reduceStateWithAccount = (state: State, account: Account) => {
|
|||||||
|
|
||||||
const doesBuyQuoteMatchState = (buyQuote: BuyQuote, state: State): boolean => {
|
const doesBuyQuoteMatchState = (buyQuote: BuyQuote, state: State): boolean => {
|
||||||
const selectedAssetIfExists = state.selectedAsset;
|
const selectedAssetIfExists = state.selectedAsset;
|
||||||
const selectedAssetAmountIfExists = state.selectedAssetAmount;
|
const selectedAssetUnitAmountIfExists = state.selectedAssetUnitAmount;
|
||||||
// if no selectedAsset or selectedAssetAmount exists on the current state, return false
|
// if no selectedAsset or selectedAssetAmount exists on the current state, return false
|
||||||
if (_.isUndefined(selectedAssetIfExists) || _.isUndefined(selectedAssetAmountIfExists)) {
|
if (_.isUndefined(selectedAssetIfExists) || _.isUndefined(selectedAssetUnitAmountIfExists)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// if buyQuote's assetData does not match that of the current selected asset, return false
|
// if buyQuote's assetData does not match that of the current selected asset, return false
|
||||||
@@ -246,7 +277,7 @@ const doesBuyQuoteMatchState = (buyQuote: BuyQuote, state: State): boolean => {
|
|||||||
const selectedAssetMetaData = selectedAssetIfExists.metaData;
|
const selectedAssetMetaData = selectedAssetIfExists.metaData;
|
||||||
if (selectedAssetMetaData.assetProxyId === AssetProxyId.ERC20) {
|
if (selectedAssetMetaData.assetProxyId === AssetProxyId.ERC20) {
|
||||||
const selectedAssetAmountBaseUnits = Web3Wrapper.toBaseUnitAmount(
|
const selectedAssetAmountBaseUnits = Web3Wrapper.toBaseUnitAmount(
|
||||||
selectedAssetAmountIfExists,
|
selectedAssetUnitAmountIfExists,
|
||||||
selectedAssetMetaData.decimals,
|
selectedAssetMetaData.decimals,
|
||||||
);
|
);
|
||||||
const doesAssetAmountMatch = selectedAssetAmountBaseUnits.eq(buyQuote.assetBuyAmount);
|
const doesAssetAmountMatch = selectedAssetAmountBaseUnits.eq(buyQuote.assetBuyAmount);
|
||||||
|
@@ -125,3 +125,15 @@ export interface AddressAndEthBalanceInWei {
|
|||||||
address: string;
|
address: string;
|
||||||
ethBalanceInWei: BigNumber;
|
ethBalanceInWei: BigNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type SlideAnimationState = 'slidIn' | 'slidOut' | 'none';
|
||||||
|
|
||||||
|
export enum StandardSlidingPanelContent {
|
||||||
|
None = 'NONE',
|
||||||
|
InstallWallet = 'INSTALL_WALLET',
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StandardSlidingPanelSettings {
|
||||||
|
animationState: SlideAnimationState;
|
||||||
|
content: StandardSlidingPanelContent;
|
||||||
|
}
|
||||||
|
@@ -80,8 +80,6 @@ export const assetUtils = {
|
|||||||
return metaData.symbol.toUpperCase();
|
return metaData.symbol.toUpperCase();
|
||||||
case AssetProxyId.ERC721:
|
case AssetProxyId.ERC721:
|
||||||
return metaData.name;
|
return metaData.name;
|
||||||
default:
|
|
||||||
return defaultName;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
formattedSymbolForAsset: (asset?: ERC20Asset, defaultName: string = '???'): string => {
|
formattedSymbolForAsset: (asset?: ERC20Asset, defaultName: string = '???'): string => {
|
||||||
|
@@ -15,12 +15,12 @@ export const buyQuoteUpdater = {
|
|||||||
assetBuyer: AssetBuyer,
|
assetBuyer: AssetBuyer,
|
||||||
dispatch: Dispatch<Action>,
|
dispatch: Dispatch<Action>,
|
||||||
asset: ERC20Asset,
|
asset: ERC20Asset,
|
||||||
assetAmount: BigNumber,
|
assetUnitAmount: BigNumber,
|
||||||
setPending = true,
|
setPending = true,
|
||||||
affiliateInfo?: AffiliateInfo,
|
affiliateInfo?: AffiliateInfo,
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
// get a new buy quote.
|
// get a new buy quote.
|
||||||
const baseUnitValue = Web3Wrapper.toBaseUnitAmount(assetAmount, asset.metaData.decimals);
|
const baseUnitValue = Web3Wrapper.toBaseUnitAmount(assetUnitAmount, asset.metaData.decimals);
|
||||||
if (setPending) {
|
if (setPending) {
|
||||||
// mark quote as pending
|
// mark quote as pending
|
||||||
dispatch(actions.setQuoteRequestStatePending());
|
dispatch(actions.setQuoteRequestStatePending());
|
||||||
|
@@ -8,9 +8,8 @@ const etherscanPrefix = (networkId: number): string | undefined => {
|
|||||||
return 'kovan.';
|
return 'kovan.';
|
||||||
case Network.Mainnet:
|
case Network.Mainnet:
|
||||||
return '';
|
return '';
|
||||||
default:
|
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
|
return '';
|
||||||
};
|
};
|
||||||
|
|
||||||
export const etherscanUtil = {
|
export const etherscanUtil = {
|
||||||
|
@@ -5,15 +5,15 @@ import * as _ from 'lodash';
|
|||||||
import { ETH_DECIMALS } from '../constants';
|
import { ETH_DECIMALS } from '../constants';
|
||||||
|
|
||||||
export const format = {
|
export const format = {
|
||||||
ethBaseAmount: (
|
ethBaseUnitAmount: (
|
||||||
ethBaseAmount?: BigNumber,
|
ethBaseUnitAmount?: BigNumber,
|
||||||
decimalPlaces: number = 4,
|
decimalPlaces: number = 4,
|
||||||
defaultText: React.ReactNode = '0 ETH',
|
defaultText: React.ReactNode = '0 ETH',
|
||||||
): React.ReactNode => {
|
): React.ReactNode => {
|
||||||
if (_.isUndefined(ethBaseAmount)) {
|
if (_.isUndefined(ethBaseUnitAmount)) {
|
||||||
return defaultText;
|
return defaultText;
|
||||||
}
|
}
|
||||||
const ethUnitAmount = Web3Wrapper.toUnitAmount(ethBaseAmount, ETH_DECIMALS);
|
const ethUnitAmount = Web3Wrapper.toUnitAmount(ethBaseUnitAmount, ETH_DECIMALS);
|
||||||
return format.ethUnitAmount(ethUnitAmount, decimalPlaces);
|
return format.ethUnitAmount(ethUnitAmount, decimalPlaces);
|
||||||
},
|
},
|
||||||
ethUnitAmount: (
|
ethUnitAmount: (
|
||||||
@@ -27,16 +27,16 @@ export const format = {
|
|||||||
const roundedAmount = ethUnitAmount.round(decimalPlaces).toDigits(decimalPlaces);
|
const roundedAmount = ethUnitAmount.round(decimalPlaces).toDigits(decimalPlaces);
|
||||||
return `${roundedAmount} ETH`;
|
return `${roundedAmount} ETH`;
|
||||||
},
|
},
|
||||||
ethBaseAmountInUsd: (
|
ethBaseUnitAmountInUsd: (
|
||||||
ethBaseAmount?: BigNumber,
|
ethBaseUnitAmount?: BigNumber,
|
||||||
ethUsdPrice?: BigNumber,
|
ethUsdPrice?: BigNumber,
|
||||||
decimalPlaces: number = 2,
|
decimalPlaces: number = 2,
|
||||||
defaultText: React.ReactNode = '$0.00',
|
defaultText: React.ReactNode = '$0.00',
|
||||||
): React.ReactNode => {
|
): React.ReactNode => {
|
||||||
if (_.isUndefined(ethBaseAmount) || _.isUndefined(ethUsdPrice)) {
|
if (_.isUndefined(ethBaseUnitAmount) || _.isUndefined(ethUsdPrice)) {
|
||||||
return defaultText;
|
return defaultText;
|
||||||
}
|
}
|
||||||
const ethUnitAmount = Web3Wrapper.toUnitAmount(ethBaseAmount, ETH_DECIMALS);
|
const ethUnitAmount = Web3Wrapper.toUnitAmount(ethBaseUnitAmount, ETH_DECIMALS);
|
||||||
return format.ethUnitAmountInUsd(ethUnitAmount, ethUsdPrice, decimalPlaces);
|
return format.ethUnitAmountInUsd(ethUnitAmount, ethUsdPrice, decimalPlaces);
|
||||||
},
|
},
|
||||||
ethUnitAmountInUsd: (
|
ethUnitAmountInUsd: (
|
||||||
|
@@ -10,13 +10,13 @@ export interface HeartbeatFactoryOptions {
|
|||||||
export const generateAccountHeartbeater = (options: HeartbeatFactoryOptions): Heartbeater => {
|
export const generateAccountHeartbeater = (options: HeartbeatFactoryOptions): Heartbeater => {
|
||||||
const { store, shouldPerformImmediatelyOnStart } = options;
|
const { store, shouldPerformImmediatelyOnStart } = options;
|
||||||
return new Heartbeater(async () => {
|
return new Heartbeater(async () => {
|
||||||
await asyncData.fetchAccountInfoAndDispatchToStore({ store, shouldSetToLoading: false });
|
await asyncData.fetchAccountInfoAndDispatchToStore(store.getState().providerState, store.dispatch, false);
|
||||||
}, shouldPerformImmediatelyOnStart);
|
}, shouldPerformImmediatelyOnStart);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const generateBuyQuoteHeartbeater = (options: HeartbeatFactoryOptions): Heartbeater => {
|
export const generateBuyQuoteHeartbeater = (options: HeartbeatFactoryOptions): Heartbeater => {
|
||||||
const { store, shouldPerformImmediatelyOnStart } = options;
|
const { store, shouldPerformImmediatelyOnStart } = options;
|
||||||
return new Heartbeater(async () => {
|
return new Heartbeater(async () => {
|
||||||
await asyncData.fetchCurrentBuyQuoteAndDispatchToStore({ store, shouldSetPending: false });
|
await asyncData.fetchCurrentBuyQuoteAndDispatchToStore(store.getState(), store.dispatch, false);
|
||||||
}, shouldPerformImmediatelyOnStart);
|
}, shouldPerformImmediatelyOnStart);
|
||||||
};
|
};
|
||||||
|
@@ -2,4 +2,5 @@ import * as _ from 'lodash';
|
|||||||
|
|
||||||
export const util = {
|
export const util = {
|
||||||
boundNoop: _.noop.bind(_),
|
boundNoop: _.noop.bind(_),
|
||||||
|
createOpenUrlInNewWindow: (href: string) => () => window.open(href, '_blank'),
|
||||||
};
|
};
|
||||||
|
@@ -15,20 +15,20 @@ const BIG_NUMBER_FAKE_ETH_USD_PRICE = new BigNumber(2.534);
|
|||||||
describe('format', () => {
|
describe('format', () => {
|
||||||
describe('ethBaseAmount', () => {
|
describe('ethBaseAmount', () => {
|
||||||
it('converts 1 ETH in base units to the string `1 ETH`', () => {
|
it('converts 1 ETH in base units to the string `1 ETH`', () => {
|
||||||
expect(format.ethBaseAmount(ONE_ETH_IN_BASE_UNITS)).toBe('1 ETH');
|
expect(format.ethBaseUnitAmount(ONE_ETH_IN_BASE_UNITS)).toBe('1 ETH');
|
||||||
});
|
});
|
||||||
it('converts .432414 ETH in base units to the string `.4324 ETH`', () => {
|
it('converts .432414 ETH in base units to the string `.4324 ETH`', () => {
|
||||||
expect(format.ethBaseAmount(DECIMAL_ETH_IN_BASE_UNITS)).toBe('0.4324 ETH');
|
expect(format.ethBaseUnitAmount(DECIMAL_ETH_IN_BASE_UNITS)).toBe('0.4324 ETH');
|
||||||
});
|
});
|
||||||
it('converts 5.3014059295032 ETH in base units to the string `5.301 ETH`', () => {
|
it('converts 5.3014059295032 ETH in base units to the string `5.301 ETH`', () => {
|
||||||
expect(format.ethBaseAmount(IRRATIONAL_ETH_IN_BASE_UNITS)).toBe('5.301 ETH');
|
expect(format.ethBaseUnitAmount(IRRATIONAL_ETH_IN_BASE_UNITS)).toBe('5.301 ETH');
|
||||||
});
|
});
|
||||||
it('returns defaultText param when ethBaseAmount is not defined', () => {
|
it('returns defaultText param when ethBaseAmount is not defined', () => {
|
||||||
const defaultText = 'defaultText';
|
const defaultText = 'defaultText';
|
||||||
expect(format.ethBaseAmount(undefined, 4, defaultText)).toBe(defaultText);
|
expect(format.ethBaseUnitAmount(undefined, 4, defaultText)).toBe(defaultText);
|
||||||
});
|
});
|
||||||
it('it allows for configurable decimal places', () => {
|
it('it allows for configurable decimal places', () => {
|
||||||
expect(format.ethBaseAmount(DECIMAL_ETH_IN_BASE_UNITS, 2)).toBe('0.43 ETH');
|
expect(format.ethBaseUnitAmount(DECIMAL_ETH_IN_BASE_UNITS, 2)).toBe('0.43 ETH');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('ethUnitAmount', () => {
|
describe('ethUnitAmount', () => {
|
||||||
@@ -52,24 +52,26 @@ describe('format', () => {
|
|||||||
});
|
});
|
||||||
describe('ethBaseAmountInUsd', () => {
|
describe('ethBaseAmountInUsd', () => {
|
||||||
it('correctly formats 1 ETH to usd according to some price', () => {
|
it('correctly formats 1 ETH to usd according to some price', () => {
|
||||||
expect(format.ethBaseAmountInUsd(ONE_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE)).toBe('$2.53');
|
expect(format.ethBaseUnitAmountInUsd(ONE_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE)).toBe('$2.53');
|
||||||
});
|
});
|
||||||
it('correctly formats .432414 ETH to usd according to some price', () => {
|
it('correctly formats .432414 ETH to usd according to some price', () => {
|
||||||
expect(format.ethBaseAmountInUsd(DECIMAL_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE)).toBe('$1.10');
|
expect(format.ethBaseUnitAmountInUsd(DECIMAL_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE)).toBe(
|
||||||
|
'$1.10',
|
||||||
|
);
|
||||||
});
|
});
|
||||||
it('correctly formats 5.3014059295032 ETH to usd according to some price', () => {
|
it('correctly formats 5.3014059295032 ETH to usd according to some price', () => {
|
||||||
expect(format.ethBaseAmountInUsd(IRRATIONAL_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE)).toBe(
|
expect(format.ethBaseUnitAmountInUsd(IRRATIONAL_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE)).toBe(
|
||||||
'$13.43',
|
'$13.43',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('returns defaultText param when ethBaseAmountInUsd or ethUsdPrice is not defined', () => {
|
it('returns defaultText param when ethBaseAmountInUsd or ethUsdPrice is not defined', () => {
|
||||||
const defaultText = 'defaultText';
|
const defaultText = 'defaultText';
|
||||||
expect(format.ethBaseAmountInUsd(undefined, undefined, 2, defaultText)).toBe(defaultText);
|
expect(format.ethBaseUnitAmountInUsd(undefined, undefined, 2, defaultText)).toBe(defaultText);
|
||||||
expect(format.ethBaseAmountInUsd(BIG_NUMBER_ONE, undefined, 2, defaultText)).toBe(defaultText);
|
expect(format.ethBaseUnitAmountInUsd(BIG_NUMBER_ONE, undefined, 2, defaultText)).toBe(defaultText);
|
||||||
expect(format.ethBaseAmountInUsd(undefined, BIG_NUMBER_ONE, 2, defaultText)).toBe(defaultText);
|
expect(format.ethBaseUnitAmountInUsd(undefined, BIG_NUMBER_ONE, 2, defaultText)).toBe(defaultText);
|
||||||
});
|
});
|
||||||
it('it allows for configurable decimal places', () => {
|
it('it allows for configurable decimal places', () => {
|
||||||
expect(format.ethBaseAmountInUsd(DECIMAL_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE, 4)).toBe(
|
expect(format.ethBaseUnitAmountInUsd(DECIMAL_ETH_IN_BASE_UNITS, BIG_NUMBER_FAKE_ETH_USD_PRICE, 4)).toBe(
|
||||||
'$1.0957',
|
'$1.0957',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
"rules": {
|
"rules": {
|
||||||
"custom-no-magic-numbers": false,
|
"custom-no-magic-numbers": false,
|
||||||
"semicolon": [true, "always", "ignore-bound-class-methods"],
|
"semicolon": [true, "always", "ignore-bound-class-methods"],
|
||||||
"max-classes-per-file": false
|
"max-classes-per-file": false,
|
||||||
|
"switch-default": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "2.1.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v2.1.1 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v2.1.0 - _November 12, 2018_
|
## v2.1.0 - _November 12, 2018_
|
||||||
|
|
||||||
* Improve schemas by enforcing that amounts that must be whole numbers (e.g Order asset amounts) no longer allow decimal amounts (#1173)
|
* Improve schemas by enforcing that amounts that must be whole numbers (e.g Order asset amounts) no longer allow decimal amounts (#1173)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/json-schemas",
|
"name": "@0x/json-schemas",
|
||||||
"version": "2.1.0",
|
"version": "2.1.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@types/lodash.foreach": "^4.5.3",
|
"@types/lodash.foreach": "^4.5.3",
|
||||||
"@types/lodash.values": "^4.3.3",
|
"@types/lodash.values": "^4.3.3",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/metacoin",
|
"name": "@0x/metacoin",
|
||||||
"version": "0.0.26",
|
"version": "0.0.28",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -29,15 +29,15 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/abi-gen": "^1.0.15",
|
"@0x/abi-gen": "^1.0.16",
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/sol-cov": "^2.1.10",
|
"@0x/sol-cov": "^2.1.12",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"@types/mocha": "^5.2.2",
|
"@types/mocha": "^5.2.2",
|
||||||
"copyfiles": "^2.0.0",
|
"copyfiles": "^2.0.0",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
@@ -46,8 +46,8 @@
|
|||||||
"run-s": "^0.0.0"
|
"run-s": "^0.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/sol-compiler": "^1.1.10",
|
"@0x/sol-compiler": "^1.1.12",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-as-promised": "^7.1.0",
|
"chai-as-promised": "^7.1.0",
|
||||||
"chai-bignumber": "^2.0.1",
|
"chai-bignumber": "^2.0.1",
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "2.0.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "2.0.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v2.0.4 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v2.0.3 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v2.0.2 - _November 12, 2018_
|
## v2.0.2 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/migrations",
|
"name": "@0x/migrations",
|
||||||
"version": "2.0.2",
|
"version": "2.0.4",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@types/yargs": "^10.0.0",
|
"@types/yargs": "^10.0.0",
|
||||||
@@ -29,16 +29,16 @@
|
|||||||
"yargs": "^10.0.3"
|
"yargs": "^10.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/abi-gen-wrappers": "^1.0.3",
|
"@0x/abi-gen-wrappers": "^1.0.5",
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/contract-addresses": "^1.1.0",
|
"@0x/contract-addresses": "^1.1.0",
|
||||||
"@0x/contract-artifacts": "^1.1.0",
|
"@0x/contract-artifacts": "^1.1.0",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/sol-compiler": "^1.1.10",
|
"@0x/sol-compiler": "^1.1.12",
|
||||||
"@0x/subproviders": "^2.1.2",
|
"@0x/subproviders": "^2.1.4",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"@ledgerhq/hw-app-eth": "^4.3.0",
|
"@ledgerhq/hw-app-eth": "^4.3.0",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethers": "~4.0.4",
|
"ethers": "~4.0.4",
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "3.0.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "3.0.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v3.0.2 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.0.1 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v3.0.0 - _November 12, 2018_
|
## v3.0.0 - _November 12, 2018_
|
||||||
|
|
||||||
* Add signature validation, regular cancellation and `cancelledUpTo` checks to `validateOrderFillableOrThrowAsync` (#1235)
|
* Add signature validation, regular cancellation and `cancelledUpTo` checks to `validateOrderFillableOrThrowAsync` (#1235)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/order-utils",
|
"name": "@0x/order-utils",
|
||||||
"version": "3.0.0",
|
"version": "3.0.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/order-utils/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/order-utils/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@types/bn.js": "^4.11.0",
|
"@types/bn.js": "^4.11.0",
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
@@ -53,15 +53,15 @@
|
|||||||
"typescript": "3.0.1"
|
"typescript": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/abi-gen-wrappers": "^1.0.3",
|
"@0x/abi-gen-wrappers": "^1.0.5",
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/contract-artifacts": "^1.1.0",
|
"@0x/contract-artifacts": "^1.1.0",
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"@types/node": "*",
|
"@types/node": "*",
|
||||||
"bn.js": "^4.11.8",
|
"bn.js": "^4.11.8",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
|
@@ -1,4 +1,29 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "2.2.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fix the bug when order watcher was throwing an error on order removal when maker token was ZRX",
|
||||||
|
"pr": 1259
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1542208198
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "2.2.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Start jsonRpcRequestId at 1, not 0 as 0 breaks the web3.js websocket RPC provider",
|
||||||
|
"pr": 1227
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fix the bug when order watcher was trying to convert undefined to an object in case of CancelUpTo event"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1542134075
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "2.2.2",
|
"version": "2.2.2",
|
||||||
|
@@ -5,6 +5,15 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v2.2.4 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Fix the bug when order watcher was throwing an error on order removal when maker token was ZRX (#1259)
|
||||||
|
|
||||||
|
## v2.2.3 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Start jsonRpcRequestId at 1, not 0 as 0 breaks the web3.js websocket RPC provider (#1227)
|
||||||
|
* Fix the bug when order watcher was trying to convert undefined to an object in case of CancelUpTo event
|
||||||
|
|
||||||
## v2.2.2 - _November 12, 2018_
|
## v2.2.2 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/order-watcher",
|
"name": "@0x/order-watcher",
|
||||||
"version": "2.2.2",
|
"version": "2.2.4",
|
||||||
"description": "An order watcher daemon that watches for order validity",
|
"description": "An order watcher daemon that watches for order validity",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"0x",
|
"0x",
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/dev-utils": "^1.0.15",
|
"@0x/dev-utils": "^1.0.17",
|
||||||
"@0x/migrations": "^2.0.2",
|
"@0x/migrations": "^2.0.4",
|
||||||
"@0x/tslint-config": "^1.0.10",
|
"@0x/tslint-config": "^1.0.10",
|
||||||
"@types/bintrees": "^1.0.2",
|
"@types/bintrees": "^1.0.2",
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
@@ -57,19 +57,19 @@
|
|||||||
"typescript": "3.0.1"
|
"typescript": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/abi-gen-wrappers": "^1.0.3",
|
"@0x/abi-gen-wrappers": "^1.0.5",
|
||||||
"@0x/assert": "^1.0.16",
|
"@0x/assert": "^1.0.17",
|
||||||
"@0x/base-contract": "^3.0.4",
|
"@0x/base-contract": "^3.0.6",
|
||||||
"@0x/contract-addresses": "^1.1.0",
|
"@0x/contract-addresses": "^1.1.0",
|
||||||
"@0x/contract-artifacts": "^1.1.0",
|
"@0x/contract-artifacts": "^1.1.0",
|
||||||
"@0x/contract-wrappers": "^4.0.0",
|
"@0x/contract-wrappers": "^4.0.2",
|
||||||
"@0x/fill-scenarios": "^1.0.10",
|
"@0x/fill-scenarios": "^1.0.12",
|
||||||
"@0x/json-schemas": "^2.1.0",
|
"@0x/json-schemas": "^2.1.1",
|
||||||
"@0x/order-utils": "^3.0.0",
|
"@0x/order-utils": "^3.0.2",
|
||||||
"@0x/types": "^1.2.1",
|
"@0x/types": "^1.2.1",
|
||||||
"@0x/typescript-typings": "^3.0.4",
|
"@0x/typescript-typings": "^3.0.4",
|
||||||
"@0x/utils": "^2.0.4",
|
"@0x/utils": "^2.0.5",
|
||||||
"@0x/web3-wrapper": "^3.1.2",
|
"@0x/web3-wrapper": "^3.1.4",
|
||||||
"bintrees": "^1.0.2",
|
"bintrees": "^1.0.2",
|
||||||
"ethereum-types": "^1.1.2",
|
"ethereum-types": "^1.1.2",
|
||||||
"ethereumjs-blockstream": "6.0.0",
|
"ethereumjs-blockstream": "6.0.0",
|
||||||
|
@@ -50,7 +50,7 @@ export class DependentOrderHashesTracker {
|
|||||||
return uniqueOrderHashList;
|
return uniqueOrderHashList;
|
||||||
}
|
}
|
||||||
public getDependentOrderHashesByMaker(makerAddress: string): string[] {
|
public getDependentOrderHashesByMaker(makerAddress: string): string[] {
|
||||||
const dependentOrderHashes = Array.from(this._orderHashesByMakerAddress[makerAddress]);
|
const dependentOrderHashes = Array.from(this._orderHashesByMakerAddress[makerAddress] || {});
|
||||||
return dependentOrderHashes;
|
return dependentOrderHashes;
|
||||||
}
|
}
|
||||||
public getDependentOrderHashesByAssetDataByMaker(makerAddress: string, assetData: string): string[] {
|
public getDependentOrderHashesByAssetDataByMaker(makerAddress: string, assetData: string): string[] {
|
||||||
@@ -89,7 +89,10 @@ export class DependentOrderHashesTracker {
|
|||||||
(decodedMakerAssetData as ERC721AssetData).tokenId,
|
(decodedMakerAssetData as ERC721AssetData).tokenId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this._removeFromERC20DependentOrderhashes(signedOrder, this._zrxTokenAddress);
|
// If makerToken === ZRX then we already removed it and we don't need to remove it again.
|
||||||
|
if ((decodedMakerAssetData as ERC20AssetData).tokenAddress !== this._zrxTokenAddress) {
|
||||||
|
this._removeFromERC20DependentOrderhashes(signedOrder, this._zrxTokenAddress);
|
||||||
|
}
|
||||||
this._removeFromMakerDependentOrderhashes(signedOrder);
|
this._removeFromMakerDependentOrderhashes(signedOrder);
|
||||||
}
|
}
|
||||||
private _getDependentOrderHashesByERC20AssetData(makerAddress: string, erc20AssetData: string): string[] {
|
private _getDependentOrderHashesByERC20AssetData(makerAddress: string, erc20AssetData: string): string[] {
|
||||||
|
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1542208198,
|
||||||
|
"version": "1.0.18",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1542134075,
|
||||||
|
"version": "1.0.17",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1542028948,
|
"timestamp": 1542028948,
|
||||||
"version": "1.0.16",
|
"version": "1.0.16",
|
||||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.18 - _November 14, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.0.17 - _November 13, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.0.16 - _November 12, 2018_
|
## v1.0.16 - _November 12, 2018_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user