Compare commits
12 Commits
@0x/contra
...
@0x/contra
Author | SHA1 | Date | |
---|---|---|---|
|
dbcb221a59 | ||
|
6bbc179f52 | ||
|
48e7a391c8 | ||
|
2334e64d0c | ||
|
14f920ee84 | ||
|
e10a81023a | ||
|
f4709ed1cb | ||
|
e2e14a977a | ||
|
866f958a10 | ||
|
717db99b38 | ||
|
02006118c7 | ||
|
9816019bc5 |
12
README.md
12
README.md
@@ -8,7 +8,7 @@ This repository is a monorepo including the 0x protocol smart contracts and nume
|
||||
|
||||
[website-url]: https://0x.org
|
||||
|
||||
[](https://circleci.com/gh/0xProject/0x-monorepo)
|
||||
[](https://circleci.com/gh/0xProject/protocool)
|
||||
[](https://coveralls.io/github/0xProject/0x-monorepo?branch=development)
|
||||
[](https://discordapp.com/invite/d3FTX3M)
|
||||
[](https://opensource.org/licenses/Apache-2.0)
|
||||
@@ -92,7 +92,7 @@ yarn build
|
||||
To build a specific package:
|
||||
|
||||
```bash
|
||||
PKG=@0x/web3-wrapper yarn build
|
||||
PKG=@0x/contract-wrappers yarn build
|
||||
```
|
||||
|
||||
To build all contracts packages:
|
||||
@@ -115,7 +115,7 @@ To watch a specific package and all it's dependent packages:
|
||||
PKG=[NPM_PACKAGE_NAME] yarn watch
|
||||
|
||||
e.g
|
||||
PKG=@0x/web3-wrapper yarn watch
|
||||
PKG=@0x/contract-wrappers yarn watch
|
||||
```
|
||||
|
||||
### Clean
|
||||
@@ -143,7 +143,7 @@ yarn rebuild
|
||||
To re-build (clean & build) a specific package & it's deps:
|
||||
|
||||
```bash
|
||||
PKG=0x.js yarn rebuild
|
||||
PKG=@0x/contract-wrappers yarn rebuild
|
||||
```
|
||||
|
||||
### Lint
|
||||
@@ -157,7 +157,7 @@ yarn lint
|
||||
Lint a specific package:
|
||||
|
||||
```bash
|
||||
PKG=0x.js yarn lint
|
||||
PKG=@0x/contract-wrappers yarn lint
|
||||
```
|
||||
|
||||
### Run Tests
|
||||
@@ -171,7 +171,7 @@ yarn test
|
||||
Run a specific package's test:
|
||||
|
||||
```bash
|
||||
PKG=@0x/web3-wrapper yarn test
|
||||
PKG=@0x/contract-wrappers yarn test
|
||||
```
|
||||
|
||||
Run all contracts packages tests:
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "3.6.3",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "3.6.2",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "3.6.1",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v3.6.3 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.6.2 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.6.1 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -51,16 +51,15 @@ contract ShellBridge is
|
||||
external
|
||||
returns (bytes4 success)
|
||||
{
|
||||
// Decode the bridge data to get the `fromTokenAddress`.
|
||||
(address fromTokenAddress) = abi.decode(bridgeData, (address));
|
||||
// Decode the bridge data to get the `fromTokenAddress` and `pool`.
|
||||
(address fromTokenAddress, address pool) = abi.decode(bridgeData, (address, address));
|
||||
|
||||
uint256 fromTokenBalance = IERC20Token(fromTokenAddress).balanceOf(address(this));
|
||||
IShell exchange = IShell(_getShellAddress());
|
||||
// Grant an allowance to the exchange to spend `fromTokenAddress` token.
|
||||
LibERC20Token.approveIfBelow(fromTokenAddress, address(exchange), fromTokenBalance);
|
||||
LibERC20Token.approveIfBelow(fromTokenAddress, pool, fromTokenBalance);
|
||||
|
||||
// Try to sell all of this contract's `fromTokenAddress` token balance.
|
||||
uint256 boughtAmount = exchange.originSwap(
|
||||
uint256 boughtAmount = IShell(pool).originSwap(
|
||||
fromTokenAddress,
|
||||
toTokenAddress,
|
||||
fromTokenBalance,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-asset-proxy",
|
||||
"version": "3.6.1",
|
||||
"version": "3.6.3",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -51,13 +51,13 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contract-wrappers": "^13.9.2",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contract-wrappers": "^13.9.4",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@types/lodash": "4.14.104",
|
||||
@@ -79,16 +79,16 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-erc1155": "^2.1.10",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-erc721": "^3.1.10",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-erc1155": "^2.1.12",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-erc721": "^3.1.12",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"ethereum-types": "^3.3.3",
|
||||
"lodash": "^4.17.11"
|
||||
},
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "1.1.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "1.1.10",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "1.1.9",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v1.1.11 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v1.1.10 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v1.1.9 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-broker",
|
||||
"version": "1.1.9",
|
||||
"version": "1.1.11",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -51,20 +51,20 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-erc721": "^3.1.10",
|
||||
"@0x/contracts-exchange": "^3.2.10",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-erc721": "^3.1.12",
|
||||
"@0x/contracts-exchange": "^3.2.12",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -84,10 +84,10 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"ethereum-types": "^3.3.3"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "3.1.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "3.1.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "3.1.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v3.1.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.1.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.1.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-coordinator",
|
||||
"version": "3.1.10",
|
||||
"version": "3.1.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,17 +52,17 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-dev-utils": "^1.3.8",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-dev-utils": "^1.3.10",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -82,16 +82,16 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/assert": "^3.0.13",
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contract-addresses": "^5.0.1",
|
||||
"@0x/contracts-exchange": "^3.2.10",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/json-schemas": "^5.2.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/assert": "^3.0.17",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contract-addresses": "^5.1.0",
|
||||
"@0x/contracts-exchange": "^3.2.12",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/json-schemas": "^5.3.3",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"ethereum-types": "^3.3.3",
|
||||
"http-status-codes": "^1.3.2"
|
||||
},
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "1.3.10",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "1.3.9",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "1.3.8",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v1.3.10 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v1.3.9 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v1.3.8 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-dev-utils",
|
||||
"version": "1.3.8",
|
||||
"version": "1.3.10",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -41,17 +41,17 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/assert": "^3.0.13",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/assert": "^3.0.17",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"ethereum-types": "^3.3.3",
|
||||
"ethers": "~4.0.4",
|
||||
"npm-run-all": "^4.1.2",
|
||||
@@ -63,7 +63,7 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@types/node": "12.12.54"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "2.1.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "2.1.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "2.1.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v2.1.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v2.1.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v2.1.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-erc1155",
|
||||
"version": "2.1.10",
|
||||
"version": "2.1.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,14 +52,14 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
@@ -80,10 +80,10 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"lodash": "^4.17.11"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "3.2.6",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "3.2.5",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "3.2.4",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v3.2.6 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.2.5 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.2.4 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-erc20",
|
||||
"version": "3.2.4",
|
||||
"version": "3.2.6",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -51,18 +51,18 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -82,7 +82,7 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7"
|
||||
"@0x/base-contract": "^6.2.11"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "3.1.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "3.1.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "3.1.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v3.1.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.1.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.1.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-erc721",
|
||||
"version": "3.1.10",
|
||||
"version": "3.1.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,18 +52,18 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -84,7 +84,7 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7"
|
||||
"@0x/base-contract": "^6.2.11"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "4.2.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "4.2.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "4.2.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v4.2.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.2.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.2.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-exchange-forwarder",
|
||||
"version": "4.2.10",
|
||||
"version": "4.2.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,25 +52,25 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-dev-utils": "^1.3.8",
|
||||
"@0x/contracts-erc1155": "^2.1.10",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-erc721": "^3.1.10",
|
||||
"@0x/contracts-exchange": "^3.2.10",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-dev-utils": "^1.3.10",
|
||||
"@0x/contracts-erc1155": "^2.1.12",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-erc721": "^3.1.12",
|
||||
"@0x/contracts-exchange": "^3.2.12",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -90,7 +90,7 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"ethereum-types": "^3.3.3"
|
||||
},
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "4.3.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "4.3.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "4.3.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v4.3.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.3.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.3.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-exchange-libs",
|
||||
"version": "4.3.10",
|
||||
"version": "4.3.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,14 +52,14 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/subproviders": "^6.1.5",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/subproviders": "^6.1.9",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -80,13 +80,13 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"ethereum-types": "^3.3.3"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "3.2.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "3.2.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "3.2.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v3.2.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.2.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v3.2.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-exchange",
|
||||
"version": "3.2.10",
|
||||
"version": "3.2.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,21 +52,21 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-multisig": "^4.1.10",
|
||||
"@0x/contracts-staking": "^2.0.17",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-multisig": "^4.1.12",
|
||||
"@0x/contracts-staking": "^2.0.19",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -88,13 +88,13 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-dev-utils": "^1.3.8",
|
||||
"@0x/contracts-erc1155": "^2.1.10",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-erc721": "^3.1.10",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-dev-utils": "^1.3.10",
|
||||
"@0x/contracts-erc1155": "^2.1.12",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-erc721": "^3.1.12",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"lodash": "^4.17.11"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "6.2.6",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "6.2.5",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "6.2.4",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v6.2.6 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v6.2.5 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v6.2.4 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-extensions",
|
||||
"version": "6.2.4",
|
||||
"version": "6.2.6",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -52,23 +52,23 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-dev-utils": "^1.3.8",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-erc721": "^3.1.10",
|
||||
"@0x/contracts-exchange": "^3.2.10",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-dev-utils": "^1.3.10",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-erc721": "^3.1.12",
|
||||
"@0x/contracts-exchange": "^3.2.12",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -90,8 +90,8 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"ethereum-types": "^3.3.3"
|
||||
},
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "2.7.5",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "2.7.4",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "2.7.3",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v2.7.5 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v2.7.4 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v2.7.3 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-integrations",
|
||||
"version": "2.7.3",
|
||||
"version": "2.7.5",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -51,24 +51,24 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contract-addresses": "^5.0.1",
|
||||
"@0x/contract-wrappers": "^13.9.2",
|
||||
"@0x/contracts-broker": "^1.1.9",
|
||||
"@0x/contracts-coordinator": "^3.1.10",
|
||||
"@0x/contracts-dev-utils": "^1.3.8",
|
||||
"@0x/contracts-exchange-forwarder": "^4.2.10",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-extensions": "^6.2.4",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contract-addresses": "^5.1.0",
|
||||
"@0x/contract-wrappers": "^13.9.4",
|
||||
"@0x/contracts-broker": "^1.1.11",
|
||||
"@0x/contracts-coordinator": "^3.1.12",
|
||||
"@0x/contracts-dev-utils": "^1.3.10",
|
||||
"@0x/contracts-exchange-forwarder": "^4.2.12",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-extensions": "^6.2.6",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/coordinator-server": "^1.0.5",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/migrations": "^6.4.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/migrations": "^6.4.6",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@azure/core-asynciterator-polyfill": "^1.0.0",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
@@ -91,21 +91,21 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/asset-swapper": "^4.8.1",
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-erc1155": "^2.1.10",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-erc721": "^3.1.10",
|
||||
"@0x/contracts-exchange": "^3.2.10",
|
||||
"@0x/contracts-multisig": "^4.1.10",
|
||||
"@0x/contracts-staking": "^2.0.17",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-zero-ex": "^0.5.1",
|
||||
"@0x/subproviders": "^6.1.5",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/asset-swapper": "^5.0.1",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-erc1155": "^2.1.12",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-erc721": "^3.1.12",
|
||||
"@0x/contracts-exchange": "^3.2.12",
|
||||
"@0x/contracts-multisig": "^4.1.12",
|
||||
"@0x/contracts-staking": "^2.0.19",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-zero-ex": "^0.7.0",
|
||||
"@0x/subproviders": "^6.1.9",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"ethereum-types": "^3.3.3",
|
||||
"ethereumjs-util": "^6.2.0",
|
||||
"lodash": "^4.17.11"
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "4.1.12",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "4.1.11",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "4.1.10",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v4.1.12 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.1.11 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.1.10 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-multisig",
|
||||
"version": "4.1.10",
|
||||
"version": "4.1.12",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -49,18 +49,18 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
@@ -78,7 +78,7 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"ethereum-types": "^3.3.3"
|
||||
},
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "2.0.19",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "2.0.18",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "2.0.17",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v2.0.19 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v2.0.18 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v2.0.17 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-staking",
|
||||
"version": "2.0.17",
|
||||
"version": "2.0.19",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -53,20 +53,20 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-dev-utils": "^1.3.8",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-dev-utils": "^1.3.10",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/node": "12.12.54",
|
||||
"chai": "^4.0.1",
|
||||
@@ -87,10 +87,10 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"ethereum-types": "^3.3.3",
|
||||
"ethereumjs-util": "^5.1.1"
|
||||
},
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "5.3.9",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "5.3.8",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "5.3.7",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v5.3.9 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v5.3.8 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v5.3.7 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-test-utils",
|
||||
"version": "5.3.7",
|
||||
"version": "5.3.9",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -34,7 +34,7 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils",
|
||||
"devDependencies": {
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"shx": "^0.2.2",
|
||||
@@ -42,20 +42,20 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/assert": "^3.0.13",
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contract-addresses": "^5.0.1",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/json-schemas": "^5.2.3",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-coverage": "^4.0.14",
|
||||
"@0x/sol-profiler": "^4.1.4",
|
||||
"@0x/sol-trace": "^3.0.14",
|
||||
"@0x/subproviders": "^6.1.5",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/assert": "^3.0.17",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contract-addresses": "^5.1.0",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/json-schemas": "^5.3.3",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-coverage": "^4.0.18",
|
||||
"@0x/sol-profiler": "^4.1.8",
|
||||
"@0x/sol-trace": "^3.0.18",
|
||||
"@0x/subproviders": "^6.1.9",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/bn.js": "^4.11.0",
|
||||
"@types/js-combinatorics": "^0.5.29",
|
||||
"@types/lodash": "4.14.104",
|
||||
|
@@ -1,4 +1,22 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "4.5.6",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1604355662,
|
||||
"version": "4.5.5",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "4.5.4",
|
||||
|
@@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v4.5.6 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.5.5 - _November 2, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v4.5.4 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -56,8 +56,6 @@ contract DeploymentConstants {
|
||||
address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;
|
||||
/// @dev Mainnet address of the Mooniswap Registry contract
|
||||
address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;
|
||||
/// @dev Mainnet address of the Shell contract
|
||||
address constant private SHELL_CONTRACT = 0x2E703D658f8dd21709a7B458967aB4081F8D3d05;
|
||||
/// @dev Mainnet address of the DODO Registry (ZOO) contract
|
||||
address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;
|
||||
/// @dev Mainnet address of the DODO Helper contract
|
||||
@@ -303,16 +301,6 @@ contract DeploymentConstants {
|
||||
return MOONISWAP_REGISTRY;
|
||||
}
|
||||
|
||||
/// @dev An overridable way to retrieve the Shell contract address.
|
||||
/// @return registry The Shell contract address.
|
||||
function _getShellAddress()
|
||||
internal
|
||||
view
|
||||
returns (address)
|
||||
{
|
||||
return SHELL_CONTRACT;
|
||||
}
|
||||
|
||||
/// @dev An overridable way to retrieve the DODO Registry contract address.
|
||||
/// @return registry The DODO Registry contract address.
|
||||
function _getDODORegistryAddress()
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-utils",
|
||||
"version": "4.5.4",
|
||||
"version": "4.5.6",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -50,15 +50,15 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/utils",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@types/bn.js": "^4.11.0",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
@@ -79,9 +79,9 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"bn.js": "^4.11.8",
|
||||
"ethereum-types": "^3.3.3"
|
||||
},
|
||||
|
@@ -1,4 +1,32 @@
|
||||
[
|
||||
{
|
||||
"version": "0.7.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Change `ProtocolFeeUnfunded` event in FQT",
|
||||
"pr": 28
|
||||
},
|
||||
{
|
||||
"note": "Use new PLP interface in FQT.",
|
||||
"pr": 28
|
||||
}
|
||||
],
|
||||
"timestamp": 1604376968
|
||||
},
|
||||
{
|
||||
"version": "0.6.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Add support for collecting protocol fees in ETH or WETH",
|
||||
"pr": 2
|
||||
},
|
||||
{
|
||||
"note": "Add `LibSignature` library",
|
||||
"pr": 21
|
||||
}
|
||||
],
|
||||
"timestamp": 1604355662
|
||||
},
|
||||
{
|
||||
"timestamp": 1603851023,
|
||||
"version": "0.5.1",
|
||||
|
@@ -5,6 +5,16 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v0.7.0 - _November 3, 2020_
|
||||
|
||||
* Change `ProtocolFeeUnfunded` event in FQT (#28)
|
||||
* Use new PLP interface in FQT. (#28)
|
||||
|
||||
## v0.6.0 - _November 2, 2020_
|
||||
|
||||
* Add support for collecting protocol fees in ETH or WETH (#2)
|
||||
* Add `LibSignature` library (#21)
|
||||
|
||||
## v0.5.1 - _October 28, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
@@ -26,7 +26,8 @@ library LibSignatureRichErrors {
|
||||
INVALID_LENGTH,
|
||||
UNSUPPORTED,
|
||||
ILLEGAL,
|
||||
WRONG_SIGNER
|
||||
WRONG_SIGNER,
|
||||
BAD_SIGNATURE_DATA
|
||||
}
|
||||
|
||||
// solhint-disable func-name-mixedcase
|
||||
@@ -49,4 +50,19 @@ library LibSignatureRichErrors {
|
||||
signature
|
||||
);
|
||||
}
|
||||
|
||||
function SignatureValidationError(
|
||||
SignatureValidationErrorCodes code,
|
||||
bytes32 hash
|
||||
)
|
||||
internal
|
||||
pure
|
||||
returns (bytes memory)
|
||||
{
|
||||
return abi.encodeWithSelector(
|
||||
bytes4(keccak256("SignatureValidationError(uint8,bytes32)")),
|
||||
code,
|
||||
hash
|
||||
);
|
||||
}
|
||||
}
|
||||
|
65
contracts/zero-ex/contracts/src/external/FeeCollector.sol
vendored
Normal file
65
contracts/zero-ex/contracts/src/external/FeeCollector.sol
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
|
||||
import "@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol";
|
||||
import "../vendor/v3/IStaking.sol";
|
||||
|
||||
/// @dev The collector contract for protocol fees
|
||||
contract FeeCollector is AuthorizableV06 {
|
||||
/// @dev Allow ether transfers to the collector.
|
||||
receive() external payable { }
|
||||
|
||||
constructor() public {
|
||||
_addAuthorizedAddress(msg.sender);
|
||||
}
|
||||
|
||||
/// @dev Approve the staking contract and join a pool. Only an authority
|
||||
/// can call this.
|
||||
/// @param weth The WETH contract.
|
||||
/// @param staking The staking contract.
|
||||
/// @param poolId The pool ID this contract is collecting fees for.
|
||||
function initialize(
|
||||
IEtherTokenV06 weth,
|
||||
IStaking staking,
|
||||
bytes32 poolId
|
||||
)
|
||||
external
|
||||
onlyAuthorized
|
||||
{
|
||||
weth.approve(address(staking), type(uint256).max);
|
||||
staking.joinStakingPoolAsMaker(poolId);
|
||||
}
|
||||
|
||||
/// @dev Convert all held ether to WETH. Only an authority can call this.
|
||||
/// @param weth The WETH contract.
|
||||
function convertToWeth(
|
||||
IEtherTokenV06 weth
|
||||
)
|
||||
external
|
||||
onlyAuthorized
|
||||
{
|
||||
// Leave 1 wei behind to avoid expensive zero-->non-zero state change.
|
||||
if (address(this).balance > 1) {
|
||||
weth.deposit{value: address(this).balance - 1}();
|
||||
}
|
||||
}
|
||||
}
|
151
contracts/zero-ex/contracts/src/features/libs/LibSignature.sol
Normal file
151
contracts/zero-ex/contracts/src/features/libs/LibSignature.sol
Normal file
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
|
||||
import "../../errors/LibSignatureRichErrors.sol";
|
||||
|
||||
|
||||
/// @dev A library for validating signatures.
|
||||
library LibSignature {
|
||||
using LibRichErrorsV06 for bytes;
|
||||
|
||||
// '\x19Ethereum Signed Message:\n32\x00\x00\x00\x00' in a word.
|
||||
uint256 private constant ETH_SIGN_HASH_PREFIX =
|
||||
0x19457468657265756d205369676e6564204d6573736167653a0a333200000000;
|
||||
/// @dev Exclusive upper limit on ECDSA signatures 'R' values.
|
||||
/// The valid range is given by fig (282) of the yellow paper.
|
||||
uint256 private constant ECDSA_SIGNATURE_R_LIMIT =
|
||||
uint256(0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141);
|
||||
/// @dev Exclusive upper limit on ECDSA signatures 'S' values.
|
||||
/// The valid range is given by fig (283) of the yellow paper.
|
||||
uint256 private constant ECDSA_SIGNATURE_S_LIMIT = ECDSA_SIGNATURE_R_LIMIT / 2 + 1;
|
||||
|
||||
/// @dev Allowed signature types.
|
||||
enum SignatureType {
|
||||
ILLEGAL,
|
||||
INVALID,
|
||||
EIP712,
|
||||
ETHSIGN
|
||||
}
|
||||
|
||||
/// @dev Encoded EC signature.
|
||||
struct Signature {
|
||||
// How to validate the signature.
|
||||
SignatureType signatureType;
|
||||
// EC Signature data.
|
||||
uint8 v;
|
||||
// EC Signature data.
|
||||
bytes32 r;
|
||||
// EC Signature data.
|
||||
bytes32 s;
|
||||
}
|
||||
|
||||
/// @dev Retrieve the signer of a signature.
|
||||
/// Throws if the signature can't be validated.
|
||||
/// @param hash The hash that was signed.
|
||||
/// @param signature The signature.
|
||||
/// @return recovered The recovered signer address.
|
||||
function getSignerOfHash(
|
||||
bytes32 hash,
|
||||
Signature memory signature
|
||||
)
|
||||
internal
|
||||
pure
|
||||
returns (address recovered)
|
||||
{
|
||||
// Ensure this is a signature type that can be validated against a hash.
|
||||
_validateHashCompatibleSignature(hash, signature);
|
||||
|
||||
if (signature.signatureType == SignatureType.EIP712) {
|
||||
// Signed using EIP712
|
||||
recovered = ecrecover(
|
||||
hash,
|
||||
signature.v,
|
||||
signature.r,
|
||||
signature.s
|
||||
);
|
||||
} else if (signature.signatureType == SignatureType.ETHSIGN) {
|
||||
// Signed using `eth_sign`
|
||||
// Need to hash `hash` with "\x19Ethereum Signed Message:\n32" prefix
|
||||
// in packed encoding.
|
||||
bytes32 ethSignHash;
|
||||
assembly {
|
||||
// Use scratch space
|
||||
mstore(0, ETH_SIGN_HASH_PREFIX) // length of 28 bytes
|
||||
mstore(28, hash) // length of 32 bytes
|
||||
ethSignHash := keccak256(0, 60)
|
||||
}
|
||||
recovered = ecrecover(
|
||||
ethSignHash,
|
||||
signature.v,
|
||||
signature.r,
|
||||
signature.s
|
||||
);
|
||||
}
|
||||
// `recovered` can be null if the signature values are out of range.
|
||||
if (recovered == address(0)) {
|
||||
LibSignatureRichErrors.SignatureValidationError(
|
||||
LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,
|
||||
hash
|
||||
).rrevert();
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Validates that a signature is compatible with a hash signee.
|
||||
/// @param hash The hash that was signed.
|
||||
/// @param signature The signature.
|
||||
function _validateHashCompatibleSignature(
|
||||
bytes32 hash,
|
||||
Signature memory signature
|
||||
)
|
||||
private
|
||||
pure
|
||||
{
|
||||
// Ensure the r and s are within malleability limits.
|
||||
if (uint256(signature.r) >= ECDSA_SIGNATURE_R_LIMIT ||
|
||||
uint256(signature.s) >= ECDSA_SIGNATURE_S_LIMIT)
|
||||
{
|
||||
LibSignatureRichErrors.SignatureValidationError(
|
||||
LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,
|
||||
hash
|
||||
).rrevert();
|
||||
}
|
||||
|
||||
// Always illegal signature.
|
||||
if (signature.signatureType == SignatureType.ILLEGAL) {
|
||||
LibSignatureRichErrors.SignatureValidationError(
|
||||
LibSignatureRichErrors.SignatureValidationErrorCodes.ILLEGAL,
|
||||
hash
|
||||
).rrevert();
|
||||
}
|
||||
|
||||
// Always invalid.
|
||||
if (signature.signatureType == SignatureType.INVALID) {
|
||||
LibSignatureRichErrors.SignatureValidationError(
|
||||
LibSignatureRichErrors.SignatureValidationErrorCodes.ALWAYS_INVALID,
|
||||
hash
|
||||
).rrevert();
|
||||
}
|
||||
|
||||
// Solidity should check that the signature type is within enum range for us
|
||||
// when abi-decoding.
|
||||
}
|
||||
}
|
@@ -27,6 +27,9 @@ import "../ITokenSpenderFeature.sol";
|
||||
library LibTokenSpender {
|
||||
using LibRichErrorsV06 for bytes;
|
||||
|
||||
// Mask of the lower 20 bytes of a bytes32.
|
||||
uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
|
||||
|
||||
/// @dev Transfers ERC20 tokens from `owner` to `to`.
|
||||
/// @param token The token to spend.
|
||||
/// @param owner The owner of the tokens.
|
||||
@@ -50,11 +53,11 @@ library LibTokenSpender {
|
||||
|
||||
// selector for transferFrom(address,address,uint256)
|
||||
mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
|
||||
mstore(add(ptr, 0x04), owner)
|
||||
mstore(add(ptr, 0x24), to)
|
||||
mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK))
|
||||
mstore(add(ptr, 0x24), and(to, ADDRESS_MASK))
|
||||
mstore(add(ptr, 0x44), amount)
|
||||
|
||||
success := call(gas(), token, 0, ptr, 0x64, 0, 0)
|
||||
success := call(gas(), and(token, ADDRESS_MASK), 0, ptr, 0x64, 0, 0)
|
||||
|
||||
let rdsize := returndatasize()
|
||||
|
||||
|
114
contracts/zero-ex/contracts/src/fixins/FixinProtocolFees.sol
Normal file
114
contracts/zero-ex/contracts/src/fixins/FixinProtocolFees.sol
Normal file
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
|
||||
import "../external/FeeCollector.sol";
|
||||
import "../features/libs/LibTokenSpender.sol";
|
||||
|
||||
/// @dev Helpers for collecting protocol fees.
|
||||
abstract contract FixinProtocolFees {
|
||||
bytes32 immutable feeCollectorCodeHash;
|
||||
|
||||
constructor() internal {
|
||||
feeCollectorCodeHash = keccak256(type(FeeCollector).creationCode);
|
||||
}
|
||||
|
||||
/// @dev Collect the specified protocol fee in either WETH or ETH. If
|
||||
/// msg.value is non-zero, the fee will be paid in ETH. Otherwise,
|
||||
/// this function attempts to transfer the fee in WETH. Either way,
|
||||
/// The fee is stored in a per-pool fee collector contract.
|
||||
/// @param poolId The pool ID for which a fee is being collected.
|
||||
/// @param amount The amount of ETH/WETH to be collected.
|
||||
/// @param weth The WETH token contract.
|
||||
function _collectProtocolFee(
|
||||
bytes32 poolId,
|
||||
uint256 amount,
|
||||
IERC20TokenV06 weth
|
||||
)
|
||||
internal
|
||||
{
|
||||
FeeCollector feeCollector = _getFeeCollector(poolId);
|
||||
|
||||
if (msg.value == 0) {
|
||||
// WETH
|
||||
LibTokenSpender.spendERC20Tokens(weth, msg.sender, address(feeCollector), amount);
|
||||
} else {
|
||||
// ETH
|
||||
(bool success,) = address(feeCollector).call{value: amount}("");
|
||||
require(success, "FixinProtocolFees/ETHER_TRANSFER_FALIED");
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Transfer fees for a given pool to the staking contract.
|
||||
/// @param poolId Identifies the pool whose fees are being paid.
|
||||
function _transferFeesForPool(
|
||||
bytes32 poolId,
|
||||
IStaking staking,
|
||||
IEtherTokenV06 weth
|
||||
)
|
||||
internal
|
||||
{
|
||||
FeeCollector feeCollector = _getFeeCollector(poolId);
|
||||
|
||||
uint256 codeSize;
|
||||
assembly {
|
||||
codeSize := extcodesize(feeCollector)
|
||||
}
|
||||
|
||||
if (codeSize == 0) {
|
||||
// Create and initialize the contract if necessary.
|
||||
new FeeCollector{salt: poolId}();
|
||||
feeCollector.initialize(weth, staking, poolId);
|
||||
}
|
||||
|
||||
if (address(feeCollector).balance > 1) {
|
||||
feeCollector.convertToWeth(weth);
|
||||
}
|
||||
|
||||
uint256 bal = weth.balanceOf(address(feeCollector));
|
||||
if (bal > 1) {
|
||||
// Leave 1 wei behind to avoid high SSTORE cost of zero-->non-zero.
|
||||
staking.payProtocolFee(
|
||||
address(feeCollector),
|
||||
address(feeCollector),
|
||||
bal - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Compute the CREATE2 address for a fee collector.
|
||||
/// @param poolId The fee collector's pool ID.
|
||||
function _getFeeCollector(
|
||||
bytes32 poolId
|
||||
)
|
||||
internal
|
||||
view
|
||||
returns (FeeCollector)
|
||||
{
|
||||
// Compute the CREATE2 address for the fee collector.
|
||||
address payable addr = address(uint256(keccak256(abi.encodePacked(
|
||||
byte(0xff),
|
||||
address(this),
|
||||
poolId, // pool ID is salt
|
||||
feeCollectorCodeHash
|
||||
))));
|
||||
return FeeCollector(addr);
|
||||
}
|
||||
}
|
@@ -27,6 +27,7 @@ import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
|
||||
import "@0x/contracts-utils/contracts/src/v06/LibMathV06.sol";
|
||||
import "../errors/LibTransformERC20RichErrors.sol";
|
||||
import "../vendor/v3/IExchange.sol";
|
||||
import "../vendor/v3/LibOrderHash.sol";
|
||||
import "./bridges/IBridgeAdapter.sol";
|
||||
import "./Transformer.sol";
|
||||
import "./LibERC20Transformer.sol";
|
||||
@@ -104,13 +105,8 @@ contract FillQuoteTransformer is
|
||||
|
||||
/// @dev Emitted when a trade is skipped due to a lack of funds
|
||||
/// to pay the 0x Protocol fee.
|
||||
/// @param ethBalance The current eth balance.
|
||||
/// @param ethNeeded The current eth balance required to pay
|
||||
/// the protocol fee.
|
||||
event ProtocolFeeUnfunded(
|
||||
uint256 ethBalance,
|
||||
uint256 ethNeeded
|
||||
);
|
||||
/// @param orderHash The hash of the order that was skipped.
|
||||
event ProtocolFeeUnfunded(bytes32 orderHash);
|
||||
|
||||
/// @dev The Exchange ERC20Proxy ID.
|
||||
bytes4 private constant ERC20_ASSET_PROXY_ID = 0xf47261b0;
|
||||
@@ -450,7 +446,11 @@ contract FillQuoteTransformer is
|
||||
}
|
||||
// Emit an event if we do not have sufficient ETH to cover the protocol fee.
|
||||
if (state.ethRemaining < state.protocolFee) {
|
||||
emit ProtocolFeeUnfunded(state.ethRemaining, state.protocolFee);
|
||||
bytes32 orderHash = LibOrderHash.getTypedDataHash(
|
||||
order,
|
||||
exchange.EIP712_EXCHANGE_DOMAIN_HASH()
|
||||
);
|
||||
emit ProtocolFeeUnfunded(orderHash);
|
||||
return results;
|
||||
}
|
||||
try
|
||||
|
@@ -64,22 +64,6 @@ contract BridgeAdapter is
|
||||
address private immutable UNISWAP_BRIDGE_ADDRESS;
|
||||
address private immutable UNISWAP_V2_BRIDGE_ADDRESS;
|
||||
|
||||
/// @dev Emitted when a trade occurs.
|
||||
/// @param inputToken The token the bridge is converting from.
|
||||
/// @param outputToken The token the bridge is converting to.
|
||||
/// @param inputTokenAmount Amount of input token.
|
||||
/// @param outputTokenAmount Amount of output token.
|
||||
/// @param from The bridge address, indicating the underlying source of the fill.
|
||||
/// @param to The `to` address, currrently `address(this)`
|
||||
event ERC20BridgeTransfer(
|
||||
IERC20TokenV06 inputToken,
|
||||
IERC20TokenV06 outputToken,
|
||||
uint256 inputTokenAmount,
|
||||
uint256 outputTokenAmount,
|
||||
address from,
|
||||
address to
|
||||
);
|
||||
|
||||
constructor(AdapterAddresses memory addresses)
|
||||
public
|
||||
MixinBalancer()
|
||||
@@ -89,7 +73,7 @@ contract BridgeAdapter is
|
||||
MixinMooniswap(addresses)
|
||||
MixinMStable(addresses)
|
||||
MixinOasis(addresses)
|
||||
MixinShell(addresses)
|
||||
MixinShell()
|
||||
MixinSushiswap(addresses)
|
||||
MixinUniswap(addresses)
|
||||
MixinUniswapV2(addresses)
|
||||
@@ -209,7 +193,8 @@ contract BridgeAdapter is
|
||||
sellAmount,
|
||||
bridgeData
|
||||
);
|
||||
// Do not emit an event. The bridge contract should emit one itself.
|
||||
// Old bridge contracts should emit an `ERC20BridgeTransfer` themselves,
|
||||
// otherwise an event will be emitted from `_tradeZeroExBridge`.
|
||||
return boughtAmount;
|
||||
}
|
||||
|
||||
|
@@ -44,7 +44,6 @@ contract MixinAdapterAddresses
|
||||
address uniswapV2Router;
|
||||
address uniswapExchangeFactory;
|
||||
address mStable;
|
||||
address shell;
|
||||
address dodoHelper;
|
||||
// Other
|
||||
address weth;
|
||||
|
@@ -37,22 +37,11 @@ interface IShell {
|
||||
returns (uint256 toAmount);
|
||||
}
|
||||
|
||||
|
||||
|
||||
contract MixinShell is
|
||||
MixinAdapterAddresses
|
||||
{
|
||||
using LibERC20TokenV06 for IERC20TokenV06;
|
||||
|
||||
/// @dev Mainnet address of the `Shell` contract.
|
||||
IShell private immutable SHELL;
|
||||
|
||||
constructor(AdapterAddresses memory addresses)
|
||||
public
|
||||
{
|
||||
SHELL = IShell(addresses.shell);
|
||||
}
|
||||
|
||||
function _tradeShell(
|
||||
IERC20TokenV06 buyToken,
|
||||
uint256 sellAmount,
|
||||
@@ -61,15 +50,15 @@ contract MixinShell is
|
||||
internal
|
||||
returns (uint256 boughtAmount)
|
||||
{
|
||||
(address fromTokenAddress) = abi.decode(bridgeData, (address));
|
||||
(address fromTokenAddress, address pool) = abi.decode(bridgeData, (address, address));
|
||||
|
||||
// Grant the Shell contract an allowance to sell the first token.
|
||||
IERC20TokenV06(fromTokenAddress).approveIfBelow(
|
||||
address(SHELL),
|
||||
pool,
|
||||
sellAmount
|
||||
);
|
||||
|
||||
boughtAmount = SHELL.originSwap(
|
||||
boughtAmount = IShell(pool).originSwap(
|
||||
fromTokenAddress,
|
||||
address(buyToken),
|
||||
// Sell all tokens we hold.
|
||||
|
@@ -21,32 +21,31 @@ pragma solidity ^0.6.5;
|
||||
import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol";
|
||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
||||
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
|
||||
import "../../../vendor/ILiquidityProvider.sol";
|
||||
import "../../../vendor/v3/IERC20Bridge.sol";
|
||||
|
||||
interface IERC20Bridge {
|
||||
|
||||
/// @dev Transfers `amount` of the ERC20 `buyToken` from `from` to `to`.
|
||||
/// @param buyToken The address of the ERC20 token to transfer.
|
||||
/// @param from Address to transfer asset from.
|
||||
/// @param to Address to transfer asset to.
|
||||
/// @param amount Amount of asset to transfer.
|
||||
/// @param bridgeData Arbitrary asset data needed by the bridge contract.
|
||||
/// @return success The magic bytes `0xdc1600f3` if successful.
|
||||
function bridgeTransferFrom(
|
||||
IERC20TokenV06 buyToken,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount,
|
||||
bytes calldata bridgeData
|
||||
)
|
||||
external
|
||||
returns (bytes4 success);
|
||||
}
|
||||
|
||||
contract MixinZeroExBridge {
|
||||
|
||||
using LibERC20TokenV06 for IERC20TokenV06;
|
||||
using LibSafeMathV06 for uint256;
|
||||
|
||||
/// @dev Emitted when a trade occurs.
|
||||
/// @param inputToken The token the bridge is converting from.
|
||||
/// @param outputToken The token the bridge is converting to.
|
||||
/// @param inputTokenAmount Amount of input token.
|
||||
/// @param outputTokenAmount Amount of output token.
|
||||
/// @param from The bridge address, indicating the underlying source of the fill.
|
||||
/// @param to The `to` address, currrently `address(this)`
|
||||
event ERC20BridgeTransfer(
|
||||
IERC20TokenV06 inputToken,
|
||||
IERC20TokenV06 outputToken,
|
||||
uint256 inputTokenAmount,
|
||||
uint256 outputTokenAmount,
|
||||
address from,
|
||||
address to
|
||||
);
|
||||
|
||||
function _tradeZeroExBridge(
|
||||
address bridgeAddress,
|
||||
IERC20TokenV06 sellToken,
|
||||
@@ -63,13 +62,31 @@ contract MixinZeroExBridge {
|
||||
bridgeAddress,
|
||||
sellAmount
|
||||
);
|
||||
IERC20Bridge(bridgeAddress).bridgeTransferFrom(
|
||||
buyToken,
|
||||
address(bridgeAddress),
|
||||
address(this),
|
||||
1, // amount to transfer back from the bridge
|
||||
bridgeData
|
||||
);
|
||||
boughtAmount = buyToken.balanceOf(address(this)).safeSub(balanceBefore);
|
||||
try ILiquidityProvider(bridgeAddress).sellTokenForToken(
|
||||
address(sellToken),
|
||||
address(buyToken),
|
||||
address(this), // recipient
|
||||
1, // minBuyAmount
|
||||
bridgeData
|
||||
) {
|
||||
boughtAmount = buyToken.balanceOf(address(this)).safeSub(balanceBefore);
|
||||
emit ERC20BridgeTransfer(
|
||||
sellToken,
|
||||
buyToken,
|
||||
sellAmount,
|
||||
boughtAmount,
|
||||
bridgeAddress,
|
||||
address(this)
|
||||
);
|
||||
} catch {
|
||||
IERC20Bridge(bridgeAddress).bridgeTransferFrom(
|
||||
address(buyToken),
|
||||
bridgeAddress,
|
||||
address(this), // recipient
|
||||
1, // minBuyAmount
|
||||
bridgeData
|
||||
);
|
||||
boughtAmount = buyToken.balanceOf(address(this)).safeSub(balanceBefore);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
92
contracts/zero-ex/contracts/src/vendor/ILiquidityProvider.sol
vendored
Normal file
92
contracts/zero-ex/contracts/src/vendor/ILiquidityProvider.sol
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
|
||||
interface ILiquidityProvider {
|
||||
|
||||
/// @dev Trades `inputToken` for `outputToken`. The amount of `inputToken`
|
||||
/// to sell must be transferred to the contract prior to calling this
|
||||
/// function to trigger the trade.
|
||||
/// @param inputToken The token being sold.
|
||||
/// @param outputToken The token being bought.
|
||||
/// @param recipient The recipient of the bought tokens.
|
||||
/// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.
|
||||
/// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.
|
||||
/// @return boughtAmount The amount of `outputToken` bought.
|
||||
function sellTokenForToken(
|
||||
address inputToken,
|
||||
address outputToken,
|
||||
address recipient,
|
||||
uint256 minBuyAmount,
|
||||
bytes calldata auxiliaryData
|
||||
)
|
||||
external
|
||||
returns (uint256 boughtAmount);
|
||||
|
||||
/// @dev Trades ETH for token. ETH must either be attached to this function
|
||||
/// call or sent to the contract prior to calling this function to
|
||||
/// trigger the trade.
|
||||
/// @param outputToken The token being bought.
|
||||
/// @param recipient The recipient of the bought tokens.
|
||||
/// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.
|
||||
/// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.
|
||||
/// @return boughtAmount The amount of `outputToken` bought.
|
||||
function sellEthForToken(
|
||||
address outputToken,
|
||||
address recipient,
|
||||
uint256 minBuyAmount,
|
||||
bytes calldata auxiliaryData
|
||||
)
|
||||
external
|
||||
payable
|
||||
returns (uint256 boughtAmount);
|
||||
|
||||
/// @dev Trades token for ETH. The token must be sent to the contract prior
|
||||
/// to calling this function to trigger the trade.
|
||||
/// @param inputToken The token being sold.
|
||||
/// @param recipient The recipient of the bought tokens.
|
||||
/// @param minBuyAmount The minimum acceptable amount of ETH to buy.
|
||||
/// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.
|
||||
/// @return boughtAmount The amount of ETH bought.
|
||||
function sellTokenForEth(
|
||||
address inputToken,
|
||||
address payable recipient,
|
||||
uint256 minBuyAmount,
|
||||
bytes calldata auxiliaryData
|
||||
)
|
||||
external
|
||||
returns (uint256 boughtAmount);
|
||||
|
||||
/// @dev Quotes the amount of `outputToken` that would be obtained by
|
||||
/// selling `sellAmount` of `inputToken`.
|
||||
/// @param inputToken Address of the taker token (what to sell). Use
|
||||
/// the wETH address if selling ETH.
|
||||
/// @param outputToken Address of the maker token (what to buy). Use
|
||||
/// the wETH address if buying ETH.
|
||||
/// @param sellAmount Amount of `inputToken` to sell.
|
||||
/// @return outputTokenAmount Amount of `outputToken` that would be obtained.
|
||||
function getSellQuote(
|
||||
address inputToken,
|
||||
address outputToken,
|
||||
uint256 sellAmount
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (uint256 outputTokenAmount);
|
||||
}
|
@@ -104,4 +104,9 @@ interface IExchange {
|
||||
external
|
||||
view
|
||||
returns (address proxyAddress);
|
||||
|
||||
function EIP712_EXCHANGE_DOMAIN_HASH()
|
||||
external
|
||||
view
|
||||
returns (bytes32 domainHash);
|
||||
}
|
||||
|
24
contracts/zero-ex/contracts/src/vendor/v3/IStaking.sol
vendored
Normal file
24
contracts/zero-ex/contracts/src/vendor/v3/IStaking.sol
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
|
||||
interface IStaking {
|
||||
function joinStakingPoolAsMaker(bytes32) external;
|
||||
function payProtocolFee(address, address, uint256) external payable;
|
||||
}
|
167
contracts/zero-ex/contracts/src/vendor/v3/LibOrderHash.sol
vendored
Normal file
167
contracts/zero-ex/contracts/src/vendor/v3/LibOrderHash.sol
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
|
||||
import "./IExchange.sol";
|
||||
|
||||
|
||||
library LibOrderHash {
|
||||
|
||||
using LibOrderHash for IExchange.Order;
|
||||
|
||||
// Hash for the EIP712 Order Schema:
|
||||
// keccak256(abi.encodePacked(
|
||||
// "Order(",
|
||||
// "address makerAddress,",
|
||||
// "address takerAddress,",
|
||||
// "address feeRecipientAddress,",
|
||||
// "address senderAddress,",
|
||||
// "uint256 makerAssetAmount,",
|
||||
// "uint256 takerAssetAmount,",
|
||||
// "uint256 makerFee,",
|
||||
// "uint256 takerFee,",
|
||||
// "uint256 expirationTimeSeconds,",
|
||||
// "uint256 salt,",
|
||||
// "bytes makerAssetData,",
|
||||
// "bytes takerAssetData,",
|
||||
// "bytes makerFeeAssetData,",
|
||||
// "bytes takerFeeAssetData",
|
||||
// ")"
|
||||
// ))
|
||||
bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =
|
||||
0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;
|
||||
|
||||
/// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.
|
||||
/// @param order The order structure.
|
||||
/// @param eip712ExchangeDomainHash Domain hash for the Exchange.
|
||||
/// @return orderHash EIP712 typed data hash of the order.
|
||||
function getTypedDataHash(IExchange.Order memory order, bytes32 eip712ExchangeDomainHash)
|
||||
internal
|
||||
pure
|
||||
returns (bytes32 orderHash)
|
||||
{
|
||||
orderHash = _hashEIP712Message(
|
||||
eip712ExchangeDomainHash,
|
||||
order.getStructHash()
|
||||
);
|
||||
return orderHash;
|
||||
}
|
||||
|
||||
/// @dev Calculates EIP712 hash of the order struct.
|
||||
/// @param order The order structure.
|
||||
/// @return result EIP712 hash of the order struct.
|
||||
function getStructHash(IExchange.Order memory order)
|
||||
internal
|
||||
pure
|
||||
returns (bytes32 result)
|
||||
{
|
||||
bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;
|
||||
bytes memory makerAssetData = order.makerAssetData;
|
||||
bytes memory takerAssetData = order.takerAssetData;
|
||||
bytes memory makerFeeAssetData = order.makerFeeAssetData;
|
||||
bytes memory takerFeeAssetData = order.takerFeeAssetData;
|
||||
|
||||
// Assembly for more efficiently computing:
|
||||
// keccak256(abi.encodePacked(
|
||||
// EIP712_ORDER_SCHEMA_HASH,
|
||||
// uint256(order.makerAddress),
|
||||
// uint256(order.takerAddress),
|
||||
// uint256(order.feeRecipientAddress),
|
||||
// uint256(order.senderAddress),
|
||||
// order.makerAssetAmount,
|
||||
// order.takerAssetAmount,
|
||||
// order.makerFee,
|
||||
// order.takerFee,
|
||||
// order.expirationTimeSeconds,
|
||||
// order.salt,
|
||||
// keccak256(order.makerAssetData),
|
||||
// keccak256(order.takerAssetData),
|
||||
// keccak256(order.makerFeeAssetData),
|
||||
// keccak256(order.takerFeeAssetData)
|
||||
// ));
|
||||
|
||||
assembly {
|
||||
// Assert order offset (this is an internal error that should never be triggered)
|
||||
if lt(order, 32) {
|
||||
invalid()
|
||||
}
|
||||
|
||||
// Calculate memory addresses that will be swapped out before hashing
|
||||
let pos1 := sub(order, 32)
|
||||
let pos2 := add(order, 320)
|
||||
let pos3 := add(order, 352)
|
||||
let pos4 := add(order, 384)
|
||||
let pos5 := add(order, 416)
|
||||
|
||||
// Backup
|
||||
let temp1 := mload(pos1)
|
||||
let temp2 := mload(pos2)
|
||||
let temp3 := mload(pos3)
|
||||
let temp4 := mload(pos4)
|
||||
let temp5 := mload(pos5)
|
||||
|
||||
// Hash in place
|
||||
mstore(pos1, schemaHash)
|
||||
mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData))) // store hash of makerAssetData
|
||||
mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData))) // store hash of takerAssetData
|
||||
mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData))) // store hash of makerFeeAssetData
|
||||
mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData))) // store hash of takerFeeAssetData
|
||||
result := keccak256(pos1, 480)
|
||||
|
||||
// Restore
|
||||
mstore(pos1, temp1)
|
||||
mstore(pos2, temp2)
|
||||
mstore(pos3, temp3)
|
||||
mstore(pos4, temp4)
|
||||
mstore(pos5, temp5)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.
|
||||
/// @param eip712DomainHash Hash of the domain domain separator data, computed
|
||||
/// with getDomainHash().
|
||||
/// @param hashStruct The EIP712 hash struct.
|
||||
/// @return result EIP712 hash applied to the given EIP712 Domain.
|
||||
function _hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)
|
||||
internal
|
||||
pure
|
||||
returns (bytes32 result)
|
||||
{
|
||||
// Assembly for more efficient computing:
|
||||
// keccak256(abi.encodePacked(
|
||||
// EIP191_HEADER,
|
||||
// EIP712_DOMAIN_HASH,
|
||||
// hashStruct
|
||||
// ));
|
||||
|
||||
assembly {
|
||||
// Load free memory pointer
|
||||
let memPtr := mload(64)
|
||||
|
||||
mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header
|
||||
mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash
|
||||
mstore(add(memPtr, 34), hashStruct) // Hash of struct
|
||||
|
||||
// Compute hash
|
||||
result := keccak256(memPtr, 66)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
@@ -35,6 +35,8 @@ contract TestFillQuoteTransformerExchange {
|
||||
uint256 makerAssetMintRatio;
|
||||
}
|
||||
|
||||
bytes32 public constant EIP712_EXCHANGE_DOMAIN_HASH = 0xaa81d881b1adbbf115e15b849cb9cdc643cad3c6a90f30eb505954af943247e6;
|
||||
|
||||
uint256 private constant PROTOCOL_FEE_MULTIPLIER = 1337;
|
||||
|
||||
using LibSafeMathV06 for uint256;
|
||||
|
34
contracts/zero-ex/contracts/test/TestLibSignature.sol
Normal file
34
contracts/zero-ex/contracts/test/TestLibSignature.sol
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "../src/features/libs/LibSignature.sol";
|
||||
|
||||
|
||||
contract TestLibSignature {
|
||||
|
||||
function getSignerOfHash(bytes32 hash, LibSignature.Signature calldata signature)
|
||||
external
|
||||
pure
|
||||
returns (address signer)
|
||||
{
|
||||
return LibSignature.getSignerOfHash(hash, signature);
|
||||
}
|
||||
}
|
55
contracts/zero-ex/contracts/test/TestProtocolFees.sol
Normal file
55
contracts/zero-ex/contracts/test/TestProtocolFees.sol
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "../src/fixins/FixinProtocolFees.sol";
|
||||
|
||||
contract TestProtocolFees is FixinProtocolFees {
|
||||
function collectProtocolFee(
|
||||
bytes32 poolId,
|
||||
uint256 amount,
|
||||
IERC20TokenV06 weth
|
||||
)
|
||||
external
|
||||
payable
|
||||
{
|
||||
_collectProtocolFee(poolId, amount, weth);
|
||||
}
|
||||
|
||||
function transferFeesForPool(
|
||||
bytes32 poolId,
|
||||
IStaking staking,
|
||||
IEtherTokenV06 weth
|
||||
)
|
||||
external
|
||||
{
|
||||
_transferFeesForPool(poolId, staking, weth);
|
||||
}
|
||||
|
||||
function getFeeCollector(
|
||||
bytes32 poolId
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (FeeCollector)
|
||||
{
|
||||
return _getFeeCollector(poolId);
|
||||
}
|
||||
}
|
49
contracts/zero-ex/contracts/test/TestStaking.sol
Normal file
49
contracts/zero-ex/contracts/test/TestStaking.sol
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6.5;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
|
||||
|
||||
contract TestStaking {
|
||||
mapping(address => bytes32) public poolForMaker;
|
||||
mapping(bytes32 => uint256) public balanceForPool;
|
||||
|
||||
IEtherTokenV06 immutable weth;
|
||||
|
||||
constructor(IEtherTokenV06 _weth) public {
|
||||
weth = _weth;
|
||||
}
|
||||
|
||||
function joinStakingPoolAsMaker(bytes32 poolId) external {
|
||||
poolForMaker[msg.sender] = poolId;
|
||||
}
|
||||
|
||||
function payProtocolFee(
|
||||
address makerAddress,
|
||||
address payerAddress,
|
||||
uint256 amount
|
||||
)
|
||||
external
|
||||
payable
|
||||
{
|
||||
require(weth.transferFrom(payerAddress, address(this), amount));
|
||||
balanceForPool[poolForMaker[makerAddress]] += amount;
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/contracts-zero-ex",
|
||||
"version": "0.5.1",
|
||||
"version": "0.7.0",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -10,8 +10,9 @@
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "yarn pre_build && tsc -b",
|
||||
"build": "yarn pre_build && yarn build:ts",
|
||||
"build:ci": "yarn build",
|
||||
"build:ts": "tsc -b",
|
||||
"pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy",
|
||||
"test": "yarn run_mocha",
|
||||
"rebuild_and_test": "run-s build test",
|
||||
@@ -41,7 +42,7 @@
|
||||
"config": {
|
||||
"publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IAllowanceTarget,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITokenSpenderFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,TokenSpenderFeature,AffiliateFeeTransformer,SignatureValidatorFeature,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature",
|
||||
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
|
||||
"abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|AllowanceTarget|BootstrapFeature|BridgeAdapter|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinReentrancyGuard|FlashWallet|FullMigration|IAllowanceTarget|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IExchange|IFeature|IFlashWallet|IGasToken|ILiquidityProviderFeature|IMetaTransactionsFeature|IOwnableFeature|ISignatureValidatorFeature|ISimpleFunctionRegistryFeature|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibLiquidityProviderRichErrors|LibLiquidityProviderStorage|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignatureRichErrors|LibSignedCallData|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibSpenderRichErrors|LibStorage|LibTokenSpender|LibTokenSpenderStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LogMetadataTransformer|MetaTransactionsFeature|MixinAdapterAddresses|MixinBalancer|MixinCurve|MixinDodo|MixinKyber|MixinMStable|MixinMooniswap|MixinOasis|MixinShell|MixinSushiswap|MixinUniswap|MixinUniswapV2|MixinZeroExBridge|OwnableFeature|PayTakerTransformer|SignatureValidatorFeature|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestDelegateCaller|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFullMigration|TestInitialMigration|TestLibTokenSpender|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestTokenSpender|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestWeth|TestWethTransformerHost|TestZeroExFeature|TokenSpenderFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|WethTransformer|ZeroEx).json"
|
||||
"abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|AllowanceTarget|BootstrapFeature|BridgeAdapter|FeeCollector|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FlashWallet|FullMigration|IAllowanceTarget|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IExchange|IFeature|IFlashWallet|IGasToken|ILiquidityProvider|ILiquidityProviderFeature|IMetaTransactionsFeature|IOwnableFeature|ISignatureValidatorFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibLiquidityProviderRichErrors|LibLiquidityProviderStorage|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibOrderHash|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSignedCallData|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibSpenderRichErrors|LibStorage|LibTokenSpender|LibTokenSpenderStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LogMetadataTransformer|MetaTransactionsFeature|MixinAdapterAddresses|MixinBalancer|MixinCurve|MixinDodo|MixinKyber|MixinMStable|MixinMooniswap|MixinOasis|MixinShell|MixinSushiswap|MixinUniswap|MixinUniswapV2|MixinZeroExBridge|OwnableFeature|PayTakerTransformer|SignatureValidatorFeature|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestDelegateCaller|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFullMigration|TestInitialMigration|TestLibSignature|TestLibTokenSpender|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestProtocolFees|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpender|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestWeth|TestWethTransformerHost|TestZeroExFeature|TokenSpenderFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|WethTransformer|ZeroEx).json"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -53,13 +54,12 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/zero-ex",
|
||||
"devDependencies": {
|
||||
"@0x/abi-gen": "^5.4.3",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-gen": "2.0.13",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/abi-gen": "^5.4.7",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-gen": "2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@types/lodash": "4.14.104",
|
||||
@@ -75,12 +75,13 @@
|
||||
"typescript": "3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/subproviders": "^6.1.5",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/subproviders": "^6.1.9",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"ethereum-types": "^3.3.3",
|
||||
"ethereumjs-util": "^5.1.1"
|
||||
},
|
||||
|
@@ -32,6 +32,7 @@ export { artifacts } from './artifacts';
|
||||
export * from './migration';
|
||||
export * from './nonce_utils';
|
||||
export * from './signed_call_data';
|
||||
export * from './signature_utils';
|
||||
export {
|
||||
AffiliateFeeTransformerContract,
|
||||
BridgeAdapterContract,
|
||||
@@ -48,3 +49,6 @@ export {
|
||||
WethTransformerContract,
|
||||
ZeroExContract,
|
||||
} from './wrappers';
|
||||
export * from './revert_errors';
|
||||
export { EIP712TypedData } from '@0x/types';
|
||||
export { SupportedProvider } from '@0x/subproviders';
|
||||
|
30
contracts/zero-ex/src/revert_errors.ts
Normal file
30
contracts/zero-ex/src/revert_errors.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
// TODO(dorothy-zbornak): Move these into `@0x/protocol-utils` whenever that
|
||||
// becomes a thing.
|
||||
// tslint:disable:max-classes-per-file
|
||||
import { RevertError } from '@0x/utils';
|
||||
|
||||
export enum SignatureValidationErrorCodes {
|
||||
AlwaysInvalid = 0,
|
||||
InvalidLength = 1,
|
||||
Unsupported = 2,
|
||||
Illegal = 3,
|
||||
WrongSigner = 4,
|
||||
BadSignatureData = 5,
|
||||
}
|
||||
|
||||
// tslint:disable:max-classes-per-file
|
||||
export class SignatureValidationError extends RevertError {
|
||||
constructor(code?: SignatureValidationErrorCodes, hash?: string) {
|
||||
super('SignatureValidationError', 'SignatureValidationError(uint8 code, bytes32 hash)', {
|
||||
code,
|
||||
hash,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const types = [SignatureValidationError];
|
||||
|
||||
// Register the types we've defined.
|
||||
for (const type of types) {
|
||||
RevertError.registerType(type);
|
||||
}
|
113
contracts/zero-ex/src/signature_utils.ts
Normal file
113
contracts/zero-ex/src/signature_utils.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { signatureUtils } from '@0x/order-utils';
|
||||
import { SupportedProvider } from '@0x/subproviders';
|
||||
import { EIP712TypedData } from '@0x/types';
|
||||
import { hexUtils, signTypedDataUtils } from '@0x/utils';
|
||||
import * as ethjs from 'ethereumjs-util';
|
||||
|
||||
/**
|
||||
* Valid signature types on the Exchange Proxy.
|
||||
*/
|
||||
export enum SignatureType {
|
||||
Illegal = 0,
|
||||
Invalid = 1,
|
||||
EIP712 = 2,
|
||||
EthSign = 3,
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a raw EC signature.
|
||||
*/
|
||||
export interface ECSignature {
|
||||
v: number;
|
||||
r: string;
|
||||
s: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* A complete signature on the Exchange Proxy.
|
||||
*/
|
||||
export interface Signature extends ECSignature {
|
||||
signatureType: SignatureType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign a hash with the EthSign signature type on a provider.
|
||||
*/
|
||||
export async function ethSignHashFromProviderAsync(
|
||||
signer: string,
|
||||
hash: string,
|
||||
provider: SupportedProvider,
|
||||
): Promise<Signature> {
|
||||
const signatureBytes = await signatureUtils.ecSignHashAsync(provider, hash, signer);
|
||||
const parsed = parsePackedSignatureBytes(signatureBytes);
|
||||
assertSignatureType(parsed, SignatureType.EthSign);
|
||||
return parsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign a hash with the EthSign signature type, given a private key.
|
||||
*/
|
||||
export function ethSignHashWithKey(hash: string, key: string): Signature {
|
||||
const ethHash = hexUtils.toHex(
|
||||
ethjs.sha3(hexUtils.concat(ethjs.toBuffer('\x19Ethereum Signed Message:\n32'), hash)),
|
||||
);
|
||||
return {
|
||||
...ecSignHashWithKey(ethHash, key),
|
||||
signatureType: SignatureType.EthSign,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign a typed data object with the EIP712 signature type, given a private key.
|
||||
*/
|
||||
export function eip712SignTypedDataWithKey(typedData: EIP712TypedData, key: string): Signature {
|
||||
const hash = hexUtils.toHex(signTypedDataUtils.generateTypedDataHash(typedData));
|
||||
return {
|
||||
...ecSignHashWithKey(hash, key),
|
||||
signatureType: SignatureType.EIP712,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign an EIP712 hash with the EIP712 signature type, given a private key.
|
||||
*/
|
||||
export function eip712SignHashWithKey(hash: string, key: string): Signature {
|
||||
return {
|
||||
...ecSignHashWithKey(hash, key),
|
||||
signatureType: SignatureType.EIP712,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the EC signature for a hash given a private key.
|
||||
*/
|
||||
export function ecSignHashWithKey(hash: string, key: string): ECSignature {
|
||||
const { v, r, s } = ethjs.ecsign(ethjs.toBuffer(hash), ethjs.toBuffer(key));
|
||||
return {
|
||||
v,
|
||||
r: ethjs.bufferToHex(r),
|
||||
s: ethjs.bufferToHex(s),
|
||||
};
|
||||
}
|
||||
|
||||
function assertSignatureType(signature: Signature, expectedType: SignatureType): void {
|
||||
if (signature.signatureType !== expectedType) {
|
||||
throw new Error(`Expected signature type to be ${expectedType} but received ${signature.signatureType}.`);
|
||||
}
|
||||
}
|
||||
|
||||
function parsePackedSignatureBytes(signatureBytes: string): Signature {
|
||||
if (hexUtils.size(signatureBytes) !== 66) {
|
||||
throw new Error(`Expected packed signatureBytes to be 66 bytes long: ${signatureBytes}`);
|
||||
}
|
||||
const typeId = parseInt(signatureBytes.slice(-2), 16) as SignatureType;
|
||||
if (!Object.values(SignatureType).includes(typeId)) {
|
||||
throw new Error(`Invalid signatureBytes type ID detected: ${typeId}`);
|
||||
}
|
||||
return {
|
||||
signatureType: typeId,
|
||||
v: parseInt(signatureBytes.slice(2, 4), 16),
|
||||
r: hexUtils.slice(signatureBytes, 1, 33),
|
||||
s: hexUtils.slice(signatureBytes, 33),
|
||||
};
|
||||
}
|
@@ -9,9 +9,11 @@ import * as AffiliateFeeTransformer from '../test/generated-artifacts/AffiliateF
|
||||
import * as AllowanceTarget from '../test/generated-artifacts/AllowanceTarget.json';
|
||||
import * as BootstrapFeature from '../test/generated-artifacts/BootstrapFeature.json';
|
||||
import * as BridgeAdapter from '../test/generated-artifacts/BridgeAdapter.json';
|
||||
import * as FeeCollector from '../test/generated-artifacts/FeeCollector.json';
|
||||
import * as FillQuoteTransformer from '../test/generated-artifacts/FillQuoteTransformer.json';
|
||||
import * as FixinCommon from '../test/generated-artifacts/FixinCommon.json';
|
||||
import * as FixinEIP712 from '../test/generated-artifacts/FixinEIP712.json';
|
||||
import * as FixinProtocolFees from '../test/generated-artifacts/FixinProtocolFees.json';
|
||||
import * as FixinReentrancyGuard from '../test/generated-artifacts/FixinReentrancyGuard.json';
|
||||
import * as FlashWallet from '../test/generated-artifacts/FlashWallet.json';
|
||||
import * as FullMigration from '../test/generated-artifacts/FullMigration.json';
|
||||
@@ -24,12 +26,14 @@ import * as IExchange from '../test/generated-artifacts/IExchange.json';
|
||||
import * as IFeature from '../test/generated-artifacts/IFeature.json';
|
||||
import * as IFlashWallet from '../test/generated-artifacts/IFlashWallet.json';
|
||||
import * as IGasToken from '../test/generated-artifacts/IGasToken.json';
|
||||
import * as ILiquidityProvider from '../test/generated-artifacts/ILiquidityProvider.json';
|
||||
import * as ILiquidityProviderFeature from '../test/generated-artifacts/ILiquidityProviderFeature.json';
|
||||
import * as IMetaTransactionsFeature from '../test/generated-artifacts/IMetaTransactionsFeature.json';
|
||||
import * as InitialMigration from '../test/generated-artifacts/InitialMigration.json';
|
||||
import * as IOwnableFeature from '../test/generated-artifacts/IOwnableFeature.json';
|
||||
import * as ISignatureValidatorFeature from '../test/generated-artifacts/ISignatureValidatorFeature.json';
|
||||
import * as ISimpleFunctionRegistryFeature from '../test/generated-artifacts/ISimpleFunctionRegistryFeature.json';
|
||||
import * as IStaking from '../test/generated-artifacts/IStaking.json';
|
||||
import * as ITestSimpleFunctionRegistryFeature from '../test/generated-artifacts/ITestSimpleFunctionRegistryFeature.json';
|
||||
import * as ITokenSpenderFeature from '../test/generated-artifacts/ITokenSpenderFeature.json';
|
||||
import * as ITransformERC20Feature from '../test/generated-artifacts/ITransformERC20Feature.json';
|
||||
@@ -43,11 +47,13 @@ import * as LibLiquidityProviderStorage from '../test/generated-artifacts/LibLiq
|
||||
import * as LibMetaTransactionsRichErrors from '../test/generated-artifacts/LibMetaTransactionsRichErrors.json';
|
||||
import * as LibMetaTransactionsStorage from '../test/generated-artifacts/LibMetaTransactionsStorage.json';
|
||||
import * as LibMigrate from '../test/generated-artifacts/LibMigrate.json';
|
||||
import * as LibOrderHash from '../test/generated-artifacts/LibOrderHash.json';
|
||||
import * as LibOwnableRichErrors from '../test/generated-artifacts/LibOwnableRichErrors.json';
|
||||
import * as LibOwnableStorage from '../test/generated-artifacts/LibOwnableStorage.json';
|
||||
import * as LibProxyRichErrors from '../test/generated-artifacts/LibProxyRichErrors.json';
|
||||
import * as LibProxyStorage from '../test/generated-artifacts/LibProxyStorage.json';
|
||||
import * as LibReentrancyGuardStorage from '../test/generated-artifacts/LibReentrancyGuardStorage.json';
|
||||
import * as LibSignature from '../test/generated-artifacts/LibSignature.json';
|
||||
import * as LibSignatureRichErrors from '../test/generated-artifacts/LibSignatureRichErrors.json';
|
||||
import * as LibSignedCallData from '../test/generated-artifacts/LibSignedCallData.json';
|
||||
import * as LibSimpleFunctionRegistryRichErrors from '../test/generated-artifacts/LibSimpleFunctionRegistryRichErrors.json';
|
||||
@@ -87,13 +93,16 @@ import * as TestFillQuoteTransformerExchange from '../test/generated-artifacts/T
|
||||
import * as TestFillQuoteTransformerHost from '../test/generated-artifacts/TestFillQuoteTransformerHost.json';
|
||||
import * as TestFullMigration from '../test/generated-artifacts/TestFullMigration.json';
|
||||
import * as TestInitialMigration from '../test/generated-artifacts/TestInitialMigration.json';
|
||||
import * as TestLibSignature from '../test/generated-artifacts/TestLibSignature.json';
|
||||
import * as TestLibTokenSpender from '../test/generated-artifacts/TestLibTokenSpender.json';
|
||||
import * as TestMetaTransactionsTransformERC20Feature from '../test/generated-artifacts/TestMetaTransactionsTransformERC20Feature.json';
|
||||
import * as TestMigrator from '../test/generated-artifacts/TestMigrator.json';
|
||||
import * as TestMintableERC20Token from '../test/generated-artifacts/TestMintableERC20Token.json';
|
||||
import * as TestMintTokenERC20Transformer from '../test/generated-artifacts/TestMintTokenERC20Transformer.json';
|
||||
import * as TestProtocolFees from '../test/generated-artifacts/TestProtocolFees.json';
|
||||
import * as TestSimpleFunctionRegistryFeatureImpl1 from '../test/generated-artifacts/TestSimpleFunctionRegistryFeatureImpl1.json';
|
||||
import * as TestSimpleFunctionRegistryFeatureImpl2 from '../test/generated-artifacts/TestSimpleFunctionRegistryFeatureImpl2.json';
|
||||
import * as TestStaking from '../test/generated-artifacts/TestStaking.json';
|
||||
import * as TestTokenSpender from '../test/generated-artifacts/TestTokenSpender.json';
|
||||
import * as TestTokenSpenderERC20Token from '../test/generated-artifacts/TestTokenSpenderERC20Token.json';
|
||||
import * as TestTransformerBase from '../test/generated-artifacts/TestTransformerBase.json';
|
||||
@@ -124,6 +133,7 @@ export const artifacts = {
|
||||
LibTransformERC20RichErrors: LibTransformERC20RichErrors as ContractArtifact,
|
||||
LibWalletRichErrors: LibWalletRichErrors as ContractArtifact,
|
||||
AllowanceTarget: AllowanceTarget as ContractArtifact,
|
||||
FeeCollector: FeeCollector as ContractArtifact,
|
||||
FlashWallet: FlashWallet as ContractArtifact,
|
||||
IAllowanceTarget: IAllowanceTarget as ContractArtifact,
|
||||
IFlashWallet: IFlashWallet as ContractArtifact,
|
||||
@@ -147,10 +157,12 @@ export const artifacts = {
|
||||
TokenSpenderFeature: TokenSpenderFeature as ContractArtifact,
|
||||
TransformERC20Feature: TransformERC20Feature as ContractArtifact,
|
||||
UniswapFeature: UniswapFeature as ContractArtifact,
|
||||
LibSignature: LibSignature as ContractArtifact,
|
||||
LibSignedCallData: LibSignedCallData as ContractArtifact,
|
||||
LibTokenSpender: LibTokenSpender as ContractArtifact,
|
||||
FixinCommon: FixinCommon as ContractArtifact,
|
||||
FixinEIP712: FixinEIP712 as ContractArtifact,
|
||||
FixinProtocolFees: FixinProtocolFees as ContractArtifact,
|
||||
FixinReentrancyGuard: FixinReentrancyGuard as ContractArtifact,
|
||||
FullMigration: FullMigration as ContractArtifact,
|
||||
InitialMigration: InitialMigration as ContractArtifact,
|
||||
@@ -188,9 +200,12 @@ export const artifacts = {
|
||||
MixinUniswap: MixinUniswap as ContractArtifact,
|
||||
MixinUniswapV2: MixinUniswapV2 as ContractArtifact,
|
||||
MixinZeroExBridge: MixinZeroExBridge as ContractArtifact,
|
||||
ILiquidityProvider: ILiquidityProvider as ContractArtifact,
|
||||
IERC20Bridge: IERC20Bridge as ContractArtifact,
|
||||
IExchange: IExchange as ContractArtifact,
|
||||
IGasToken: IGasToken as ContractArtifact,
|
||||
IStaking: IStaking as ContractArtifact,
|
||||
LibOrderHash: LibOrderHash as ContractArtifact,
|
||||
ITestSimpleFunctionRegistryFeature: ITestSimpleFunctionRegistryFeature as ContractArtifact,
|
||||
TestBridge: TestBridge as ContractArtifact,
|
||||
TestCallTarget: TestCallTarget as ContractArtifact,
|
||||
@@ -200,13 +215,16 @@ export const artifacts = {
|
||||
TestFillQuoteTransformerHost: TestFillQuoteTransformerHost as ContractArtifact,
|
||||
TestFullMigration: TestFullMigration as ContractArtifact,
|
||||
TestInitialMigration: TestInitialMigration as ContractArtifact,
|
||||
TestLibSignature: TestLibSignature as ContractArtifact,
|
||||
TestLibTokenSpender: TestLibTokenSpender as ContractArtifact,
|
||||
TestMetaTransactionsTransformERC20Feature: TestMetaTransactionsTransformERC20Feature as ContractArtifact,
|
||||
TestMigrator: TestMigrator as ContractArtifact,
|
||||
TestMintTokenERC20Transformer: TestMintTokenERC20Transformer as ContractArtifact,
|
||||
TestMintableERC20Token: TestMintableERC20Token as ContractArtifact,
|
||||
TestProtocolFees: TestProtocolFees as ContractArtifact,
|
||||
TestSimpleFunctionRegistryFeatureImpl1: TestSimpleFunctionRegistryFeatureImpl1 as ContractArtifact,
|
||||
TestSimpleFunctionRegistryFeatureImpl2: TestSimpleFunctionRegistryFeatureImpl2 as ContractArtifact,
|
||||
TestStaking: TestStaking as ContractArtifact,
|
||||
TestTokenSpender: TestTokenSpender as ContractArtifact,
|
||||
TestTokenSpenderERC20Token: TestTokenSpenderERC20Token as ContractArtifact,
|
||||
TestTransformERC20: TestTransformERC20 as ContractArtifact,
|
||||
|
98
contracts/zero-ex/test/lib_signature_test.ts
Normal file
98
contracts/zero-ex/test/lib_signature_test.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import { blockchainTests, expect } from '@0x/contracts-test-utils';
|
||||
import { hexUtils } from '@0x/utils';
|
||||
import * as ethjs from 'ethereumjs-util';
|
||||
|
||||
import { SignatureValidationError, SignatureValidationErrorCodes } from '../src/revert_errors';
|
||||
import { eip712SignHashWithKey, ethSignHashWithKey, SignatureType } from '../src/signature_utils';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
import { TestLibSignatureContract } from './wrappers';
|
||||
|
||||
const EMPTY_REVERT = 'reverted with no data';
|
||||
|
||||
blockchainTests.resets('LibSignature library', env => {
|
||||
let testLib: TestLibSignatureContract;
|
||||
let signerKey: string;
|
||||
let signer: string;
|
||||
|
||||
before(async () => {
|
||||
signerKey = hexUtils.random();
|
||||
signer = ethjs.bufferToHex(ethjs.privateToAddress(ethjs.toBuffer(signerKey)));
|
||||
testLib = await TestLibSignatureContract.deployFrom0xArtifactAsync(
|
||||
artifacts.TestLibSignature,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
);
|
||||
});
|
||||
|
||||
describe('getSignerOfHash()', () => {
|
||||
it('can recover the signer of an EIP712 signature', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const sig = eip712SignHashWithKey(hash, signerKey);
|
||||
const recovered = await testLib.getSignerOfHash(hash, sig).callAsync();
|
||||
expect(recovered).to.eq(signer);
|
||||
});
|
||||
|
||||
it('can recover the signer of an EthSign signature', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const sig = ethSignHashWithKey(hash, signerKey);
|
||||
const recovered = await testLib.getSignerOfHash(hash, sig).callAsync();
|
||||
expect(recovered).to.eq(signer);
|
||||
});
|
||||
|
||||
it('throws if the signature type is out of range', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const badType = (Object.values(SignatureType).slice(-1)[0] as number) + 1;
|
||||
const sig = {
|
||||
...ethSignHashWithKey(hash, signerKey),
|
||||
signatureType: badType,
|
||||
};
|
||||
return expect(testLib.getSignerOfHash(hash, sig).callAsync()).to.be.rejectedWith(EMPTY_REVERT);
|
||||
});
|
||||
|
||||
it('throws if the signature data is malformed', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const sig = {
|
||||
...ethSignHashWithKey(hash, signerKey),
|
||||
v: 1,
|
||||
};
|
||||
return expect(testLib.getSignerOfHash(hash, sig).callAsync()).to.revertWith(
|
||||
new SignatureValidationError(SignatureValidationErrorCodes.BadSignatureData, hash),
|
||||
);
|
||||
});
|
||||
|
||||
it('throws if an EC value is out of range', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const sig = {
|
||||
...ethSignHashWithKey(hash, signerKey),
|
||||
r: '0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141',
|
||||
};
|
||||
return expect(testLib.getSignerOfHash(hash, sig).callAsync()).to.revertWith(
|
||||
new SignatureValidationError(SignatureValidationErrorCodes.BadSignatureData, hash),
|
||||
);
|
||||
});
|
||||
|
||||
it('throws if the type is Illegal', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const sig = {
|
||||
...ethSignHashWithKey(hash, signerKey),
|
||||
signatureType: SignatureType.Illegal,
|
||||
};
|
||||
return expect(testLib.getSignerOfHash(hash, sig).callAsync()).to.revertWith(
|
||||
new SignatureValidationError(SignatureValidationErrorCodes.Illegal, hash),
|
||||
);
|
||||
});
|
||||
|
||||
it('throws if the type is Invalid', async () => {
|
||||
const hash = hexUtils.random();
|
||||
const sig = {
|
||||
...ethSignHashWithKey(hash, signerKey),
|
||||
signatureType: SignatureType.Invalid,
|
||||
};
|
||||
return expect(testLib.getSignerOfHash(hash, sig).callAsync()).to.revertWith(
|
||||
new SignatureValidationError(SignatureValidationErrorCodes.AlwaysInvalid, hash),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
75
contracts/zero-ex/test/protocol_fees_test.ts
Normal file
75
contracts/zero-ex/test/protocol_fees_test.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { blockchainTests, constants, expect } from '@0x/contracts-test-utils';
|
||||
import { BigNumber, hexUtils } from '@0x/utils';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
import { TestProtocolFeesContract, TestStakingContract, TestWethContract } from './wrappers';
|
||||
|
||||
blockchainTests.resets('ProtocolFees', env => {
|
||||
let payer: string;
|
||||
let protocolFees: TestProtocolFeesContract;
|
||||
let staking: TestStakingContract;
|
||||
let weth: TestWethContract;
|
||||
|
||||
before(async () => {
|
||||
[payer] = await env.getAccountAddressesAsync();
|
||||
protocolFees = await TestProtocolFeesContract.deployFrom0xArtifactAsync(
|
||||
artifacts.TestProtocolFees,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
);
|
||||
weth = await TestWethContract.deployFrom0xArtifactAsync(
|
||||
artifacts.TestWeth,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
);
|
||||
staking = await TestStakingContract.deployFrom0xArtifactAsync(
|
||||
artifacts.TestStaking,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
weth.address,
|
||||
);
|
||||
await weth.mint(payer, constants.ONE_ETHER).awaitTransactionSuccessAsync();
|
||||
await weth.approve(protocolFees.address, constants.ONE_ETHER).awaitTransactionSuccessAsync({ from: payer });
|
||||
});
|
||||
|
||||
describe('_collectProtocolFee()', () => {
|
||||
it('can collect a protocol fee multiple times', async () => {
|
||||
const poolId = hexUtils.random();
|
||||
const amount1 = new BigNumber(123456);
|
||||
const amount2 = new BigNumber(456789);
|
||||
|
||||
// Transfer amount1 via WETH.
|
||||
await protocolFees
|
||||
.collectProtocolFee(poolId, amount1, weth.address)
|
||||
.awaitTransactionSuccessAsync({ from: payer });
|
||||
|
||||
// Send to staking contract.
|
||||
await protocolFees
|
||||
.transferFeesForPool(poolId, staking.address, weth.address)
|
||||
.awaitTransactionSuccessAsync();
|
||||
|
||||
// Transfer amount2 via ETH.
|
||||
await protocolFees
|
||||
.collectProtocolFee(poolId, amount2, weth.address)
|
||||
.awaitTransactionSuccessAsync({ from: payer, value: amount2 });
|
||||
|
||||
// Send to staking contract again.
|
||||
await protocolFees
|
||||
.transferFeesForPool(poolId, staking.address, weth.address)
|
||||
.awaitTransactionSuccessAsync();
|
||||
|
||||
const balance = await staking.balanceForPool(poolId).callAsync();
|
||||
const wethBalance = await weth.balanceOf(staking.address).callAsync();
|
||||
|
||||
// Check that staking accounted for the collected ether properly.
|
||||
expect(balance).to.bignumber.eq(wethBalance);
|
||||
|
||||
// We leave 1 wei behind, of both ETH and WETH, for gas reasons.
|
||||
const total = amount1.plus(amount2).minus(2);
|
||||
return expect(balance).to.bignumber.eq(total);
|
||||
});
|
||||
});
|
||||
});
|
@@ -77,7 +77,6 @@ blockchainTests.resets('FillQuoteTransformer', env => {
|
||||
mStable: NULL_ADDRESS,
|
||||
weth: NULL_ADDRESS,
|
||||
shellBridge: NULL_ADDRESS,
|
||||
shell: NULL_ADDRESS,
|
||||
creamBridge: NULL_ADDRESS,
|
||||
dodoBridge: NULL_ADDRESS,
|
||||
dodoHelper: NULL_ADDRESS,
|
||||
|
@@ -7,9 +7,11 @@ export * from '../test/generated-wrappers/affiliate_fee_transformer';
|
||||
export * from '../test/generated-wrappers/allowance_target';
|
||||
export * from '../test/generated-wrappers/bootstrap_feature';
|
||||
export * from '../test/generated-wrappers/bridge_adapter';
|
||||
export * from '../test/generated-wrappers/fee_collector';
|
||||
export * from '../test/generated-wrappers/fill_quote_transformer';
|
||||
export * from '../test/generated-wrappers/fixin_common';
|
||||
export * from '../test/generated-wrappers/fixin_e_i_p712';
|
||||
export * from '../test/generated-wrappers/fixin_protocol_fees';
|
||||
export * from '../test/generated-wrappers/fixin_reentrancy_guard';
|
||||
export * from '../test/generated-wrappers/flash_wallet';
|
||||
export * from '../test/generated-wrappers/full_migration';
|
||||
@@ -22,11 +24,13 @@ export * from '../test/generated-wrappers/i_exchange';
|
||||
export * from '../test/generated-wrappers/i_feature';
|
||||
export * from '../test/generated-wrappers/i_flash_wallet';
|
||||
export * from '../test/generated-wrappers/i_gas_token';
|
||||
export * from '../test/generated-wrappers/i_liquidity_provider';
|
||||
export * from '../test/generated-wrappers/i_liquidity_provider_feature';
|
||||
export * from '../test/generated-wrappers/i_meta_transactions_feature';
|
||||
export * from '../test/generated-wrappers/i_ownable_feature';
|
||||
export * from '../test/generated-wrappers/i_signature_validator_feature';
|
||||
export * from '../test/generated-wrappers/i_simple_function_registry_feature';
|
||||
export * from '../test/generated-wrappers/i_staking';
|
||||
export * from '../test/generated-wrappers/i_test_simple_function_registry_feature';
|
||||
export * from '../test/generated-wrappers/i_token_spender_feature';
|
||||
export * from '../test/generated-wrappers/i_transform_erc20_feature';
|
||||
@@ -41,11 +45,13 @@ export * from '../test/generated-wrappers/lib_liquidity_provider_storage';
|
||||
export * from '../test/generated-wrappers/lib_meta_transactions_rich_errors';
|
||||
export * from '../test/generated-wrappers/lib_meta_transactions_storage';
|
||||
export * from '../test/generated-wrappers/lib_migrate';
|
||||
export * from '../test/generated-wrappers/lib_order_hash';
|
||||
export * from '../test/generated-wrappers/lib_ownable_rich_errors';
|
||||
export * from '../test/generated-wrappers/lib_ownable_storage';
|
||||
export * from '../test/generated-wrappers/lib_proxy_rich_errors';
|
||||
export * from '../test/generated-wrappers/lib_proxy_storage';
|
||||
export * from '../test/generated-wrappers/lib_reentrancy_guard_storage';
|
||||
export * from '../test/generated-wrappers/lib_signature';
|
||||
export * from '../test/generated-wrappers/lib_signature_rich_errors';
|
||||
export * from '../test/generated-wrappers/lib_signed_call_data';
|
||||
export * from '../test/generated-wrappers/lib_simple_function_registry_rich_errors';
|
||||
@@ -85,13 +91,16 @@ export * from '../test/generated-wrappers/test_fill_quote_transformer_exchange';
|
||||
export * from '../test/generated-wrappers/test_fill_quote_transformer_host';
|
||||
export * from '../test/generated-wrappers/test_full_migration';
|
||||
export * from '../test/generated-wrappers/test_initial_migration';
|
||||
export * from '../test/generated-wrappers/test_lib_signature';
|
||||
export * from '../test/generated-wrappers/test_lib_token_spender';
|
||||
export * from '../test/generated-wrappers/test_meta_transactions_transform_erc20_feature';
|
||||
export * from '../test/generated-wrappers/test_migrator';
|
||||
export * from '../test/generated-wrappers/test_mint_token_erc20_transformer';
|
||||
export * from '../test/generated-wrappers/test_mintable_erc20_token';
|
||||
export * from '../test/generated-wrappers/test_protocol_fees';
|
||||
export * from '../test/generated-wrappers/test_simple_function_registry_feature_impl1';
|
||||
export * from '../test/generated-wrappers/test_simple_function_registry_feature_impl2';
|
||||
export * from '../test/generated-wrappers/test_staking';
|
||||
export * from '../test/generated-wrappers/test_token_spender';
|
||||
export * from '../test/generated-wrappers/test_token_spender_erc20_token';
|
||||
export * from '../test/generated-wrappers/test_transform_erc20';
|
||||
|
@@ -31,9 +31,11 @@
|
||||
"test/generated-artifacts/AllowanceTarget.json",
|
||||
"test/generated-artifacts/BootstrapFeature.json",
|
||||
"test/generated-artifacts/BridgeAdapter.json",
|
||||
"test/generated-artifacts/FeeCollector.json",
|
||||
"test/generated-artifacts/FillQuoteTransformer.json",
|
||||
"test/generated-artifacts/FixinCommon.json",
|
||||
"test/generated-artifacts/FixinEIP712.json",
|
||||
"test/generated-artifacts/FixinProtocolFees.json",
|
||||
"test/generated-artifacts/FixinReentrancyGuard.json",
|
||||
"test/generated-artifacts/FlashWallet.json",
|
||||
"test/generated-artifacts/FullMigration.json",
|
||||
@@ -46,11 +48,13 @@
|
||||
"test/generated-artifacts/IFeature.json",
|
||||
"test/generated-artifacts/IFlashWallet.json",
|
||||
"test/generated-artifacts/IGasToken.json",
|
||||
"test/generated-artifacts/ILiquidityProvider.json",
|
||||
"test/generated-artifacts/ILiquidityProviderFeature.json",
|
||||
"test/generated-artifacts/IMetaTransactionsFeature.json",
|
||||
"test/generated-artifacts/IOwnableFeature.json",
|
||||
"test/generated-artifacts/ISignatureValidatorFeature.json",
|
||||
"test/generated-artifacts/ISimpleFunctionRegistryFeature.json",
|
||||
"test/generated-artifacts/IStaking.json",
|
||||
"test/generated-artifacts/ITestSimpleFunctionRegistryFeature.json",
|
||||
"test/generated-artifacts/ITokenSpenderFeature.json",
|
||||
"test/generated-artifacts/ITransformERC20Feature.json",
|
||||
@@ -65,11 +69,13 @@
|
||||
"test/generated-artifacts/LibMetaTransactionsRichErrors.json",
|
||||
"test/generated-artifacts/LibMetaTransactionsStorage.json",
|
||||
"test/generated-artifacts/LibMigrate.json",
|
||||
"test/generated-artifacts/LibOrderHash.json",
|
||||
"test/generated-artifacts/LibOwnableRichErrors.json",
|
||||
"test/generated-artifacts/LibOwnableStorage.json",
|
||||
"test/generated-artifacts/LibProxyRichErrors.json",
|
||||
"test/generated-artifacts/LibProxyStorage.json",
|
||||
"test/generated-artifacts/LibReentrancyGuardStorage.json",
|
||||
"test/generated-artifacts/LibSignature.json",
|
||||
"test/generated-artifacts/LibSignatureRichErrors.json",
|
||||
"test/generated-artifacts/LibSignedCallData.json",
|
||||
"test/generated-artifacts/LibSimpleFunctionRegistryRichErrors.json",
|
||||
@@ -109,13 +115,16 @@
|
||||
"test/generated-artifacts/TestFillQuoteTransformerHost.json",
|
||||
"test/generated-artifacts/TestFullMigration.json",
|
||||
"test/generated-artifacts/TestInitialMigration.json",
|
||||
"test/generated-artifacts/TestLibSignature.json",
|
||||
"test/generated-artifacts/TestLibTokenSpender.json",
|
||||
"test/generated-artifacts/TestMetaTransactionsTransformERC20Feature.json",
|
||||
"test/generated-artifacts/TestMigrator.json",
|
||||
"test/generated-artifacts/TestMintTokenERC20Transformer.json",
|
||||
"test/generated-artifacts/TestMintableERC20Token.json",
|
||||
"test/generated-artifacts/TestProtocolFees.json",
|
||||
"test/generated-artifacts/TestSimpleFunctionRegistryFeatureImpl1.json",
|
||||
"test/generated-artifacts/TestSimpleFunctionRegistryFeatureImpl2.json",
|
||||
"test/generated-artifacts/TestStaking.json",
|
||||
"test/generated-artifacts/TestTokenSpender.json",
|
||||
"test/generated-artifacts/TestTokenSpenderERC20Token.json",
|
||||
"test/generated-artifacts/TestTransformERC20.json",
|
||||
|
64
doc-gen-config.json
Normal file
64
doc-gen-config.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"docJsonVersion": "0.0.1",
|
||||
"externalTypeMap": {
|
||||
"Array": true,
|
||||
"BigNumber": true,
|
||||
"Error": true,
|
||||
"ErrorConstructor": true,
|
||||
"Buffer": true,
|
||||
"solc.StandardContractOutput": true,
|
||||
"solc.CompilerSettings": true,
|
||||
"Schema": true,
|
||||
"Uint8Array": true,
|
||||
"GanacheOpts": true,
|
||||
"keystore": true,
|
||||
"Ganache.GanacheOpts": true,
|
||||
"PromiseWithTransactionHash": true,
|
||||
"Buy": true,
|
||||
"Sell": true,
|
||||
"TFillData": true,
|
||||
"IterableIterator": true,
|
||||
"Set": true,
|
||||
"Exclude": true
|
||||
},
|
||||
"ignoredExcessiveTypes": [
|
||||
"NonceSubproviderErrors",
|
||||
"Web3WrapperErrors",
|
||||
"AssetBuyerError",
|
||||
"ContractError",
|
||||
"SubscriptionErrors",
|
||||
"TypedDataError",
|
||||
"SwapQuoterError",
|
||||
"SwapQuoteConsumerError",
|
||||
"SwapQuoteGetOutputOpts",
|
||||
"SwapQuoteExecutionOpts",
|
||||
"ForwarderError",
|
||||
"CoordinatorServerError",
|
||||
"CoordinatorServerCancellationResponse",
|
||||
"EventCallback",
|
||||
"IndexedFilterValues",
|
||||
"OrderInfo",
|
||||
"TransactionOpts",
|
||||
"ContractEvent",
|
||||
"SendTransactionOpts",
|
||||
"AwaitTransactionOpts",
|
||||
"ContractFunctionObj",
|
||||
"ContractTxFunctionObj",
|
||||
"EventCallback ",
|
||||
"EnvVars",
|
||||
"GlobalStakeByStatus",
|
||||
"OwnerStakeByStatus",
|
||||
"StakingPoolById",
|
||||
"AssetData",
|
||||
"SingleAssetData",
|
||||
"ERC20AssetData",
|
||||
"ERC20BridgeAssetData",
|
||||
"ERC721AssetData",
|
||||
"ERC1155AssetData",
|
||||
"MultiAssetData",
|
||||
"StaticCallAssetData",
|
||||
"MultiAssetDataWithRecursiveDecoding",
|
||||
"OrderPrunerPermittedFeeTypes"
|
||||
],
|
||||
"typesOnlyLibraries": ["@0x/protocol-types"]
|
||||
}
|
@@ -22,8 +22,8 @@
|
||||
"run:publish:local": "IS_LOCAL_PUBLISH=true yarn run:publish",
|
||||
"run:publish:gha": "run-s build script:publish:gha",
|
||||
"script:prepublish_checks": "node ./node_modules/@0x/monorepo-scripts/lib/prepublish_checks.js",
|
||||
"script:publish": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo protocol",
|
||||
"script:publish:gha": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo protocol --auto-commit --no-upload-docs --yes",
|
||||
"script:publish": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo protocol --doc-gen-config ./doc-gen-config.json",
|
||||
"script:publish:gha": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo protocol --auto-commit --no-upload-docs --yes --doc-gen-config ./doc-gen-config.json",
|
||||
"install:all": "yarn install",
|
||||
"wsrun": "wsrun",
|
||||
"lerna": "lerna",
|
||||
@@ -44,7 +44,7 @@
|
||||
"test:all": "wsrun test $PKG --fast-exit --serial --exclude-missing",
|
||||
"test:contracts": "wsrun test --serial -p $(echo ${npm_package_config_contractsPackages} ${npm_package_config_ignoreTestsForPackages} | tr ' ' '\n' | sort | uniq -u | tr '\n' ' ') -c --fast-exit --exclude-missing",
|
||||
"test:contracts:all": "wsrun test --serial -p ${npm_package_config_contractsPackages} -c --fast-exit --exclude-missing",
|
||||
"generate_doc": "node ./node_modules/@0x/monorepo-scripts/lib/doc_generate.js",
|
||||
"generate_doc": "node ./node_modules/@0x/monorepo-scripts/lib/doc_generate.js --config ./doc-gen-config.json",
|
||||
"upload_md_docs": "aws s3 rm --recursive s3://docs-markdown; wsrun s3:sync_md_docs --exclude-missing",
|
||||
"diff_md_docs:ci": "wsrun diff_docs --exclude-missing",
|
||||
"test:generate_docs:circleci": "for i in ${npm_package_config_packagesWithDocPages}; do yarn generate_doc --package $i || break -1; done;",
|
||||
@@ -66,7 +66,7 @@
|
||||
"ignoreDependencyVersionsForPackage": "contract-wrappers"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@0x/monorepo-scripts": "^2.0.4",
|
||||
"@0x/monorepo-scripts": "^3.0.3",
|
||||
"@0x-lerna-fork/lerna": "3.16.10",
|
||||
"@0xproject/npm-cli-login": "^0.0.11",
|
||||
"async-child-process": "^1.1.1",
|
||||
|
@@ -1,4 +1,27 @@
|
||||
[
|
||||
{
|
||||
"timestamp": 1604376968,
|
||||
"version": "5.0.1",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Dependencies updated"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "5.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Support multiple `Shells` by supplying the `pool` address",
|
||||
"pr": 17
|
||||
},
|
||||
{
|
||||
"note": "Make use of Token Adjacency in more places. Moved as a parameter for the quote",
|
||||
"pr": 24
|
||||
}
|
||||
],
|
||||
"timestamp": 1604355662
|
||||
},
|
||||
{
|
||||
"version": "4.8.1",
|
||||
"changes": [
|
||||
|
@@ -5,6 +5,15 @@ Edit the package's CHANGELOG.json file only.
|
||||
|
||||
CHANGELOG
|
||||
|
||||
## v5.0.1 - _November 3, 2020_
|
||||
|
||||
* Dependencies updated
|
||||
|
||||
## v5.0.0 - _November 2, 2020_
|
||||
|
||||
* Support multiple `Shells` by supplying the `pool` address (#17)
|
||||
* Make use of Token Adjacency in more places. Moved as a parameter for the quote (#24)
|
||||
|
||||
## v4.8.1 - _October 28, 2020_
|
||||
|
||||
* Fix Gas schedule with `SnowSwap` and `Bancor` (#15)
|
||||
|
@@ -28,13 +28,15 @@ contract ShellSampler is
|
||||
/// @dev Default gas limit for Shell calls.
|
||||
uint256 constant private DEFAULT_CALL_GAS = 300e3; // 300k
|
||||
|
||||
/// @dev Sample sell quotes from the Shell contract
|
||||
/// @dev Sample sell quotes from the Shell pool contract
|
||||
/// @param pool Address of the Shell pool contract
|
||||
/// @param takerToken Address of the taker token (what to sell).
|
||||
/// @param makerToken Address of the maker token (what to buy).
|
||||
/// @param takerTokenAmounts Taker token sell amount for each sample.
|
||||
/// @return makerTokenAmounts Maker amounts bought at each taker token
|
||||
/// amount.
|
||||
function sampleSellsFromShell(
|
||||
address pool,
|
||||
address takerToken,
|
||||
address makerToken,
|
||||
uint256[] memory takerTokenAmounts
|
||||
@@ -49,7 +51,7 @@ contract ShellSampler is
|
||||
|
||||
for (uint256 i = 0; i < numSamples; i++) {
|
||||
try
|
||||
IShell(_getShellAddress()).viewOriginSwap
|
||||
IShell(pool).viewOriginSwap
|
||||
{gas: DEFAULT_CALL_GAS}
|
||||
(takerToken, makerToken, takerTokenAmounts[i])
|
||||
returns (uint256 amount)
|
||||
@@ -62,13 +64,15 @@ contract ShellSampler is
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Sample buy quotes from Shell contract
|
||||
/// @dev Sample buy quotes from Shell pool contract
|
||||
/// @param pool Address of the Shell pool contract
|
||||
/// @param takerToken Address of the taker token (what to sell).
|
||||
/// @param makerToken Address of the maker token (what to buy).
|
||||
/// @param makerTokenAmounts Maker token buy amount for each sample.
|
||||
/// @return takerTokenAmounts Taker amounts sold at each maker token
|
||||
/// amount.
|
||||
function sampleBuysFromShell(
|
||||
address pool,
|
||||
address takerToken,
|
||||
address makerToken,
|
||||
uint256[] memory makerTokenAmounts
|
||||
@@ -83,7 +87,7 @@ contract ShellSampler is
|
||||
|
||||
for (uint256 i = 0; i < numSamples; i++) {
|
||||
try
|
||||
IShell(_getShellAddress()).viewTargetSwap
|
||||
IShell(pool).viewTargetSwap
|
||||
{gas: DEFAULT_CALL_GAS}
|
||||
(takerToken, makerToken, makerTokenAmounts[i])
|
||||
returns (uint256 amount)
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@0x/asset-swapper",
|
||||
"version": "4.8.1",
|
||||
"version": "5.0.1",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
@@ -57,19 +57,19 @@
|
||||
"registry": "git@github.com:0xProject/gitpkg-registry.git"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0x/assert": "^3.0.13",
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contract-addresses": "^5.0.1",
|
||||
"@0x/contract-wrappers": "^13.9.2",
|
||||
"@0x/dev-utils": "^3.3.4",
|
||||
"@0x/json-schemas": "^5.2.3",
|
||||
"@0x/order-utils": "^10.4.2",
|
||||
"@0x/assert": "^3.0.17",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contract-addresses": "^5.1.0",
|
||||
"@0x/contract-wrappers": "^13.9.4",
|
||||
"@0x/dev-utils": "^4.0.1",
|
||||
"@0x/json-schemas": "^5.3.3",
|
||||
"@0x/order-utils": "^10.4.4",
|
||||
"@0x/orderbook": "^2.2.7",
|
||||
"@0x/quote-server": "^3.1.0",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@0x/typescript-typings": "^5.1.5",
|
||||
"@0x/utils": "^5.6.3",
|
||||
"@0x/web3-wrapper": "^7.2.4",
|
||||
"@0x/utils": "^6.1.0",
|
||||
"@0x/web3-wrapper": "^7.2.8",
|
||||
"@balancer-labs/sor": "0.3.2",
|
||||
"@bancor/sdk": "^0.2.9",
|
||||
"@ethersproject/abi": "^5.0.1",
|
||||
@@ -86,21 +86,21 @@
|
||||
"lodash": "^4.17.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@0x/base-contract": "^6.2.7",
|
||||
"@0x/contracts-asset-proxy": "^3.6.1",
|
||||
"@0x/contracts-erc20": "^3.2.4",
|
||||
"@0x/contracts-exchange": "^3.2.10",
|
||||
"@0x/contracts-exchange-libs": "^4.3.10",
|
||||
"@0x/contracts-gen": "^2.0.14",
|
||||
"@0x/contracts-test-utils": "^5.3.7",
|
||||
"@0x/contracts-utils": "^4.5.4",
|
||||
"@0x/base-contract": "^6.2.11",
|
||||
"@0x/contracts-asset-proxy": "^3.6.3",
|
||||
"@0x/contracts-erc20": "^3.2.6",
|
||||
"@0x/contracts-exchange": "^3.2.12",
|
||||
"@0x/contracts-exchange-libs": "^4.3.12",
|
||||
"@0x/contracts-gen": "^2.0.18",
|
||||
"@0x/contracts-test-utils": "^5.3.9",
|
||||
"@0x/contracts-utils": "^4.5.6",
|
||||
"@0x/mesh-rpc-client": "^9.4.2",
|
||||
"@0x/migrations": "^6.4.4",
|
||||
"@0x/sol-compiler": "^4.2.3",
|
||||
"@0x/subproviders": "^6.1.5",
|
||||
"@0x/migrations": "^6.4.6",
|
||||
"@0x/sol-compiler": "^4.2.7",
|
||||
"@0x/subproviders": "^6.1.9",
|
||||
"@0x/ts-doc-gen": "^0.0.28",
|
||||
"@0x/tslint-config": "^4.1.3",
|
||||
"@0x/types": "^3.2.4",
|
||||
"@0x/types": "^3.3.0",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "12.12.54",
|
||||
|
@@ -14,7 +14,7 @@ import {
|
||||
SwapQuoteRequestOpts,
|
||||
SwapQuoterOpts,
|
||||
} from './types';
|
||||
import { DEFAULT_GET_MARKET_ORDERS_OPTS } from './utils/market_operation_utils/constants';
|
||||
import { DEFAULT_GET_MARKET_ORDERS_OPTS, TOKENS } from './utils/market_operation_utils/constants';
|
||||
|
||||
const ETH_GAS_STATION_API_URL = 'https://ethgasstation.info/api/ethgasAPI.json';
|
||||
const NULL_BYTES = '0x';
|
||||
@@ -42,6 +42,7 @@ const PROTOCOL_FEE_MULTIPLIER = new BigNumber(70000);
|
||||
// default 50% buffer for selecting native orders to be aggregated with other sources
|
||||
const MARKET_UTILS_AMOUNT_BUFFER_PERCENTAGE = 0.5;
|
||||
|
||||
const DEFAULT_INTERMEDIATE_TOKENS = [TOKENS.WETH, TOKENS.USDT, TOKENS.DAI, TOKENS.USDC];
|
||||
const DEFAULT_SWAP_QUOTER_OPTS: SwapQuoterOpts = {
|
||||
chainId: ChainId.Mainnet,
|
||||
orderRefreshIntervalMs: 10000, // 10 seconds
|
||||
@@ -125,6 +126,7 @@ export const constants = {
|
||||
ONE_SECOND_MS,
|
||||
ONE_MINUTE_MS,
|
||||
DEFAULT_SWAP_QUOTER_OPTS,
|
||||
DEFAULT_INTERMEDIATE_TOKENS,
|
||||
DEFAULT_FORWARDER_SWAP_QUOTE_GET_OPTS,
|
||||
DEFAULT_FORWARDER_SWAP_QUOTE_EXECUTE_OPTS,
|
||||
DEFAULT_SWAP_QUOTE_REQUEST_OPTS,
|
||||
|
@@ -166,7 +166,6 @@ export class SwapQuoter {
|
||||
samplerGasLimit,
|
||||
liquidityProviderRegistryAddress,
|
||||
rfqt,
|
||||
tokenAdjacencyGraph,
|
||||
} = _.merge({}, constants.DEFAULT_SWAP_QUOTER_OPTS, options);
|
||||
const provider = providerUtils.standardizeOrThrow(supportedProvider);
|
||||
assert.isValidOrderbook('orderbook', orderbook);
|
||||
@@ -215,7 +214,6 @@ export class SwapQuoter {
|
||||
exchangeAddress: this._contractAddresses.exchange,
|
||||
},
|
||||
liquidityProviderRegistryAddress,
|
||||
tokenAdjacencyGraph,
|
||||
);
|
||||
this._swapQuoteCalculator = new SwapQuoteCalculator(this._marketOperationUtils);
|
||||
}
|
||||
|
@@ -4,12 +4,7 @@ import { TakerRequestQueryParams } from '@0x/quote-server';
|
||||
import { SignedOrder } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
|
||||
import {
|
||||
ERC20BridgeSource,
|
||||
GetMarketOrdersOpts,
|
||||
OptimizedMarketOrder,
|
||||
TokenAdjacencyGraph,
|
||||
} from './utils/market_operation_utils/types';
|
||||
import { ERC20BridgeSource, GetMarketOrdersOpts, OptimizedMarketOrder } from './utils/market_operation_utils/types';
|
||||
import { QuoteReport } from './utils/quote_report_generator';
|
||||
|
||||
/**
|
||||
@@ -315,7 +310,6 @@ export interface SwapQuoterOpts extends OrderPrunerOpts {
|
||||
ethGasStationUrl?: string;
|
||||
rfqt?: SwapQuoterRfqtOpts;
|
||||
samplerOverrides?: SamplerOverrides;
|
||||
tokenAdjacencyGraph?: TokenAdjacencyGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -89,8 +89,28 @@ export const SOURCE_FLAGS: { [source in ERC20BridgeSource]: number } = Object.as
|
||||
...Object.values(ERC20BridgeSource).map((source: ERC20BridgeSource, index) => ({ [source]: 1 << index })),
|
||||
);
|
||||
|
||||
// Mainnet tokens
|
||||
// Not an exhaustive list, just enough so we don't repeat ourselves
|
||||
export const TOKENS = {
|
||||
WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
||||
// Stable Coins
|
||||
DAI: '0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
sUSD: '0x57ab1ec28d129707052df4df418d58a2d46d5f51',
|
||||
TUSD: '0x0000000000085d4780b73119b644ae5ecd22b376',
|
||||
// Bitcoins
|
||||
WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',
|
||||
RenBTC: '0xeb4c2781e4eba804ce9a9803c67d0893436bb27d',
|
||||
sBTC: '0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6',
|
||||
// Other
|
||||
MKR: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
|
||||
};
|
||||
|
||||
/**
|
||||
* Mainnet Curve configuration
|
||||
* The tokens are in order of their index, which each curve defines
|
||||
* I.e DaiUsdc curve has DAI as index 0 and USDC as index 1
|
||||
*/
|
||||
export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
DaiUsdc: {
|
||||
@@ -98,7 +118,7 @@ export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
poolAddress: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56',
|
||||
tokens: ['0x6b175474e89094c44da98b954eedeac495271d0f', '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'],
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC],
|
||||
},
|
||||
// DaiUsdcUsdt: {
|
||||
// exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
@@ -106,9 +126,9 @@ export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
// buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
// poolAddress: '0x52ea46506b9cc5ef470c5bf89f17dc28bb35d85c',
|
||||
// tokens: [
|
||||
// '0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
// '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
// '0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
// TOKENS.DAI,
|
||||
// TOKENS.USDC,
|
||||
// TOKENS.USDT,
|
||||
// ],
|
||||
// },
|
||||
DaiUsdcUsdtTusd: {
|
||||
@@ -116,12 +136,7 @@ export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
poolAddress: '0x45f783cce6b7ff23b2ab2d70e416cdb7d6055f51',
|
||||
tokens: [
|
||||
'0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
'0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
'0x0000000000085d4780b73119b644ae5ecd22b376',
|
||||
],
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT, TOKENS.TUSD],
|
||||
},
|
||||
// Looks like it's dying.
|
||||
DaiUsdcUsdtBusd: {
|
||||
@@ -130,10 +145,10 @@ export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
poolAddress: '0x79a8c46dea5ada233abaffd40f3a0a2b1e5a4f27',
|
||||
tokens: [
|
||||
'0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
'0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
'0x4fabb145d64652a948d72533023f6e7a623c7c53',
|
||||
TOKENS.DAI,
|
||||
TOKENS.USDC,
|
||||
TOKENS.USDT,
|
||||
'0x4fabb145d64652a948d72533023f6e7a623c7c53', // bUSD
|
||||
],
|
||||
},
|
||||
DaiUsdcUsdtSusd: {
|
||||
@@ -141,57 +156,41 @@ export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0xa5407eae9ba41422680e2e00537571bcc53efbfd',
|
||||
tokens: [
|
||||
'0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
'0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
'0x57ab1ec28d129707052df4df418d58a2d46d5f51',
|
||||
],
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT, TOKENS.sUSD],
|
||||
},
|
||||
RenbtcWbtc: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0x93054188d876f558f4a66b2ef1d97d16edf0895b',
|
||||
tokens: ['0xeb4c2781e4eba804ce9a9803c67d0893436bb27d', '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599'],
|
||||
tokens: [TOKENS.RenBTC, TOKENS.WBTC],
|
||||
},
|
||||
RenbtcWbtcSbtc: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0x7fc77b5c7614e1533320ea6ddc2eb61fa00a9714',
|
||||
tokens: [
|
||||
'0xeb4c2781e4eba804ce9a9803c67d0893436bb27d',
|
||||
'0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',
|
||||
'0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6',
|
||||
],
|
||||
tokens: [TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
},
|
||||
TriPool: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7',
|
||||
tokens: [
|
||||
'0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
'0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
],
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
},
|
||||
};
|
||||
|
||||
export const MAINNET_SWERVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
swUSD: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0x329239599afb305da0a2ec69c58f8a6697f9f88d', // _target: 0xa5407eae9ba41422680e2e00537571bcc53efbfd
|
||||
tokens: [
|
||||
'0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
'0xdac17f958d2ee523a2206206994597c13d831ec7',
|
||||
'0x0000000000085d4780b73119b644ae5ecd22b376',
|
||||
],
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT, TOKENS.TUSD],
|
||||
},
|
||||
};
|
||||
|
||||
export const MAINNET_SNOWSWAP_INFOS: { [name: string]: CurveInfo } = {
|
||||
yVaultCurve: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
@@ -232,10 +231,10 @@ export const MAINNET_SNOWSWAP_INFOS: { [name: string]: CurveInfo } = {
|
||||
// buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
// poolAddress: '0x4571753311e37ddb44faa8fb78a6df9a6e3c6c0b',
|
||||
// tokens: [
|
||||
// '0x6b175474e89094c44da98b954eedeac495271d0f', // DAI
|
||||
// '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // USDC
|
||||
// '0xdac17f958d2ee523a2206206994597c13d831ec7', // USDT
|
||||
// '0x0000000000085d4780b73119b644ae5ecd22b376', // TUSD
|
||||
// TOKENS.DAI,
|
||||
// TOKENS.USDC,
|
||||
// TOKENS.USDT,
|
||||
// TOKENS.TUSD,
|
||||
// ],
|
||||
// },
|
||||
};
|
||||
@@ -248,8 +247,7 @@ export const MAINNET_KYBER_RESERVE_IDS: { [name: string]: string } = {
|
||||
|
||||
export const MAINNET_KYBER_TOKEN_RESERVE_IDS: { [token: string]: string } = {
|
||||
// USDC
|
||||
['0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48']:
|
||||
'0xaa55534443303041505200000000000000000000000000000000000000000000',
|
||||
[TOKENS.USDC]: '0xaa55534443303041505200000000000000000000000000000000000000000000',
|
||||
// AMPL
|
||||
['0xd46ba6d942050d489dbd938a2c909a5d5039a161']:
|
||||
'0xaad46ba6d942050d489dbd938a2c909a5d5039a1610000000000000000000000',
|
||||
@@ -263,8 +261,7 @@ export const MAINNET_KYBER_TOKEN_RESERVE_IDS: { [token: string]: string } = {
|
||||
['0xdd974d5c2e2928dea5f71b9825b8b646686bd200']:
|
||||
'0xaa4b4e435f4d4547414c41444f4e000000000000000000000000000000000000',
|
||||
// sUSD
|
||||
['0x57ab1ec28d129707052df4df418d58a2d46d5f51']:
|
||||
'0xaa73555344000000000000000000000000000000000000000000000000000000',
|
||||
[TOKENS.sUSD]: '0xaa73555344000000000000000000000000000000000000000000000000000000',
|
||||
// SNX
|
||||
['0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f']:
|
||||
'0xaa534e5800000000000000000000000000000000000000000000000000000000',
|
||||
@@ -278,6 +275,17 @@ export const MAINNET_KYBER_TOKEN_RESERVE_IDS: { [token: string]: string } = {
|
||||
|
||||
export const MAINNET_SUSHI_SWAP_ROUTER = '0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F';
|
||||
|
||||
export const MAINNET_SHELL_POOLS = {
|
||||
StableCoins: {
|
||||
poolAddress: '0x2E703D658f8dd21709a7B458967aB4081F8D3d05',
|
||||
tokens: [TOKENS.USDC, TOKENS.USDT, TOKENS.sUSD, TOKENS.DAI],
|
||||
},
|
||||
Bitcoin: {
|
||||
poolAddress: '0x02Af7C867d6Ddd2c87dEcec2E4AFF809ee118FBb',
|
||||
tokens: [TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
},
|
||||
};
|
||||
|
||||
export const ERC20_PROXY_ID = '0xf47261b0';
|
||||
export const WALLET_SIGNATURE = '0x04';
|
||||
export const ONE_ETHER = new BigNumber(1e18);
|
||||
@@ -323,7 +331,7 @@ export const BRIDGE_ADDRESSES_BY_CHAIN: { [chainId in ChainId]: BridgeContractAd
|
||||
mStableBridge: '0x2bf04fcea05f0989a14d9afa37aa376baca6b2b3',
|
||||
mooniswapBridge: '0x02b7eca484ad960fca3f7709e0b2ac81eec3069c',
|
||||
sushiswapBridge: '0x47ed0262a0b688dcb836d254c6a2e96b6c48a9f5',
|
||||
shellBridge: '0x21fb3862eed7911e0f8219a077247b849846728d',
|
||||
shellBridge: '0xf1c0811e3788caae7dbfae43da9d9131b1a8a148',
|
||||
dodoBridge: '0xe9da66965a9344aab2167e6813c03f043cc7a6ca',
|
||||
creamBridge: '0xb9d4bf2c8dab828f4ffb656acdb6c2b497d44f25',
|
||||
swerveBridge: '0xf9786d5eb1de47fa56a8f7bb387653c6d410bfee',
|
||||
@@ -451,4 +459,5 @@ export const DEFAULT_GET_MARKET_ORDERS_OPTS: GetMarketOrdersOpts = {
|
||||
exchangeProxyOverhead: () => ZERO_AMOUNT,
|
||||
allowFallback: true,
|
||||
shouldGenerateQuoteReport: false,
|
||||
tokenAdjacencyGraph: {},
|
||||
};
|
||||
|
@@ -41,7 +41,6 @@ import {
|
||||
OptimizerResult,
|
||||
OptimizerResultWithReport,
|
||||
OrderDomain,
|
||||
TokenAdjacencyGraph,
|
||||
} from './types';
|
||||
|
||||
// tslint:disable:boolean-naming
|
||||
@@ -88,6 +87,7 @@ export class MarketOperationUtils {
|
||||
quoteRequestor: QuoteRequestor | undefined,
|
||||
marketSideLiquidity: MarketSideLiquidity,
|
||||
optimizerResult: OptimizerResult,
|
||||
comparisonPrice?: BigNumber | undefined,
|
||||
): QuoteReport {
|
||||
const { side, dexQuotes, twoHopQuotes, orderFillableAmounts } = marketSideLiquidity;
|
||||
const { liquidityDelivered } = optimizerResult;
|
||||
@@ -98,6 +98,7 @@ export class MarketOperationUtils {
|
||||
nativeOrders,
|
||||
orderFillableAmounts,
|
||||
liquidityDelivered,
|
||||
comparisonPrice,
|
||||
quoteRequestor,
|
||||
);
|
||||
}
|
||||
@@ -107,7 +108,6 @@ export class MarketOperationUtils {
|
||||
private readonly contractAddresses: AssetSwapperContractAddresses,
|
||||
private readonly _orderDomain: OrderDomain,
|
||||
private readonly _liquidityProviderRegistry: string = NULL_ADDRESS,
|
||||
private readonly _tokenAdjacencyGraph: TokenAdjacencyGraph = {},
|
||||
) {
|
||||
this._wethAddress = contractAddresses.etherToken.toLowerCase();
|
||||
this._multiBridge = contractAddresses.multiBridge.toLowerCase();
|
||||
@@ -180,7 +180,6 @@ export class MarketOperationUtils {
|
||||
makerToken,
|
||||
this._wethAddress,
|
||||
ONE_ETHER,
|
||||
this._wethAddress,
|
||||
this._liquidityProviderRegistry,
|
||||
this._multiBridge,
|
||||
),
|
||||
@@ -190,7 +189,6 @@ export class MarketOperationUtils {
|
||||
takerToken,
|
||||
this._wethAddress,
|
||||
ONE_ETHER,
|
||||
this._wethAddress,
|
||||
this._liquidityProviderRegistry,
|
||||
this._multiBridge,
|
||||
),
|
||||
@@ -201,6 +199,7 @@ export class MarketOperationUtils {
|
||||
takerToken,
|
||||
sampleAmounts,
|
||||
this._wethAddress,
|
||||
_opts.tokenAdjacencyGraph,
|
||||
this._liquidityProviderRegistry,
|
||||
this._multiBridge,
|
||||
),
|
||||
@@ -209,8 +208,8 @@ export class MarketOperationUtils {
|
||||
makerToken,
|
||||
takerToken,
|
||||
takerAmount,
|
||||
this._tokenAdjacencyGraph,
|
||||
this._wethAddress,
|
||||
_opts.tokenAdjacencyGraph,
|
||||
this._liquidityProviderRegistry,
|
||||
),
|
||||
);
|
||||
@@ -331,7 +330,6 @@ export class MarketOperationUtils {
|
||||
makerToken,
|
||||
this._wethAddress,
|
||||
ONE_ETHER,
|
||||
this._wethAddress,
|
||||
this._liquidityProviderRegistry,
|
||||
this._multiBridge,
|
||||
),
|
||||
@@ -341,7 +339,6 @@ export class MarketOperationUtils {
|
||||
takerToken,
|
||||
this._wethAddress,
|
||||
ONE_ETHER,
|
||||
this._wethAddress,
|
||||
this._liquidityProviderRegistry,
|
||||
this._multiBridge,
|
||||
),
|
||||
@@ -352,6 +349,7 @@ export class MarketOperationUtils {
|
||||
takerToken,
|
||||
sampleAmounts,
|
||||
this._wethAddress,
|
||||
_opts.tokenAdjacencyGraph,
|
||||
this._liquidityProviderRegistry,
|
||||
),
|
||||
this._sampler.getTwoHopBuyQuotes(
|
||||
@@ -359,8 +357,8 @@ export class MarketOperationUtils {
|
||||
makerToken,
|
||||
takerToken,
|
||||
makerAmount,
|
||||
this._tokenAdjacencyGraph,
|
||||
this._wethAddress,
|
||||
_opts.tokenAdjacencyGraph,
|
||||
this._liquidityProviderRegistry,
|
||||
),
|
||||
);
|
||||
@@ -491,6 +489,7 @@ export class MarketOperationUtils {
|
||||
getNativeOrderTokens(orders[0])[1],
|
||||
[makerAmounts[i]],
|
||||
this._wethAddress,
|
||||
_opts.tokenAdjacencyGraph,
|
||||
),
|
||||
),
|
||||
];
|
||||
@@ -676,6 +675,7 @@ export class MarketOperationUtils {
|
||||
}
|
||||
|
||||
// If RFQ liquidity is enabled, make a request to check RFQ liquidity
|
||||
let comparisonPrice: BigNumber | undefined;
|
||||
const { rfqt } = _opts;
|
||||
if (
|
||||
rfqt &&
|
||||
@@ -684,7 +684,6 @@ export class MarketOperationUtils {
|
||||
marketSideLiquidity.quoteSourceFilters.isAllowed(ERC20BridgeSource.Native)
|
||||
) {
|
||||
// Calculate a suggested price. For now, this is simply the overall price of the aggregation.
|
||||
let comparisonPrice: BigNumber | undefined;
|
||||
if (optimizerResult) {
|
||||
const totalMakerAmount = BigNumber.sum(
|
||||
...optimizerResult.optimizedOrders.map(order => order.makerAssetAmount),
|
||||
@@ -781,6 +780,7 @@ export class MarketOperationUtils {
|
||||
_opts.rfqt ? _opts.rfqt.quoteRequestor : undefined,
|
||||
marketSideLiquidity,
|
||||
optimizerResult,
|
||||
comparisonPrice,
|
||||
);
|
||||
}
|
||||
return { ...optimizerResult, quoteReport };
|
||||
|
@@ -1,20 +1,13 @@
|
||||
import { NULL_ADDRESS } from './constants';
|
||||
import { NULL_ADDRESS, TOKENS } from './constants';
|
||||
|
||||
// tslint:disable completed-docs
|
||||
// tslint:disable enum-naming
|
||||
enum Tokens {
|
||||
WETH = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
||||
DAI = '0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||
MKR = '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
|
||||
}
|
||||
|
||||
export function getMultiBridgeIntermediateToken(takerToken: string, makerToken: string): string {
|
||||
let intermediateToken = NULL_ADDRESS;
|
||||
if (takerToken !== Tokens.WETH && makerToken !== Tokens.WETH) {
|
||||
intermediateToken = Tokens.WETH;
|
||||
} else if (takerToken === Tokens.USDC || makerToken === Tokens.USDC) {
|
||||
intermediateToken = Tokens.DAI;
|
||||
if (takerToken !== TOKENS.WETH && makerToken !== TOKENS.WETH) {
|
||||
intermediateToken = TOKENS.WETH;
|
||||
} else if (takerToken === TOKENS.USDC || makerToken === TOKENS.USDC) {
|
||||
intermediateToken = TOKENS.DAI;
|
||||
}
|
||||
return intermediateToken;
|
||||
}
|
||||
|
@@ -34,7 +34,7 @@ export function getIntermediateTokens(
|
||||
[wethAddress],
|
||||
);
|
||||
}
|
||||
return intermediateTokens.filter(
|
||||
return _.uniqBy(intermediateTokens, a => a.toLowerCase()).filter(
|
||||
token => token.toLowerCase() !== makerToken.toLowerCase() && token.toLowerCase() !== takerToken.toLowerCase(),
|
||||
);
|
||||
}
|
||||
|
@@ -33,6 +33,7 @@ import {
|
||||
NativeCollapsedFill,
|
||||
OptimizedMarketOrder,
|
||||
OrderDomain,
|
||||
ShellFillData,
|
||||
SnowSwapFillData,
|
||||
SushiSwapFillData,
|
||||
SwerveFillData,
|
||||
@@ -331,6 +332,14 @@ export function createBridgeOrder(
|
||||
createDODOBridgeData(takerToken, dodoFillData.poolAddress, dodoFillData.isSellBase),
|
||||
);
|
||||
break;
|
||||
case ERC20BridgeSource.Shell:
|
||||
const shellFillData = (fill as CollapsedFill<ShellFillData>).fillData!; // tslint:disable-line:no-non-null-assertion
|
||||
makerAssetData = assetDataUtils.encodeERC20BridgeAssetData(
|
||||
makerToken,
|
||||
bridgeAddress,
|
||||
createShellBridgeData(takerToken, shellFillData.poolAddress),
|
||||
);
|
||||
break;
|
||||
default:
|
||||
makerAssetData = assetDataUtils.encodeERC20BridgeAssetData(
|
||||
makerToken,
|
||||
@@ -380,6 +389,14 @@ function createBalancerBridgeData(takerToken: string, poolAddress: string): stri
|
||||
return encoder.encode({ takerToken, poolAddress });
|
||||
}
|
||||
|
||||
function createShellBridgeData(takerToken: string, poolAddress: string): string {
|
||||
const encoder = AbiEncoder.create([
|
||||
{ name: 'takerToken', type: 'address' },
|
||||
{ name: 'poolAddress', type: 'address' },
|
||||
]);
|
||||
return encoder.encode({ takerToken, poolAddress });
|
||||
}
|
||||
|
||||
function createBancorBridgeData(path: string[], networkAddress: string): string {
|
||||
const encoder = AbiEncoder.create([
|
||||
{ name: 'path', type: 'address[]' },
|
||||
|
@@ -14,6 +14,7 @@ import { getKyberReserveIdsForPair } from './kyber_utils';
|
||||
import { getMultiBridgeIntermediateToken } from './multibridge_utils';
|
||||
import { getIntermediateTokens } from './multihop_utils';
|
||||
import { SamplerContractOperation } from './sampler_contract_operation';
|
||||
import { getShellsForPair } from './shell_utils';
|
||||
import { SourceFilters } from './source_filters';
|
||||
import {
|
||||
BalancerFillData,
|
||||
@@ -30,6 +31,7 @@ import {
|
||||
MooniswapFillData,
|
||||
MultiBridgeFillData,
|
||||
MultiHopFillData,
|
||||
ShellFillData,
|
||||
SnowSwapFillData,
|
||||
SnowSwapInfo,
|
||||
SourceQuoteOperation,
|
||||
@@ -667,8 +669,8 @@ export class SamplerOperations {
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
sellAmount: BigNumber,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
wethAddress: string,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
): BatchedOperation<Array<DexSample<MultiHopFillData>>> {
|
||||
const _sources = TWO_HOP_SOURCE_FILTERS.getAllowed(sources);
|
||||
@@ -683,6 +685,7 @@ export class SamplerOperations {
|
||||
takerToken,
|
||||
[ZERO_AMOUNT],
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress,
|
||||
);
|
||||
const secondHopOps = this._getSellQuoteOperations(
|
||||
@@ -691,6 +694,7 @@ export class SamplerOperations {
|
||||
intermediateToken,
|
||||
[ZERO_AMOUNT],
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress,
|
||||
);
|
||||
return new SamplerContractOperation({
|
||||
@@ -743,8 +747,8 @@ export class SamplerOperations {
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
buyAmount: BigNumber,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
wethAddress: string,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
): BatchedOperation<Array<DexSample<MultiHopFillData>>> {
|
||||
const _sources = TWO_HOP_SOURCE_FILTERS.getAllowed(sources);
|
||||
@@ -759,6 +763,7 @@ export class SamplerOperations {
|
||||
takerToken,
|
||||
[new BigNumber(0)],
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph, // TODO is this a bad idea?
|
||||
liquidityProviderRegistryAddress,
|
||||
);
|
||||
const secondHopOps = this._getBuyQuoteOperations(
|
||||
@@ -767,6 +772,7 @@ export class SamplerOperations {
|
||||
intermediateToken,
|
||||
[new BigNumber(0)],
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress,
|
||||
);
|
||||
return new SamplerContractOperation({
|
||||
@@ -840,19 +846,29 @@ export class SamplerOperations {
|
||||
}
|
||||
|
||||
public getShellSellQuotes(
|
||||
poolAddress: string,
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
takerFillAmounts: BigNumber[],
|
||||
): SourceQuoteOperation {
|
||||
): SourceQuoteOperation<ShellFillData> {
|
||||
return new SamplerContractOperation({
|
||||
source: ERC20BridgeSource.Shell,
|
||||
contract: this._samplerContract,
|
||||
function: this._samplerContract.sampleSellsFromShell,
|
||||
params: [takerToken, makerToken, takerFillAmounts],
|
||||
params: [poolAddress, takerToken, makerToken, takerFillAmounts],
|
||||
callback: (callResults: string, fillData: ShellFillData): BigNumber[] => {
|
||||
const samples = this._samplerContract.getABIDecodedReturnData<BigNumber[]>(
|
||||
'sampleSellsFromShell',
|
||||
callResults,
|
||||
);
|
||||
fillData.poolAddress = poolAddress;
|
||||
return samples;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
public getShellBuyQuotes(
|
||||
poolAddress: string,
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
makerFillAmounts: BigNumber[],
|
||||
@@ -861,7 +877,15 @@ export class SamplerOperations {
|
||||
source: ERC20BridgeSource.Shell,
|
||||
contract: this._samplerContract,
|
||||
function: this._samplerContract.sampleBuysFromShell,
|
||||
params: [takerToken, makerToken, makerFillAmounts],
|
||||
params: [poolAddress, takerToken, makerToken, makerFillAmounts],
|
||||
callback: (callResults: string, fillData: ShellFillData): BigNumber[] => {
|
||||
const samples = this._samplerContract.getABIDecodedReturnData<BigNumber[]>(
|
||||
'sampleBuysFromShell',
|
||||
callResults,
|
||||
);
|
||||
fillData.poolAddress = poolAddress;
|
||||
return samples;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -912,7 +936,6 @@ export class SamplerOperations {
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
takerFillAmount: BigNumber,
|
||||
wethAddress: string,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
multiBridgeAddress?: string,
|
||||
): BatchedOperation<BigNumber> {
|
||||
@@ -924,7 +947,8 @@ export class SamplerOperations {
|
||||
makerToken,
|
||||
takerToken,
|
||||
[takerFillAmount],
|
||||
wethAddress,
|
||||
NULL_ADDRESS, // weth address
|
||||
{}, // token adjacency
|
||||
liquidityProviderRegistryAddress,
|
||||
multiBridgeAddress,
|
||||
);
|
||||
@@ -968,6 +992,7 @@ export class SamplerOperations {
|
||||
takerToken: string,
|
||||
takerFillAmounts: BigNumber[],
|
||||
wethAddress: string,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
multiBridgeAddress?: string,
|
||||
): BatchedOperation<DexSample[][]> {
|
||||
@@ -977,6 +1002,7 @@ export class SamplerOperations {
|
||||
takerToken,
|
||||
takerFillAmounts,
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress,
|
||||
multiBridgeAddress,
|
||||
);
|
||||
@@ -1009,6 +1035,7 @@ export class SamplerOperations {
|
||||
takerToken: string,
|
||||
makerFillAmounts: BigNumber[],
|
||||
wethAddress: string,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
): BatchedOperation<DexSample[][]> {
|
||||
const subOps = this._getBuyQuoteOperations(
|
||||
@@ -1017,6 +1044,7 @@ export class SamplerOperations {
|
||||
takerToken,
|
||||
makerFillAmounts,
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress,
|
||||
);
|
||||
return {
|
||||
@@ -1048,6 +1076,7 @@ export class SamplerOperations {
|
||||
takerToken: string,
|
||||
takerFillAmounts: BigNumber[],
|
||||
wethAddress: string,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
multiBridgeAddress?: string,
|
||||
): SourceQuoteOperation[] {
|
||||
@@ -1056,6 +1085,11 @@ export class SamplerOperations {
|
||||
)
|
||||
.exclude(multiBridgeAddress || multiBridgeAddress === NULL_ADDRESS ? [] : [ERC20BridgeSource.MultiBridge])
|
||||
.getAllowed(sources);
|
||||
|
||||
// Find the adjacent tokens in the provided tooken adjacency graph,
|
||||
// e.g if this is DAI->USDC we may check for DAI->WETH->USDC
|
||||
const intermediateTokens = getIntermediateTokens(makerToken, takerToken, tokenAdjacencyGraph, wethAddress);
|
||||
|
||||
return _.flatten(
|
||||
_sources.map(
|
||||
(source): SourceQuoteOperation | SourceQuoteOperation[] => {
|
||||
@@ -1066,25 +1100,17 @@ export class SamplerOperations {
|
||||
return this.getUniswapSellQuotes(makerToken, takerToken, takerFillAmounts);
|
||||
case ERC20BridgeSource.UniswapV2:
|
||||
const ops = [this.getUniswapV2SellQuotes([takerToken, makerToken], takerFillAmounts)];
|
||||
if (takerToken !== wethAddress && makerToken !== wethAddress) {
|
||||
ops.push(
|
||||
this.getUniswapV2SellQuotes(
|
||||
[takerToken, wethAddress, makerToken],
|
||||
takerFillAmounts,
|
||||
),
|
||||
);
|
||||
}
|
||||
intermediateTokens.forEach(t => {
|
||||
ops.push(this.getUniswapV2SellQuotes([takerToken, t, makerToken], takerFillAmounts));
|
||||
});
|
||||
return ops;
|
||||
case ERC20BridgeSource.SushiSwap:
|
||||
const sushiOps = [this.getSushiSwapSellQuotes([takerToken, makerToken], takerFillAmounts)];
|
||||
if (takerToken !== wethAddress && makerToken !== wethAddress) {
|
||||
intermediateTokens.forEach(t => {
|
||||
sushiOps.push(
|
||||
this.getSushiSwapSellQuotes(
|
||||
[takerToken, wethAddress, makerToken],
|
||||
takerFillAmounts,
|
||||
),
|
||||
this.getSushiSwapSellQuotes([takerToken, t, makerToken], takerFillAmounts),
|
||||
);
|
||||
}
|
||||
});
|
||||
return sushiOps;
|
||||
case ERC20BridgeSource.Kyber:
|
||||
return getKyberReserveIdsForPair(takerToken, makerToken).map(reserveId =>
|
||||
@@ -1172,7 +1198,9 @@ export class SamplerOperations {
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Shell:
|
||||
return this.getShellSellQuotes(makerToken, takerToken, takerFillAmounts);
|
||||
return getShellsForPair(takerToken, makerToken).map(pool =>
|
||||
this.getShellSellQuotes(pool, makerToken, takerToken, takerFillAmounts),
|
||||
);
|
||||
case ERC20BridgeSource.Dodo:
|
||||
return this.getDODOSellQuotes(makerToken, takerToken, takerFillAmounts);
|
||||
default:
|
||||
@@ -1189,11 +1217,17 @@ export class SamplerOperations {
|
||||
takerToken: string,
|
||||
makerFillAmounts: BigNumber[],
|
||||
wethAddress: string,
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph,
|
||||
liquidityProviderRegistryAddress?: string,
|
||||
): SourceQuoteOperation[] {
|
||||
const _sources = BATCH_SOURCE_FILTERS.exclude(
|
||||
liquidityProviderRegistryAddress ? [] : [ERC20BridgeSource.LiquidityProvider],
|
||||
).getAllowed(sources);
|
||||
|
||||
// Find the adjacent tokens in the provided tooken adjacency graph,
|
||||
// e.g if this is DAI->USDC we may check for DAI->WETH->USDC
|
||||
const intermediateTokens = getIntermediateTokens(makerToken, takerToken, tokenAdjacencyGraph, wethAddress);
|
||||
|
||||
return _.flatten(
|
||||
_sources.map(
|
||||
(source): SourceQuoteOperation | SourceQuoteOperation[] => {
|
||||
@@ -1204,19 +1238,17 @@ export class SamplerOperations {
|
||||
return this.getUniswapBuyQuotes(makerToken, takerToken, makerFillAmounts);
|
||||
case ERC20BridgeSource.UniswapV2:
|
||||
const ops = [this.getUniswapV2BuyQuotes([takerToken, makerToken], makerFillAmounts)];
|
||||
if (takerToken !== wethAddress && makerToken !== wethAddress) {
|
||||
ops.push(
|
||||
this.getUniswapV2BuyQuotes([takerToken, wethAddress, makerToken], makerFillAmounts),
|
||||
);
|
||||
}
|
||||
intermediateTokens.forEach(t => {
|
||||
ops.push(this.getUniswapV2BuyQuotes([takerToken, t, makerToken], makerFillAmounts));
|
||||
});
|
||||
return ops;
|
||||
case ERC20BridgeSource.SushiSwap:
|
||||
const sushiOps = [this.getSushiSwapBuyQuotes([takerToken, makerToken], makerFillAmounts)];
|
||||
if (takerToken !== wethAddress && makerToken !== wethAddress) {
|
||||
intermediateTokens.forEach(t => {
|
||||
sushiOps.push(
|
||||
this.getSushiSwapBuyQuotes([takerToken, wethAddress, makerToken], makerFillAmounts),
|
||||
this.getSushiSwapBuyQuotes([takerToken, t, makerToken], makerFillAmounts),
|
||||
);
|
||||
}
|
||||
});
|
||||
return sushiOps;
|
||||
case ERC20BridgeSource.Kyber:
|
||||
return getKyberReserveIdsForPair(takerToken, makerToken).map(reserveId =>
|
||||
@@ -1290,7 +1322,9 @@ export class SamplerOperations {
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Shell:
|
||||
return this.getShellBuyQuotes(makerToken, takerToken, makerFillAmounts);
|
||||
return getShellsForPair(takerToken, makerToken).map(pool =>
|
||||
this.getShellBuyQuotes(pool, makerToken, takerToken, makerFillAmounts),
|
||||
);
|
||||
case ERC20BridgeSource.Dodo:
|
||||
return this.getDODOBuyQuotes(makerToken, takerToken, makerFillAmounts);
|
||||
default:
|
||||
|
@@ -0,0 +1,8 @@
|
||||
import { MAINNET_SHELL_POOLS } from './constants';
|
||||
|
||||
// tslint:disable completed-docs
|
||||
export function getShellsForPair(takerToken: string, makerToken: string): string[] {
|
||||
return Object.values(MAINNET_SHELL_POOLS)
|
||||
.filter(c => [makerToken, takerToken].every(t => c.tokens.includes(t)))
|
||||
.map(i => i.poolAddress);
|
||||
}
|
@@ -123,6 +123,10 @@ export interface SushiSwapFillData extends UniswapV2FillData {
|
||||
router: string;
|
||||
}
|
||||
|
||||
export interface ShellFillData extends FillData {
|
||||
poolAddress: string;
|
||||
}
|
||||
|
||||
export interface LiquidityProviderFillData extends FillData {
|
||||
poolAddress: string;
|
||||
}
|
||||
@@ -313,6 +317,11 @@ export interface GetMarketOrdersOpts {
|
||||
* Whether to generate a quote report
|
||||
*/
|
||||
shouldGenerateQuoteReport: boolean;
|
||||
/**
|
||||
* Token addresses with a list of adjacent intermediary tokens to consider
|
||||
* hopping to. E.g DAI->USDC via an adjacent token WETH
|
||||
*/
|
||||
tokenAdjacencyGraph: TokenAdjacencyGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -42,6 +42,7 @@ export interface NativeOrderbookReportSource extends NativeReportSourceBase {
|
||||
export interface NativeRFQTReportSource extends NativeReportSourceBase {
|
||||
isRfqt: true;
|
||||
makerUri: string;
|
||||
comparisonPrice?: number;
|
||||
}
|
||||
export type QuoteReportSource =
|
||||
| BridgeReportSource
|
||||
@@ -65,11 +66,12 @@ export function generateQuoteReport(
|
||||
nativeOrders: SignedOrder[],
|
||||
orderFillableAmounts: BigNumber[],
|
||||
liquidityDelivered: ReadonlyArray<CollapsedFill> | DexSample<MultiHopFillData>,
|
||||
comparisonPrice?: BigNumber | undefined,
|
||||
quoteRequestor?: QuoteRequestor,
|
||||
): QuoteReport {
|
||||
const dexReportSourcesConsidered = dexQuotes.map(quote => _dexSampleToReportSource(quote, marketOperation));
|
||||
const nativeOrderSourcesConsidered = nativeOrders.map((order, idx) =>
|
||||
_nativeOrderToReportSource(order, orderFillableAmounts[idx], quoteRequestor),
|
||||
_nativeOrderToReportSource(order, orderFillableAmounts[idx], comparisonPrice, quoteRequestor),
|
||||
);
|
||||
const multiHopSourcesConsidered = multiHopQuotes.map(quote =>
|
||||
_multiHopSampleToReportSource(quote, marketOperation),
|
||||
@@ -94,6 +96,7 @@ export function generateQuoteReport(
|
||||
return _nativeOrderToReportSource(
|
||||
foundNativeOrder,
|
||||
nativeOrderSignaturesToFillableAmounts[foundNativeOrder.signature],
|
||||
comparisonPrice,
|
||||
quoteRequestor,
|
||||
);
|
||||
} else {
|
||||
@@ -197,6 +200,7 @@ function _nativeOrderFromCollapsedFill(cf: CollapsedFill): SignedOrder | undefin
|
||||
function _nativeOrderToReportSource(
|
||||
nativeOrder: SignedOrder,
|
||||
fillableAmount: BigNumber,
|
||||
comparisonPrice?: BigNumber | undefined,
|
||||
quoteRequestor?: QuoteRequestor,
|
||||
): NativeRFQTReportSource | NativeOrderbookReportSource {
|
||||
const nativeOrderBase: NativeReportSourceBase = {
|
||||
@@ -215,6 +219,9 @@ function _nativeOrderToReportSource(
|
||||
isRfqt: true,
|
||||
makerUri: foundRfqtMakerUri,
|
||||
};
|
||||
if (comparisonPrice) {
|
||||
rfqtSource.comparisonPrice = comparisonPrice.toNumber();
|
||||
}
|
||||
return rfqtSource;
|
||||
} else {
|
||||
// if it's not an rfqt order, treat as normal
|
||||
|
@@ -18,7 +18,7 @@ import {
|
||||
computeBalancerSellQuote,
|
||||
} from '../src/utils/market_operation_utils/balancer_utils';
|
||||
import { DexOrderSampler, getSampleAmounts } from '../src/utils/market_operation_utils/sampler';
|
||||
import { ERC20BridgeSource } from '../src/utils/market_operation_utils/types';
|
||||
import { ERC20BridgeSource, TokenAdjacencyGraph } from '../src/utils/market_operation_utils/types';
|
||||
|
||||
import { MockBalancerPoolsCache } from './utils/mock_balancer_pools_cache';
|
||||
import { MockBancorService } from './utils/mock_bancor_service';
|
||||
@@ -36,6 +36,8 @@ describe('DexSampler tests', () => {
|
||||
const wethAddress = getContractAddressesForChainOrThrow(CHAIN_ID).etherToken;
|
||||
const exchangeAddress = getContractAddressesForChainOrThrow(CHAIN_ID).exchange;
|
||||
|
||||
const tokenAdjacencyGraph: TokenAdjacencyGraph = {};
|
||||
|
||||
describe('getSampleAmounts()', () => {
|
||||
const FILL_AMOUNT = getRandomInteger(1, 1e18);
|
||||
const NUM_SAMPLES = 16;
|
||||
@@ -175,6 +177,7 @@ describe('DexSampler tests', () => {
|
||||
expectedTakerToken,
|
||||
[toBaseUnitAmount(1000)],
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
registry,
|
||||
),
|
||||
);
|
||||
@@ -211,6 +214,7 @@ describe('DexSampler tests', () => {
|
||||
expectedTakerToken,
|
||||
[toBaseUnitAmount(1000)],
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
registry,
|
||||
),
|
||||
);
|
||||
@@ -252,7 +256,8 @@ describe('DexSampler tests', () => {
|
||||
expectedMakerToken,
|
||||
expectedTakerToken,
|
||||
[toBaseUnitAmount(1000)],
|
||||
randomAddress(),
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
randomAddress(),
|
||||
multiBridge,
|
||||
),
|
||||
@@ -419,6 +424,7 @@ describe('DexSampler tests', () => {
|
||||
expectedTakerToken,
|
||||
expectedTakerFillAmounts,
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
),
|
||||
);
|
||||
const expectedQuotes = sources.map(s =>
|
||||
@@ -563,6 +569,7 @@ describe('DexSampler tests', () => {
|
||||
expectedTakerToken,
|
||||
expectedMakerFillAmounts,
|
||||
wethAddress,
|
||||
tokenAdjacencyGraph,
|
||||
),
|
||||
);
|
||||
const expectedQuotes = sources.map(s =>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user