Compare commits

...

12 Commits

Author SHA1 Message Date
Github Actions
dbcb221a59 Publish
- @0x/contracts-asset-proxy@3.6.3
 - @0x/contracts-broker@1.1.11
 - @0x/contracts-coordinator@3.1.12
 - @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-forwarder@4.2.12
 - @0x/contracts-exchange-libs@4.3.12
 - @0x/contracts-exchange@3.2.12
 - @0x/contracts-extensions@6.2.6
 - @0x/contracts-integrations@2.7.5
 - @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/contracts-zero-ex@0.7.0
 - @0x/asset-swapper@5.0.1
 - @0x/contract-addresses@5.1.0
 - @0x/contract-artifacts@3.8.2
 - @0x/contract-wrappers-test@12.2.22
 - @0x/contract-wrappers@13.9.4
 - @0x/migrations@6.4.6
 - @0x/order-utils@10.4.4
2020-11-03 04:16:44 +00:00
Github Actions
6bbc179f52 Updated CHANGELOGS & MD docs 2020-11-03 04:16:37 +00:00
Lawrence Forman
48e7a391c8 Deploy new FQT (#28)
* `@0x/contracts-zero-ex`: Change `ProtocolFeeUnfunded` event in FQT
`@0x/contracts-zero-ex`: Use new PLP interface in FQT.

* `@0x/contract-addresses`: Deploy new FQT

* fix failing FQT test

Co-authored-by: Lawrence Forman <me@merklejerk.com>
2020-11-02 21:47:25 -05:00
Github Actions
2334e64d0c Publish
- @0x/contracts-asset-proxy@3.6.2
 - @0x/contracts-broker@1.1.10
 - @0x/contracts-coordinator@3.1.11
 - @0x/contracts-dev-utils@1.3.9
 - @0x/contracts-erc1155@2.1.11
 - @0x/contracts-erc20@3.2.5
 - @0x/contracts-erc721@3.1.11
 - @0x/contracts-exchange-forwarder@4.2.11
 - @0x/contracts-exchange-libs@4.3.11
 - @0x/contracts-exchange@3.2.11
 - @0x/contracts-extensions@6.2.5
 - @0x/contracts-integrations@2.7.4
 - @0x/contracts-multisig@4.1.11
 - @0x/contracts-staking@2.0.18
 - @0x/contracts-test-utils@5.3.8
 - @0x/contracts-utils@4.5.5
 - @0x/contracts-zero-ex@0.6.0
 - @0x/asset-swapper@5.0.0
 - @0x/contract-artifacts@3.8.1
 - @0x/contract-wrappers-test@12.2.21
 - @0x/contract-wrappers@13.9.3
 - @0x/migrations@6.4.5
 - @0x/order-utils@10.4.3
2020-11-02 22:21:36 +00:00
Github Actions
14f920ee84 Updated CHANGELOGS & MD docs 2020-11-02 22:21:30 +00:00
Jacob Evans
e10a81023a feat: [asset-swapper] more hops via token adjacency (#24)
* feat: [asset-swapper] more hops via token adjacency

* fix lint

* CHANGELOG
2020-11-03 07:48:37 +10:00
Lawrence Forman
f4709ed1cb EP: Add LibSignature library (#21)
* `@0x/contracts-zero-ex`: Add `LibSignature` library

* `@0x/contracts-zero-ex`: Update package.json scripts

Co-authored-by: Lawrence Forman <me@merklejerk.com>
2020-10-29 17:47:17 -04:00
Daniel Pyrathon
e2e14a977a fix: [WIP] Adds RFQ price-aware comparison price to Quote Report (#18)
* Adds RFQ price-aware comparison price to Quote Report

* added linting fix

* added small lints

* better syntax
2020-10-29 08:48:01 -07:00
Jacob Evans
866f958a10 Update README.md 2020-10-29 17:12:23 +10:00
Jacob Evans
717db99b38 fix: Support Multiple Shells (#17)
* fix: Support Multiple Shells

* CHANGEGLOG
2020-10-29 17:09:23 +10:00
Lawrence Forman
02006118c7 Fix broken tools deps (#20)
* update tools deps to highest
add custom doc gen config

* remove phantom package in manifest

Co-authored-by: Lawrence Forman <me@merklejerk.com>
2020-10-29 16:33:16 +10:00
Steve Marx
9816019bc5 add protocol fees fixin (#2) 2020-10-28 17:10:59 -04:00
121 changed files with 2689 additions and 766 deletions

View File

@@ -8,7 +8,7 @@ This repository is a monorepo including the 0x protocol smart contracts and nume
[website-url]: https://0x.org
[![CircleCI](https://circleci.com/gh/0xProject/0x-monorepo.svg?style=svg&circle-token=61bf7cd8c9b4e11b132089dfcffdd1be277d1e0c)](https://circleci.com/gh/0xProject/0x-monorepo)
[![CircleCI](https://circleci.com/gh/0xProject/protocol.svg?style=svg&circle-token=61bf7cd8c9b4e11b132089dfcffdd1be277d1e0c)](https://circleci.com/gh/0xProject/protocool)
[![Coverage Status](https://coveralls.io/repos/github/0xProject/0x-monorepo/badge.svg?branch=development)](https://coveralls.io/github/0xProject/0x-monorepo?branch=development)
[![Discord](https://img.shields.io/badge/chat-discord.chat-yellow.svg?style=flat)](https://discordapp.com/invite/d3FTX3M)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](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:

View File

@@ -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",

View File

@@ -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

View File

@@ -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,

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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

View File

@@ -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"

View File

@@ -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",

View File

@@ -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

View File

@@ -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"

View File

@@ -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",

View File

@@ -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

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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"

View File

@@ -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",

View File

@@ -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

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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",

View File

@@ -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",

View File

@@ -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

View File

@@ -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()

View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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
);
}
}

View 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}();
}
}
}

View 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.
}
}

View File

@@ -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()

View 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);
}
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -44,7 +44,6 @@ contract MixinAdapterAddresses
address uniswapV2Router;
address uniswapExchangeFactory;
address mStable;
address shell;
address dodoHelper;
// Other
address weth;

View File

@@ -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.

View File

@@ -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);
}
}
}

View 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);
}

View File

@@ -104,4 +104,9 @@ interface IExchange {
external
view
returns (address proxyAddress);
function EIP712_EXCHANGE_DOMAIN_HASH()
external
view
returns (bytes32 domainHash);
}

View 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;
}

View 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;
}
}

View File

@@ -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;

View 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);
}
}

View 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);
}
}

View 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;
}
}

View File

@@ -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"
},

View File

@@ -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';

View 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);
}

View 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),
};
}

View File

@@ -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,

View 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),
);
});
});
});

View 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);
});
});
});

View File

@@ -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,

View File

@@ -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';

View File

@@ -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
View 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"]
}

View File

@@ -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",

View File

@@ -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": [

View File

@@ -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)

View File

@@ -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)

View File

@@ -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",

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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;
}
/**

View File

@@ -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: {},
};

View File

@@ -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 };

View File

@@ -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;
}

View File

@@ -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(),
);
}

View File

@@ -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[]' },

View File

@@ -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:

View File

@@ -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);
}

View File

@@ -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;
}
/**

View File

@@ -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

View File

@@ -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