Compare commits
46 Commits
@0x/contra
...
feat/721-o
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ae56d5876 | ||
|
|
fd5d549c43 | ||
|
|
180110de50 | ||
|
|
d186cddc29 | ||
|
|
fbabd2f264 | ||
|
|
35f375a525 | ||
|
|
29892db0fd | ||
|
|
2cbb107380 | ||
|
|
599d590fbc | ||
|
|
9651b41264 | ||
|
|
b6f118ef32 | ||
|
|
2cc11c87d1 | ||
|
|
7fa2eb4c2a | ||
|
|
35d839c651 | ||
|
|
a009779a88 | ||
|
|
9aa7945bc4 | ||
|
|
e7d198ef16 | ||
|
|
4e7e6eb634 | ||
|
|
f745023625 | ||
|
|
2fdca24d4e | ||
|
|
42ec0b144e | ||
|
|
3f6ce78b46 | ||
|
|
c1300c1068 | ||
|
|
9a641cfab6 | ||
|
|
60345d4465 | ||
|
|
11dfea47a6 | ||
|
|
55e9dd39a2 | ||
|
|
1993929bed | ||
|
|
e1d81de517 | ||
|
|
a6b3a21635 | ||
|
|
fd59cdc2db | ||
|
|
98e11b5189 | ||
|
|
3bebc7cd62 | ||
|
|
56dab6ae8c | ||
|
|
285f98e9e9 | ||
|
|
8ae9f59f20 | ||
|
|
4c341c5ca3 | ||
|
|
a3c912c2af | ||
|
|
5e72eb9af9 | ||
|
|
9b08b73c06 | ||
|
|
76c7eb7c3e | ||
|
|
9b2e5a3adb | ||
|
|
813d703d12 | ||
|
|
83005d0f3d | ||
|
|
d07ffd2688 | ||
|
|
4170f970d0 |
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "3.3.25",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1638390144,
|
"timestamp": 1638390144,
|
||||||
"version": "3.3.24",
|
"version": "3.3.24",
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v3.3.25 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v3.3.24 - _December 1, 2021_
|
## v3.3.24 - _December 1, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-erc20",
|
"name": "@0x/contracts-erc20",
|
||||||
"version": "3.3.24",
|
"version": "3.3.25",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -53,8 +53,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^5.6.2",
|
"@0x/abi-gen": "^5.6.2",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.40",
|
||||||
"@0x/contracts-test-utils": "^5.4.15",
|
"@0x/contracts-test-utils": "^5.4.16",
|
||||||
"@0x/contracts-utils": "^4.8.5",
|
"@0x/contracts-utils": "^4.8.6",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^4.2.9",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.7.5",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "5.4.16",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1638390144,
|
"timestamp": 1638390144,
|
||||||
"version": "5.4.15",
|
"version": "5.4.15",
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v5.4.16 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v5.4.15 - _December 1, 2021_
|
## v5.4.15 - _December 1, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-test-utils",
|
"name": "@0x/contracts-test-utils",
|
||||||
"version": "5.4.15",
|
"version": "5.4.16",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^3.0.29",
|
"@0x/assert": "^3.0.29",
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^6.4.2",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^4.2.9",
|
||||||
"@0x/json-schemas": "^6.3.0",
|
"@0x/json-schemas": "^6.3.0",
|
||||||
"@0x/order-utils": "^10.4.28",
|
"@0x/order-utils": "^10.4.28",
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "1.4.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1638390144,
|
"timestamp": 1638390144,
|
||||||
"version": "1.4.7",
|
"version": "1.4.7",
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.4.8 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.4.7 - _December 1, 2021_
|
## v1.4.7 - _December 1, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-treasury",
|
"name": "@0x/contracts-treasury",
|
||||||
"version": "1.4.7",
|
"version": "1.4.8",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -47,12 +47,12 @@
|
|||||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury",
|
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^5.6.2",
|
"@0x/abi-gen": "^5.6.2",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/contracts-asset-proxy": "^3.7.19",
|
"@0x/contracts-asset-proxy": "^3.7.19",
|
||||||
"@0x/contracts-erc20": "^3.3.24",
|
"@0x/contracts-erc20": "^3.3.25",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.40",
|
||||||
"@0x/contracts-staking": "^2.0.45",
|
"@0x/contracts-staking": "^2.0.45",
|
||||||
"@0x/contracts-test-utils": "^5.4.15",
|
"@0x/contracts-test-utils": "^5.4.16",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.7.5",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
"@0x/tslint-config": "^4.1.4",
|
"@0x/tslint-config": "^4.1.4",
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^6.4.2",
|
||||||
"@0x/protocol-utils": "^1.10.0",
|
"@0x/protocol-utils": "^1.10.1",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/subproviders": "^6.6.0",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/types": "^3.3.4",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/typescript-typings": "^5.2.1",
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "4.8.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1638390144,
|
"timestamp": 1638390144,
|
||||||
"version": "4.8.5",
|
"version": "4.8.5",
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v4.8.6 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v4.8.5 - _December 1, 2021_
|
## v4.8.5 - _December 1, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-utils",
|
"name": "@0x/contracts-utils",
|
||||||
"version": "4.8.5",
|
"version": "4.8.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^5.6.2",
|
"@0x/abi-gen": "^5.6.2",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.40",
|
||||||
"@0x/contracts-test-utils": "^5.4.15",
|
"@0x/contracts-test-utils": "^5.4.16",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^4.2.9",
|
||||||
"@0x/order-utils": "^10.4.28",
|
"@0x/order-utils": "^10.4.28",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.7.5",
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "0.30.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "0.30.0",
|
"version": "0.30.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.30.1 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v0.30.0 - _December 1, 2021_
|
## v0.30.0 - _December 1, 2021_
|
||||||
|
|
||||||
* Add `AaveV2` and `Compound` deposit/withdrawal liquidity source (#321)
|
* Add `AaveV2` and `Compound` deposit/withdrawal liquidity source (#321)
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import "./features/interfaces/IBatchFillNativeOrdersFeature.sol";
|
|||||||
import "./features/interfaces/IMultiplexFeature.sol";
|
import "./features/interfaces/IMultiplexFeature.sol";
|
||||||
import "./features/interfaces/IOtcOrdersFeature.sol";
|
import "./features/interfaces/IOtcOrdersFeature.sol";
|
||||||
import "./features/interfaces/IFundRecoveryFeature.sol";
|
import "./features/interfaces/IFundRecoveryFeature.sol";
|
||||||
|
import "./features/interfaces/IERC721OrdersFeature.sol";
|
||||||
|
|
||||||
|
|
||||||
/// @dev Interface for a fully featured Exchange Proxy.
|
/// @dev Interface for a fully featured Exchange Proxy.
|
||||||
@@ -50,7 +51,8 @@ interface IZeroEx is
|
|||||||
IBatchFillNativeOrdersFeature,
|
IBatchFillNativeOrdersFeature,
|
||||||
IMultiplexFeature,
|
IMultiplexFeature,
|
||||||
IOtcOrdersFeature,
|
IOtcOrdersFeature,
|
||||||
IFundRecoveryFeature
|
IFundRecoveryFeature,
|
||||||
|
IERC721OrdersFeature
|
||||||
{
|
{
|
||||||
// solhint-disable state-visibility
|
// solhint-disable state-visibility
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,200 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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;
|
||||||
|
|
||||||
|
|
||||||
|
library LibERC721OrdersRichErrors {
|
||||||
|
|
||||||
|
// solhint-disable func-name-mixedcase
|
||||||
|
|
||||||
|
function OverspentEthError(
|
||||||
|
uint256 ethSpent,
|
||||||
|
uint256 msgValue
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("OverspentEthError(uint256,uint256)")),
|
||||||
|
ethSpent,
|
||||||
|
msgValue
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function InsufficientEthError(
|
||||||
|
uint256 ethAvailable,
|
||||||
|
uint256 orderAmount
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("InsufficientEthError(uint256,uint256)")),
|
||||||
|
ethAvailable,
|
||||||
|
orderAmount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ERC721TokenMismatchError(
|
||||||
|
address token1,
|
||||||
|
address token2
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("ERC721TokenMismatchError(address,address)")),
|
||||||
|
token1,
|
||||||
|
token2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ERC20TokenMismatchError(
|
||||||
|
address token1,
|
||||||
|
address token2
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("ERC20TokenMismatchError(address,address)")),
|
||||||
|
token1,
|
||||||
|
token2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function NegativeSpreadError(
|
||||||
|
uint256 sellOrderAmount,
|
||||||
|
uint256 buyOrderAmount
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("NegativeSpreadError(uint256,uint256)")),
|
||||||
|
sellOrderAmount,
|
||||||
|
buyOrderAmount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function SellOrderFeesExceedSpreadError(
|
||||||
|
uint256 sellOrderFees,
|
||||||
|
uint256 spread
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("SellOrderFeesExceedSpreadError(uint256,uint256)")),
|
||||||
|
sellOrderFees,
|
||||||
|
spread
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function OnlyTakerError(
|
||||||
|
address sender,
|
||||||
|
address taker
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("OnlyTakerError(address,address)")),
|
||||||
|
sender,
|
||||||
|
taker
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function InvalidSignerError(
|
||||||
|
address maker,
|
||||||
|
address signer
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("InvalidSignerError(address,address)")),
|
||||||
|
maker,
|
||||||
|
signer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function OrderNotFillableError(
|
||||||
|
address maker,
|
||||||
|
uint256 nonce,
|
||||||
|
uint8 orderStatus
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("OrderNotFillableError(address,uint256,uint8)")),
|
||||||
|
maker,
|
||||||
|
nonce,
|
||||||
|
orderStatus
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ERC721TokenIdMismatchError(
|
||||||
|
uint256 tokenId,
|
||||||
|
uint256 orderTokenId
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("ERC721TokenIdMismatchError(uint256,uint256)")),
|
||||||
|
tokenId,
|
||||||
|
orderTokenId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function PropertyValidationFailedError(
|
||||||
|
address propertyValidator,
|
||||||
|
address erc721Token,
|
||||||
|
uint256 erc721TokenId,
|
||||||
|
bytes memory propertyData,
|
||||||
|
bytes memory errorData
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
bytes4(keccak256("PropertyValidationFailedError(address,address,uint256,bytes,bytes)")),
|
||||||
|
propertyValidator,
|
||||||
|
erc721Token,
|
||||||
|
erc721TokenId,
|
||||||
|
propertyData,
|
||||||
|
errorData
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
1112
contracts/zero-ex/contracts/src/features/ERC721OrdersFeature.sol
Normal file
1112
contracts/zero-ex/contracts/src/features/ERC721OrdersFeature.sol
Normal file
File diff suppressed because it is too large
Load Diff
@@ -311,7 +311,7 @@ contract OtcOrdersFeature is
|
|||||||
// Unwrap WETH
|
// Unwrap WETH
|
||||||
WETH.withdraw(order.makerAmount);
|
WETH.withdraw(order.makerAmount);
|
||||||
// Transfer ETH to taker
|
// Transfer ETH to taker
|
||||||
_transferEth(taker, order.makerAmount);
|
_transferEth(payable(taker), order.makerAmount);
|
||||||
|
|
||||||
emit OtcOrderFilled(
|
emit OtcOrderFilled(
|
||||||
orderInfo.orderHash,
|
orderInfo.orderHash,
|
||||||
@@ -622,16 +622,4 @@ contract OtcOrdersFeature is
|
|||||||
[txOrigin]
|
[txOrigin]
|
||||||
[nonceBucket];
|
[nonceBucket];
|
||||||
}
|
}
|
||||||
|
|
||||||
function _transferEth(address recipient, uint256 amount)
|
|
||||||
private
|
|
||||||
{
|
|
||||||
// Transfer ETH to recipient
|
|
||||||
(bool success, bytes memory revertData) =
|
|
||||||
recipient.call{value: amount}("");
|
|
||||||
// Revert on failure
|
|
||||||
if (!success) {
|
|
||||||
revertData.rrevert();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,283 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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/IERC20TokenV06.sol";
|
||||||
|
import "../libs/LibERC721Order.sol";
|
||||||
|
import "../libs/LibSignature.sol";
|
||||||
|
import "../../vendor/IERC721Token.sol";
|
||||||
|
|
||||||
|
|
||||||
|
/// @dev Feature for interacting with ERC721 orders.
|
||||||
|
interface IERC721OrdersFeature {
|
||||||
|
|
||||||
|
/// @dev Emitted whenever an `ERC721Order` is filled.
|
||||||
|
/// @param direction Whether the order is selling or
|
||||||
|
/// buying the ERC721 token.
|
||||||
|
/// @param erc20Token The address of the ERC20 token.
|
||||||
|
/// @param erc20TokenAmount The amount of ERC20 token
|
||||||
|
/// to sell or buy.
|
||||||
|
/// @param erc721Token The address of the ERC721 token.
|
||||||
|
/// @param erc721TokenId The ID of the ERC721 asset.
|
||||||
|
/// @param maker The maker of the order.
|
||||||
|
/// @param taker The taker of the order.
|
||||||
|
/// @param nonce The unique maker nonce in the order.
|
||||||
|
event ERC721OrderFilled(
|
||||||
|
LibERC721Order.TradeDirection direction,
|
||||||
|
IERC20TokenV06 erc20Token,
|
||||||
|
uint256 erc20TokenAmount,
|
||||||
|
IERC721Token erc721Token,
|
||||||
|
uint256 erc721TokenId,
|
||||||
|
address maker,
|
||||||
|
address taker,
|
||||||
|
uint256 nonce
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @dev Emitted whenever two `ERC721Order`s are matched.
|
||||||
|
/// @param erc20Token The ERC20 token of the two orders.
|
||||||
|
/// If `sellOrder.erc20Token` is the native token
|
||||||
|
/// and `buyOrder.erc20Token` is the wrapped native
|
||||||
|
/// token, this will be `NATIVE_TOKEN_ADDRESS`.
|
||||||
|
/// @param erc721Token The address of the ERC721 token.
|
||||||
|
/// @param erc721TokenId The ID of the ERC721 asset.
|
||||||
|
/// @param sellOrderMaker The maker of the sell order.
|
||||||
|
/// @param buyOrderMaker The maker of the buy order.
|
||||||
|
/// @param sellOrderNonce The nonce of the sell order.
|
||||||
|
/// @param buyOrderNonce The nonce of the buy order.
|
||||||
|
/// @param matcher The address that called the `matchERC721Orders`
|
||||||
|
/// or `batchMatchERC721Orders` function.
|
||||||
|
/// @param profit The amount of profit earned by the matcher,
|
||||||
|
/// denominated in `erc20Token`.
|
||||||
|
event ERC721OrdersMatched(
|
||||||
|
IERC20TokenV06 erc20Token,
|
||||||
|
IERC721Token erc721Token,
|
||||||
|
uint256 erc20TokenAmount,
|
||||||
|
uint256 erc721TokenId,
|
||||||
|
address sellOrderMaker,
|
||||||
|
address buyOrderMaker,
|
||||||
|
uint256 sellOrderNonce,
|
||||||
|
uint256 buyOrderNonce,
|
||||||
|
address matcher,
|
||||||
|
uint256 profit
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @dev Emitted whenever an `ERC721Order` is cancelled.
|
||||||
|
/// @param maker The maker of the order.
|
||||||
|
/// @param nonce The nonce of the order that was cancelled.
|
||||||
|
event ERC721OrderCancelled(
|
||||||
|
address maker,
|
||||||
|
uint256 nonce
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @dev Sells an ERC721 asset to fill the given order.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @param signature The order signature from the maker.
|
||||||
|
/// @param erc721TokenId The ID of the ERC721 asset being
|
||||||
|
/// sold. If the given order specifies properties,
|
||||||
|
/// the asset must satisfy those properties. Otherwise,
|
||||||
|
/// it must equal the tokenId in the order.
|
||||||
|
/// @param unwrapNativeToken If this parameter is true and the
|
||||||
|
/// ERC20 token of the order is e.g. WETH, unwraps the
|
||||||
|
/// token before transferring it to the taker.
|
||||||
|
/// @param callbackData If this parameter is non-zero, invokes
|
||||||
|
/// `zeroExERC721OrderCallback` on `msg.sender` after
|
||||||
|
/// the ERC20 tokens have been transferred to `msg.sender`
|
||||||
|
/// but before transferring the ERC721 asset to the buyer.
|
||||||
|
function sellERC721(
|
||||||
|
LibERC721Order.ERC721Order calldata order,
|
||||||
|
LibSignature.Signature calldata signature,
|
||||||
|
uint256 erc721TokenId,
|
||||||
|
bool unwrapNativeToken,
|
||||||
|
bytes calldata callbackData
|
||||||
|
)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @dev Buys an ERC721 asset by filling the given order.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @param signature The order signature.
|
||||||
|
/// @param callbackData If this parameter is non-zero, invokes
|
||||||
|
/// `zeroExERC721OrderCallback` on `msg.sender` after
|
||||||
|
/// the ERC721 asset has been transferred to `msg.sender`
|
||||||
|
/// but before transferring the ERC20 tokens to the seller.
|
||||||
|
/// Native tokens acquired during the callback can be used
|
||||||
|
/// to fill the order.
|
||||||
|
function buyERC721(
|
||||||
|
LibERC721Order.ERC721Order calldata order,
|
||||||
|
LibSignature.Signature calldata signature,
|
||||||
|
bytes calldata callbackData
|
||||||
|
)
|
||||||
|
external
|
||||||
|
payable;
|
||||||
|
|
||||||
|
/// @dev Cancel a single ERC721 order by its nonce. The caller
|
||||||
|
/// should be the maker of the order. Silently succeeds if
|
||||||
|
/// an order with the same nonce has already been filled or
|
||||||
|
/// cancelled.
|
||||||
|
/// @param orderNonce The order nonce.
|
||||||
|
function cancelERC721Order(uint256 orderNonce)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @dev Buys multiple ERC721 assets by filling the
|
||||||
|
/// given orders.
|
||||||
|
/// @param orders The ERC721 orders.
|
||||||
|
/// @param signatures The order signatures.
|
||||||
|
/// @param revertIfIncomplete If true, reverts if this
|
||||||
|
/// function fails to fill any individual order.
|
||||||
|
/// @return successes An array of booleans corresponding to whether
|
||||||
|
/// each order in `orders` was successfully filled.
|
||||||
|
function batchBuyERC721s(
|
||||||
|
LibERC721Order.ERC721Order[] calldata orders,
|
||||||
|
LibSignature.Signature[] calldata signatures,
|
||||||
|
bool revertIfIncomplete
|
||||||
|
)
|
||||||
|
external
|
||||||
|
payable
|
||||||
|
returns (bool[] memory successes);
|
||||||
|
|
||||||
|
/// @dev Matches a pair of complementary orders that have
|
||||||
|
/// a non-negative spread. Each order is filled at
|
||||||
|
/// their respective price, and the matcher receives
|
||||||
|
/// a profit denominated in the ERC20 token.
|
||||||
|
/// @param sellOrder Order selling an ERC721 asset.
|
||||||
|
/// @param buyOrder Order buying an ERC721 asset.
|
||||||
|
/// @param sellOrderSignature Signature for the sell order.
|
||||||
|
/// @param buyOrderSignature Signature for the buy order.
|
||||||
|
/// @return profit The amount of profit earned by the caller
|
||||||
|
/// of this function (denominated in the ERC20 token
|
||||||
|
/// of the matched orders).
|
||||||
|
function matchERC721Orders(
|
||||||
|
LibERC721Order.ERC721Order calldata sellOrder,
|
||||||
|
LibERC721Order.ERC721Order calldata buyOrder,
|
||||||
|
LibSignature.Signature calldata sellOrderSignature,
|
||||||
|
LibSignature.Signature calldata buyOrderSignature
|
||||||
|
)
|
||||||
|
external
|
||||||
|
returns (uint256 profit);
|
||||||
|
|
||||||
|
/// @dev Matches pairs of complementary orders that have
|
||||||
|
/// non-negative spreads. Each order is filled at
|
||||||
|
/// their respective price, and the matcher receives
|
||||||
|
/// a profit denominated in the ERC20 token.
|
||||||
|
/// @param sellOrders Orders selling ERC721 assets.
|
||||||
|
/// @param buyOrders Orders buying ERC721 assets.
|
||||||
|
/// @param sellOrderSignatures Signatures for the sell orders.
|
||||||
|
/// @param buyOrderSignatures Signatures for the buy orders.
|
||||||
|
/// @return profits The amount of profit earned by the caller
|
||||||
|
/// of this function for each pair of matched orders
|
||||||
|
/// (denominated in the ERC20 token of the order pair).
|
||||||
|
/// @return successes An array of booleans corresponding to
|
||||||
|
/// whether each pair of orders was successfully matched.
|
||||||
|
function batchMatchERC721Orders(
|
||||||
|
LibERC721Order.ERC721Order[] calldata sellOrders,
|
||||||
|
LibERC721Order.ERC721Order[] calldata buyOrders,
|
||||||
|
LibSignature.Signature[] calldata sellOrderSignatures,
|
||||||
|
LibSignature.Signature[] calldata buyOrderSignatures
|
||||||
|
)
|
||||||
|
external
|
||||||
|
returns (uint256[] memory profits, bool[] memory successes);
|
||||||
|
|
||||||
|
/// @dev Callback for the ERC721 `safeTransferFrom` function.
|
||||||
|
/// This callback can be used to sell an ERC721 asset if
|
||||||
|
/// a valid ERC721 order, signature and `unwrapNativeToken`
|
||||||
|
/// are encoded in `data`. This allows takers to sell their
|
||||||
|
/// ERC721 asset without first calling `setApprovalForAll`.
|
||||||
|
/// @param operator The address which called `safeTransferFrom`.
|
||||||
|
/// @param from The address which previously owned the token.
|
||||||
|
/// @param tokenId The ID of the asset being transferred.
|
||||||
|
/// @param data Additional data with no specified format. If a
|
||||||
|
/// valid ERC721 order, signature and `unwrapNativeToken`
|
||||||
|
/// are encoded in `data`, this function will try to fill
|
||||||
|
/// the order using the received asset.
|
||||||
|
/// @return success The selector of this function (0x150b7a02),
|
||||||
|
/// indicating that the callback succeeded.
|
||||||
|
function onERC721Received(
|
||||||
|
address operator,
|
||||||
|
address from,
|
||||||
|
uint256 tokenId,
|
||||||
|
bytes calldata data
|
||||||
|
)
|
||||||
|
external
|
||||||
|
returns (bytes4 success);
|
||||||
|
|
||||||
|
/// @dev Approves an ERC721 order hash on-chain. After pre-signing
|
||||||
|
/// a hash, the `PRESIGNED` signature type will become valid
|
||||||
|
/// for that order and maker.
|
||||||
|
/// @param orderHash An ERC721 order hash.
|
||||||
|
function preSignERC721Order(bytes32 orderHash)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @dev Checks whether the given signature is valid for the
|
||||||
|
/// the given ERC721 order. Reverts if not.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @param signature The signature to validate.
|
||||||
|
function validateERC721OrderSignature(
|
||||||
|
LibERC721Order.ERC721Order calldata order,
|
||||||
|
LibSignature.Signature calldata signature
|
||||||
|
)
|
||||||
|
external
|
||||||
|
view;
|
||||||
|
|
||||||
|
/// @dev If the given order is buying an ERC721 asset, checks
|
||||||
|
/// whether or not the given token ID satisfies the required
|
||||||
|
/// properties specified in the order. If the order does not
|
||||||
|
/// specify any properties, this function instead checks
|
||||||
|
/// whether the given token ID matches the ID in the order.
|
||||||
|
/// Reverts if any checks fail, or if the order is selling
|
||||||
|
/// an ERC721 asset.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @param erc721TokenId The ID of the ERC721 asset.
|
||||||
|
function validateERC721OrderProperties(
|
||||||
|
LibERC721Order.ERC721Order calldata order,
|
||||||
|
uint256 erc721TokenId
|
||||||
|
)
|
||||||
|
external
|
||||||
|
view;
|
||||||
|
|
||||||
|
/// @dev Get the current status of an ERC721 order.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @return status The status of the order.
|
||||||
|
function getERC721OrderStatus(LibERC721Order.ERC721Order calldata order)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (LibERC721Order.OrderStatus status);
|
||||||
|
|
||||||
|
/// @dev Get the canonical hash of an ERC721 order.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @return orderHash The order hash.
|
||||||
|
function getERC721OrderHash(LibERC721Order.ERC721Order calldata order)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (bytes32 orderHash);
|
||||||
|
|
||||||
|
/// @dev Get the order status bit vector for the given
|
||||||
|
/// maker address and nonce range.
|
||||||
|
/// @param maker The maker of the order.
|
||||||
|
/// @param nonceRange Order status bit vectors are indexed
|
||||||
|
/// by maker address and the upper 248 bits of the
|
||||||
|
/// order nonce. We define `nonceRange` to be these
|
||||||
|
/// 248 bits.
|
||||||
|
/// @return bitVector The order status bit vector for the
|
||||||
|
/// given maker and nonce range.
|
||||||
|
function getERC721OrderStatusBitVector(address maker, uint248 nonceRange)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (uint256 bitVector);
|
||||||
|
}
|
||||||
269
contracts/zero-ex/contracts/src/features/libs/LibERC721Order.sol
Normal file
269
contracts/zero-ex/contracts/src/features/libs/LibERC721Order.sol
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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/IERC20TokenV06.sol";
|
||||||
|
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
|
||||||
|
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
|
||||||
|
import "../../vendor/IERC721Token.sol";
|
||||||
|
import "../../vendor/IPropertyValidator.sol";
|
||||||
|
|
||||||
|
|
||||||
|
/// @dev A library for common ERC721 order operations.
|
||||||
|
library LibERC721Order {
|
||||||
|
using LibSafeMathV06 for uint256;
|
||||||
|
using LibRichErrorsV06 for bytes;
|
||||||
|
|
||||||
|
enum OrderStatus {
|
||||||
|
INVALID,
|
||||||
|
FILLABLE,
|
||||||
|
UNFILLABLE,
|
||||||
|
EXPIRED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum TradeDirection {
|
||||||
|
SELL_721,
|
||||||
|
BUY_721
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Property {
|
||||||
|
IPropertyValidator propertyValidator;
|
||||||
|
bytes propertyData;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Fee {
|
||||||
|
address recipient;
|
||||||
|
uint256 amount;
|
||||||
|
bytes feeData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev An ERC721<>ERC20 limit order.
|
||||||
|
struct ERC721Order {
|
||||||
|
TradeDirection direction;
|
||||||
|
IERC20TokenV06 erc20Token;
|
||||||
|
uint256 erc20TokenAmount;
|
||||||
|
IERC721Token erc721Token;
|
||||||
|
uint256 erc721TokenId;
|
||||||
|
Property[] erc721TokenProperties;
|
||||||
|
Fee[] fees;
|
||||||
|
address maker;
|
||||||
|
address taker;
|
||||||
|
uint256 expiry;
|
||||||
|
uint256 nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The type hash for ERC721 orders, which is:
|
||||||
|
// keccak256(abi.encodePacked(
|
||||||
|
// "ERC721Order(",
|
||||||
|
// "uint8 direction,",
|
||||||
|
// "address erc20Token,",
|
||||||
|
// "uint256 erc20TokenAmount,",
|
||||||
|
// "address erc721Token,",
|
||||||
|
// "uint256 erc721TokenId,",
|
||||||
|
// "Property[] erc721TokenProperties,",
|
||||||
|
// "Fee[] fees,",
|
||||||
|
// "address maker,",
|
||||||
|
// "address taker,",
|
||||||
|
// "uint256 expiry,",
|
||||||
|
// "uint256 nonce",
|
||||||
|
// ")",
|
||||||
|
// "Fee(",
|
||||||
|
// "address recipient,",
|
||||||
|
// "uint256 amount,",
|
||||||
|
// "bytes feeData",
|
||||||
|
// ")",
|
||||||
|
// "Property(",
|
||||||
|
// "address propertyValidator,",
|
||||||
|
// "bytes propertyData",
|
||||||
|
// ")"
|
||||||
|
// ))
|
||||||
|
uint256 private constant _ERC_721_ORDER_TYPEHASH =
|
||||||
|
0x7af652c2504c5c7d806f4f25edc3762dd8478099f694981f8802db656a9ba9d8;
|
||||||
|
|
||||||
|
// keccak256(abi.encodePacked(
|
||||||
|
// "Fee(",
|
||||||
|
// "address recipient,",
|
||||||
|
// "uint256 amount,",
|
||||||
|
// "bytes feeData",
|
||||||
|
// ")"
|
||||||
|
// ))
|
||||||
|
uint256 private constant _FEE_TYPEHASH =
|
||||||
|
0xe68c29f1b4e8cce0bbcac76eb1334bdc1dc1f293a517c90e9e532340e1e94115;
|
||||||
|
|
||||||
|
// keccak256(abi.encodePacked(
|
||||||
|
// "Property(",
|
||||||
|
// "address propertyValidator,",
|
||||||
|
// "bytes propertyData",
|
||||||
|
// ")"
|
||||||
|
// ))
|
||||||
|
uint256 private constant _PROPERTY_TYPEHASH =
|
||||||
|
0x6292cf854241cb36887e639065eca63b3af9f7f70270cebeda4c29b6d3bc65e8;
|
||||||
|
|
||||||
|
// keccak256("");
|
||||||
|
bytes32 private constant _EMPTY_ARRAY_KECCAK256 =
|
||||||
|
0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
|
||||||
|
|
||||||
|
// keccak256(abi.encodePacked(keccak256(abi.encode(
|
||||||
|
// _PROPERTY_TYPEHASH,
|
||||||
|
// address(0),
|
||||||
|
// keccak256("")
|
||||||
|
// ))));
|
||||||
|
bytes32 private constant _NULL_PROPERTY_STRUCT_HASH =
|
||||||
|
0x720ee400a9024f6a49768142c339bf09d2dd9056ab52d20fbe7165faba6e142d;
|
||||||
|
|
||||||
|
uint256 private constant ADDRESS_MASK = (1 << 160) - 1;
|
||||||
|
|
||||||
|
/// @dev Get the struct hash of an ERC721 order.
|
||||||
|
/// @param order The ERC721 order.
|
||||||
|
/// @return structHash The struct hash of the order.
|
||||||
|
function getERC721OrderStructHash(ERC721Order memory order)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes32 structHash)
|
||||||
|
{
|
||||||
|
// We give `order.erc721TokenProperties.length == 0` and
|
||||||
|
// `order.erc721TokenProperties.length == 1` special treatment
|
||||||
|
// because we expect these to be the most common.
|
||||||
|
bytes32 propertiesHash;
|
||||||
|
if (order.erc721TokenProperties.length == 0) {
|
||||||
|
propertiesHash = _EMPTY_ARRAY_KECCAK256;
|
||||||
|
} else if (order.erc721TokenProperties.length == 1) {
|
||||||
|
Property memory property = order
|
||||||
|
.erc721TokenProperties[0];
|
||||||
|
if (
|
||||||
|
address(property.propertyValidator) == address(0) &&
|
||||||
|
property.propertyData.length == 0
|
||||||
|
) {
|
||||||
|
propertiesHash = _NULL_PROPERTY_STRUCT_HASH;
|
||||||
|
} else {
|
||||||
|
// propertiesHash = keccak256(abi.encodePacked(keccak256(abi.encode(
|
||||||
|
// _PROPERTY_TYPEHASH,
|
||||||
|
// order.erc721TokenProperties[0].propertyValidator,
|
||||||
|
// keccak256(order.erc721TokenProperties[0].propertyData)
|
||||||
|
// ))));
|
||||||
|
bytes memory data = property.propertyData;
|
||||||
|
assembly {
|
||||||
|
// dataHash = keccak256(property.propertyData)
|
||||||
|
let dataHash := keccak256(add(data, 32), mload(data))
|
||||||
|
// Load free memory pointer
|
||||||
|
let mem := mload(64)
|
||||||
|
mstore(mem, _PROPERTY_TYPEHASH)
|
||||||
|
// property.propertyValidator
|
||||||
|
mstore(add(mem, 32), and(ADDRESS_MASK, mload(property)))
|
||||||
|
// keccak256(property.propertyData)
|
||||||
|
mstore(add(mem, 64), dataHash)
|
||||||
|
mstore(mem, keccak256(mem, 96))
|
||||||
|
propertiesHash := keccak256(mem, 32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bytes32[] memory propertyStructHashArray = new bytes32[](
|
||||||
|
order.erc721TokenProperties.length
|
||||||
|
);
|
||||||
|
for (uint256 i = 0; i < order.erc721TokenProperties.length; i++) {
|
||||||
|
propertyStructHashArray[i] = keccak256(abi.encode(
|
||||||
|
_PROPERTY_TYPEHASH,
|
||||||
|
order.erc721TokenProperties[i].propertyValidator,
|
||||||
|
keccak256(order.erc721TokenProperties[i].propertyData)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
propertiesHash = keccak256(abi.encodePacked(propertyStructHashArray));
|
||||||
|
}
|
||||||
|
|
||||||
|
// We give `order.fees.length == 0` and
|
||||||
|
// `order.fees.length == 1` special treatment
|
||||||
|
// because we expect these to be the most common.
|
||||||
|
bytes32 feesHash;
|
||||||
|
if (order.fees.length == 0) {
|
||||||
|
feesHash = _EMPTY_ARRAY_KECCAK256;
|
||||||
|
} else if (order.fees.length == 1) {
|
||||||
|
// feesHash = keccak256(abi.encodePacked(keccak256(abi.encode(
|
||||||
|
// _FEE_TYPEHASH,
|
||||||
|
// order.fees[0].recipient,
|
||||||
|
// order.fees[0].amount,
|
||||||
|
// keccak256(order.fees[0].feeData)
|
||||||
|
// ))));
|
||||||
|
Fee memory fee = order.fees[0];
|
||||||
|
bytes memory data = fee.feeData;
|
||||||
|
assembly {
|
||||||
|
// dataHash = keccak256(fee.feeData)
|
||||||
|
let dataHash := keccak256(add(data, 32), mload(data))
|
||||||
|
// Load free memory pointer
|
||||||
|
let mem := mload(64)
|
||||||
|
mstore(mem, _FEE_TYPEHASH)
|
||||||
|
// fee.recipient
|
||||||
|
mstore(add(mem, 32), and(ADDRESS_MASK, mload(fee)))
|
||||||
|
// fee.amount
|
||||||
|
mstore(add(mem, 64), mload(add(fee, 32)))
|
||||||
|
// keccak256(fee.feeData)
|
||||||
|
mstore(add(mem, 96), dataHash)
|
||||||
|
mstore(mem, keccak256(mem, 128))
|
||||||
|
feesHash := keccak256(mem, 32)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bytes32[] memory feeStructHashArray = new bytes32[](order.fees.length);
|
||||||
|
for (uint256 i = 0; i < order.fees.length; i++) {
|
||||||
|
feeStructHashArray[i] = keccak256(abi.encode(
|
||||||
|
_FEE_TYPEHASH,
|
||||||
|
order.fees[i].recipient,
|
||||||
|
order.fees[i].amount,
|
||||||
|
keccak256(order.fees[i].feeData)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
feesHash = keccak256(abi.encodePacked(feeStructHashArray));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hash in place, equivalent to:
|
||||||
|
// return keccak256(abi.encode(
|
||||||
|
// _ERC_721_ORDER_TYPEHASH,
|
||||||
|
// order.direction,
|
||||||
|
// order.erc20Token,
|
||||||
|
// order.erc20TokenAmount,
|
||||||
|
// order.erc721Token,
|
||||||
|
// order.erc721TokenId,
|
||||||
|
// propertiesHash,
|
||||||
|
// feesHash,
|
||||||
|
// order.maker,
|
||||||
|
// order.taker,
|
||||||
|
// order.expiry,
|
||||||
|
// order.nonce
|
||||||
|
// ));
|
||||||
|
assembly {
|
||||||
|
let pos1 := sub(order, 32)
|
||||||
|
let pos2 := add(order, 160)
|
||||||
|
let pos3 := add(order, 192)
|
||||||
|
|
||||||
|
let temp1 := mload(pos1)
|
||||||
|
let temp2 := mload(pos2)
|
||||||
|
let temp3 := mload(pos3)
|
||||||
|
|
||||||
|
mstore(pos1, _ERC_721_ORDER_TYPEHASH)
|
||||||
|
mstore(pos2, propertiesHash)
|
||||||
|
mstore(pos3, feesHash)
|
||||||
|
structHash := keccak256(pos1, 384)
|
||||||
|
|
||||||
|
mstore(pos1, temp1)
|
||||||
|
mstore(pos2, temp2)
|
||||||
|
mstore(pos3, temp3)
|
||||||
|
}
|
||||||
|
return structHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,7 +44,8 @@ library LibSignature {
|
|||||||
ILLEGAL,
|
ILLEGAL,
|
||||||
INVALID,
|
INVALID,
|
||||||
EIP712,
|
EIP712,
|
||||||
ETHSIGN
|
ETHSIGN,
|
||||||
|
PRESIGNED
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Encoded EC signature.
|
/// @dev Encoded EC signature.
|
||||||
@@ -146,6 +147,15 @@ library LibSignature {
|
|||||||
).rrevert();
|
).rrevert();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If a feature supports pre-signing, it wouldn't use
|
||||||
|
// `getSignerOfHash` on a pre-signed order.
|
||||||
|
if (signature.signatureType == SignatureType.PRESIGNED) {
|
||||||
|
LibSignatureRichErrors.SignatureValidationError(
|
||||||
|
LibSignatureRichErrors.SignatureValidationErrorCodes.UNSUPPORTED,
|
||||||
|
hash
|
||||||
|
).rrevert();
|
||||||
|
}
|
||||||
|
|
||||||
// Solidity should check that the signature type is within enum range for us
|
// Solidity should check that the signature type is within enum range for us
|
||||||
// when abi-decoding.
|
// when abi-decoding.
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -622,15 +622,6 @@ contract MultiplexFeature is
|
|||||||
_executeBatchSell(batchSellParams).boughtAmount;
|
_executeBatchSell(batchSellParams).boughtAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transfers some amount of ETH to the given recipient and
|
|
||||||
// reverts if the transfer fails.
|
|
||||||
function _transferEth(address payable recipient, uint256 amount)
|
|
||||||
private
|
|
||||||
{
|
|
||||||
(bool success,) = recipient.call{value: amount}("");
|
|
||||||
require(success, "MultiplexFeature::_transferEth/TRANSFER_FAILED");
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function computes the "target" address of hop index `i` within
|
// This function computes the "target" address of hop index `i` within
|
||||||
// a multi-hop sell.
|
// a multi-hop sell.
|
||||||
// If `i == 0`, the target is the address which should hold the input
|
// If `i == 0`, the target is the address which should hold the input
|
||||||
|
|||||||
@@ -62,6 +62,18 @@ abstract contract FixinCommon {
|
|||||||
_implementation = address(this);
|
_implementation = address(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @dev RichError equivalent of `require`.
|
||||||
|
/// @param condition If `condition` is false, this function will revert.
|
||||||
|
/// @param errorData ABI-encoded error data.
|
||||||
|
function rrequire(bool condition, bytes memory errorData)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
{
|
||||||
|
if (!condition) {
|
||||||
|
errorData.rrevert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// @dev Registers a function implemented by this feature at `_implementation`.
|
/// @dev Registers a function implemented by this feature at `_implementation`.
|
||||||
/// Can and should only be called within a `migrate()`.
|
/// Can and should only be called within a `migrate()`.
|
||||||
/// @param selector The selector of the function whose implementation
|
/// @param selector The selector of the function whose implementation
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
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/LibSafeMathV06.sol";
|
||||||
|
import "../vendor/IERC721Token.sol";
|
||||||
|
|
||||||
|
|
||||||
|
/// @dev Helpers for moving ERC721 assets around.
|
||||||
|
abstract contract FixinERC721Spender {
|
||||||
|
|
||||||
|
// Mask of the lower 20 bytes of a bytes32.
|
||||||
|
uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
|
||||||
|
|
||||||
|
/// @dev Transfers an ERC721 asset from `owner` to `to`.
|
||||||
|
/// @param token The address of the ERC721 token contract.
|
||||||
|
/// @param owner The owner of the asset.
|
||||||
|
/// @param to The recipient of the asset.
|
||||||
|
/// @param tokenId The token ID of the asset to transfer.
|
||||||
|
function _transferERC721AssetFrom(
|
||||||
|
IERC721Token token,
|
||||||
|
address owner,
|
||||||
|
address to,
|
||||||
|
uint256 tokenId
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
{
|
||||||
|
require(address(token) != address(this), "FixinERC721Spender/CANNOT_INVOKE_SELF");
|
||||||
|
|
||||||
|
assembly {
|
||||||
|
let ptr := mload(0x40) // free memory pointer
|
||||||
|
|
||||||
|
// selector for transferFrom(address,address,uint256)
|
||||||
|
mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
|
||||||
|
mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK))
|
||||||
|
mstore(add(ptr, 0x24), and(to, ADDRESS_MASK))
|
||||||
|
mstore(add(ptr, 0x44), tokenId)
|
||||||
|
|
||||||
|
let success := call(
|
||||||
|
gas(),
|
||||||
|
and(token, ADDRESS_MASK),
|
||||||
|
0,
|
||||||
|
ptr,
|
||||||
|
0x64,
|
||||||
|
ptr,
|
||||||
|
32
|
||||||
|
)
|
||||||
|
|
||||||
|
let rdsize := returndatasize()
|
||||||
|
if iszero(success) {
|
||||||
|
returndatacopy(ptr, 0, rdsize)
|
||||||
|
revert(ptr, rdsize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
pragma solidity ^0.6.5;
|
pragma solidity ^0.6.5;
|
||||||
pragma experimental ABIEncoderV2;
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
|
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
||||||
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
|
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
|
||||||
|
|
||||||
|
|
||||||
@@ -141,6 +141,18 @@ abstract contract FixinTokenSpender {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @dev Transfers some amount of ETH to the given recipient and
|
||||||
|
/// reverts if the transfer fails.
|
||||||
|
/// @param recipient The recipient of the ETH.
|
||||||
|
/// @param amount The amount of ETH to transfer.
|
||||||
|
function _transferEth(address payable recipient, uint256 amount)
|
||||||
|
internal
|
||||||
|
{
|
||||||
|
(bool success,) = recipient.call{value: amount}("");
|
||||||
|
require(success, "FixinTokenSpender::_transferEth/TRANSFER_FAILED");
|
||||||
|
}
|
||||||
|
|
||||||
/// @dev Gets the maximum amount of an ERC20 token `token` that can be
|
/// @dev Gets the maximum amount of an ERC20 token `token` that can be
|
||||||
/// pulled from `owner` by this address.
|
/// pulled from `owner` by this address.
|
||||||
/// @param token The token to spend.
|
/// @param token The token to spend.
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
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 "./LibStorage.sol";
|
||||||
|
|
||||||
|
|
||||||
|
/// @dev Storage helpers for `ERC721OrdersFeature`.
|
||||||
|
library LibERC721OrdersStorage {
|
||||||
|
|
||||||
|
/// @dev Storage bucket for this feature.
|
||||||
|
struct Storage {
|
||||||
|
// maker => nonce range => order status bit vector
|
||||||
|
mapping(address => mapping(uint248 => uint256)) orderStatusByMaker;
|
||||||
|
// order hash => maker => isSigned
|
||||||
|
mapping(bytes32 => mapping(address => bool)) preSigned;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Get the storage bucket for this contract.
|
||||||
|
function getStorage() internal pure returns (Storage storage stor) {
|
||||||
|
uint256 storageSlot = LibStorage.getStorageSlot(
|
||||||
|
LibStorage.StorageId.ERC721Orders
|
||||||
|
);
|
||||||
|
// Dip into assembly to change the slot pointed to by the local
|
||||||
|
// variable `stor`.
|
||||||
|
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
|
||||||
|
assembly { stor_slot := storageSlot }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,7 +39,8 @@ library LibStorage {
|
|||||||
MetaTransactions,
|
MetaTransactions,
|
||||||
ReentrancyGuard,
|
ReentrancyGuard,
|
||||||
NativeOrders,
|
NativeOrders,
|
||||||
OtcOrders
|
OtcOrders,
|
||||||
|
ERC721Orders
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Get the storage slot given a storage ID. We assign unique, well-spaced
|
/// @dev Get the storage slot given a storage ID. We assign unique, well-spaced
|
||||||
|
|||||||
34
contracts/zero-ex/contracts/src/vendor/IERC721OrderCallback.sol
vendored
Normal file
34
contracts/zero-ex/contracts/src/vendor/IERC721OrderCallback.sol
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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;
|
||||||
|
|
||||||
|
|
||||||
|
interface IERC721OrderCallback {
|
||||||
|
|
||||||
|
/// @dev A taker callback function invoked in the ERC721Feature between
|
||||||
|
/// the maker -> taker transfer and the taker -> maker transfer.
|
||||||
|
/// @param callbackData Arbitrary data used by this callback.
|
||||||
|
/// @return success The selector of this function (0x6d46db51),
|
||||||
|
/// indicating that the callback succeeded.
|
||||||
|
function zeroExERC721OrderCallback(bytes calldata callbackData)
|
||||||
|
external
|
||||||
|
returns (bytes4 success);
|
||||||
|
}
|
||||||
159
contracts/zero-ex/contracts/src/vendor/IERC721Token.sol
vendored
Normal file
159
contracts/zero-ex/contracts/src/vendor/IERC721Token.sol
vendored
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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 IERC721Token {
|
||||||
|
|
||||||
|
/// @dev This emits when ownership of any NFT changes by any mechanism.
|
||||||
|
/// This event emits when NFTs are created (`from` == 0) and destroyed
|
||||||
|
/// (`to` == 0). Exception: during contract creation, any number of NFTs
|
||||||
|
/// may be created and assigned without emitting Transfer. At the time of
|
||||||
|
/// any transfer, the approved address for that NFT (if any) is reset to none.
|
||||||
|
event Transfer(
|
||||||
|
address indexed _from,
|
||||||
|
address indexed _to,
|
||||||
|
uint256 indexed _tokenId
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @dev This emits when the approved address for an NFT is changed or
|
||||||
|
/// reaffirmed. The zero address indicates there is no approved address.
|
||||||
|
/// When a Transfer event emits, this also indicates that the approved
|
||||||
|
/// address for that NFT (if any) is reset to none.
|
||||||
|
event Approval(
|
||||||
|
address indexed _owner,
|
||||||
|
address indexed _approved,
|
||||||
|
uint256 indexed _tokenId
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @dev This emits when an operator is enabled or disabled for an owner.
|
||||||
|
/// The operator can manage all NFTs of the owner.
|
||||||
|
event ApprovalForAll(
|
||||||
|
address indexed _owner,
|
||||||
|
address indexed _operator,
|
||||||
|
bool _approved
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @notice Transfers the ownership of an NFT from one address to another address
|
||||||
|
/// @dev Throws unless `msg.sender` is the current owner, an authorized
|
||||||
|
/// perator, or the approved address for this NFT. Throws if `_from` is
|
||||||
|
/// not the current owner. Throws if `_to` is the zero address. Throws if
|
||||||
|
/// `_tokenId` is not a valid NFT. When transfer is complete, this function
|
||||||
|
/// checks if `_to` is a smart contract (code size > 0). If so, it calls
|
||||||
|
/// `onERC721Received` on `_to` and throws if the return value is not
|
||||||
|
/// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
|
||||||
|
/// @param _from The current owner of the NFT
|
||||||
|
/// @param _to The new owner
|
||||||
|
/// @param _tokenId The NFT to transfer
|
||||||
|
/// @param _data Additional data with no specified format, sent in call to `_to`
|
||||||
|
function safeTransferFrom(
|
||||||
|
address _from,
|
||||||
|
address _to,
|
||||||
|
uint256 _tokenId,
|
||||||
|
bytes calldata _data
|
||||||
|
)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @notice Transfers the ownership of an NFT from one address to another address
|
||||||
|
/// @dev This works identically to the other function with an extra data parameter,
|
||||||
|
/// except this function just sets data to "".
|
||||||
|
/// @param _from The current owner of the NFT
|
||||||
|
/// @param _to The new owner
|
||||||
|
/// @param _tokenId The NFT to transfer
|
||||||
|
function safeTransferFrom(
|
||||||
|
address _from,
|
||||||
|
address _to,
|
||||||
|
uint256 _tokenId
|
||||||
|
)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @notice Change or reaffirm the approved address for an NFT
|
||||||
|
/// @dev The zero address indicates there is no approved address.
|
||||||
|
/// Throws unless `msg.sender` is the current NFT owner, or an authorized
|
||||||
|
/// operator of the current owner.
|
||||||
|
/// @param _approved The new approved NFT controller
|
||||||
|
/// @param _tokenId The NFT to approve
|
||||||
|
function approve(address _approved, uint256 _tokenId)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @notice Enable or disable approval for a third party ("operator") to manage
|
||||||
|
/// all of `msg.sender`'s assets
|
||||||
|
/// @dev Emits the ApprovalForAll event. The contract MUST allow
|
||||||
|
/// multiple operators per owner.
|
||||||
|
/// @param _operator Address to add to the set of authorized operators
|
||||||
|
/// @param _approved True if the operator is approved, false to revoke approval
|
||||||
|
function setApprovalForAll(address _operator, bool _approved)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @notice Count all NFTs assigned to an owner
|
||||||
|
/// @dev NFTs assigned to the zero address are considered invalid, and this
|
||||||
|
/// function throws for queries about the zero address.
|
||||||
|
/// @param _owner An address for whom to query the balance
|
||||||
|
/// @return The number of NFTs owned by `_owner`, possibly zero
|
||||||
|
function balanceOf(address _owner)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (uint256);
|
||||||
|
|
||||||
|
/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
|
||||||
|
/// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
|
||||||
|
/// THEY MAY BE PERMANENTLY LOST
|
||||||
|
/// @dev Throws unless `msg.sender` is the current owner, an authorized
|
||||||
|
/// operator, or the approved address for this NFT. Throws if `_from` is
|
||||||
|
/// not the current owner. Throws if `_to` is the zero address. Throws if
|
||||||
|
/// `_tokenId` is not a valid NFT.
|
||||||
|
/// @param _from The current owner of the NFT
|
||||||
|
/// @param _to The new owner
|
||||||
|
/// @param _tokenId The NFT to transfer
|
||||||
|
function transferFrom(
|
||||||
|
address _from,
|
||||||
|
address _to,
|
||||||
|
uint256 _tokenId
|
||||||
|
)
|
||||||
|
external;
|
||||||
|
|
||||||
|
/// @notice Find the owner of an NFT
|
||||||
|
/// @dev NFTs assigned to zero address are considered invalid, and queries
|
||||||
|
/// about them do throw.
|
||||||
|
/// @param _tokenId The identifier for an NFT
|
||||||
|
/// @return The address of the owner of the NFT
|
||||||
|
function ownerOf(uint256 _tokenId)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (address);
|
||||||
|
|
||||||
|
/// @notice Get the approved address for a single NFT
|
||||||
|
/// @dev Throws if `_tokenId` is not a valid NFT.
|
||||||
|
/// @param _tokenId The NFT to find the approved address for
|
||||||
|
/// @return The approved address for this NFT, or the zero address if there is none
|
||||||
|
function getApproved(uint256 _tokenId)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (address);
|
||||||
|
|
||||||
|
/// @notice Query if an address is an authorized operator for another address
|
||||||
|
/// @param _owner The address that owns the NFTs
|
||||||
|
/// @param _operator The address that acts on behalf of the owner
|
||||||
|
/// @return True if `_operator` is an approved operator for `_owner`, false otherwise
|
||||||
|
function isApprovedForAll(address _owner, address _operator)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (bool);
|
||||||
|
}
|
||||||
44
contracts/zero-ex/contracts/src/vendor/IFeeRecipient.sol
vendored
Normal file
44
contracts/zero-ex/contracts/src/vendor/IFeeRecipient.sol
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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;
|
||||||
|
|
||||||
|
|
||||||
|
interface IFeeRecipient {
|
||||||
|
|
||||||
|
/// @dev A callback function invoked in the ERC721Feature for each ERC721
|
||||||
|
/// order fee that get paid. Integrators can make use of this callback
|
||||||
|
/// to implement arbitrary fee-handling logic, e.g. splitting the fee
|
||||||
|
/// between multiple parties.
|
||||||
|
/// @param tokenAddress The address of the token in which the received fee is
|
||||||
|
/// denominated. `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` indicates
|
||||||
|
/// that the fee was paid in the native token (e.g. ETH).
|
||||||
|
/// @param amount The amount of the given token received.
|
||||||
|
/// @param feeData Arbitrary data encoded in the `Fee` used by this callback.
|
||||||
|
/// @return success The selector of this function (0x0190805e),
|
||||||
|
/// indicating that the callback succeeded.
|
||||||
|
function receiveFeeCallback(
|
||||||
|
address tokenAddress,
|
||||||
|
uint256 amount,
|
||||||
|
bytes calldata feeData
|
||||||
|
)
|
||||||
|
external
|
||||||
|
returns (bytes4 success);
|
||||||
|
}
|
||||||
38
contracts/zero-ex/contracts/src/vendor/IPropertyValidator.sol
vendored
Normal file
38
contracts/zero-ex/contracts/src/vendor/IPropertyValidator.sol
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2021 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;
|
||||||
|
|
||||||
|
|
||||||
|
interface IPropertyValidator {
|
||||||
|
|
||||||
|
/// @dev Checks that the given ERC721/ERC1155 asset satisfies the properties encoded in `propertyData`.
|
||||||
|
/// Should revert if the asset does not satisfy the specified properties.
|
||||||
|
/// @param tokenAddress The ERC721/ERC1155 token contract address.
|
||||||
|
/// @param tokenId The ERC721/ERC1155 tokenId of the asset to check.
|
||||||
|
/// @param propertyData Encoded properties or auxiliary data needed to perform the check.
|
||||||
|
function validateProperty(
|
||||||
|
address tokenAddress,
|
||||||
|
uint256 tokenId,
|
||||||
|
bytes calldata propertyData
|
||||||
|
)
|
||||||
|
external
|
||||||
|
view;
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-zero-ex",
|
"name": "@0x/contracts-zero-ex",
|
||||||
"version": "0.30.0",
|
"version": "0.30.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,PositiveSlippageFeeTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,AffiliateFeeTransformer,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature,ILiquidityProviderFeature,NativeOrdersFeature,INativeOrdersFeature,FeeCollectorController,FeeCollector,CurveLiquidityProvider,BatchFillNativeOrdersFeature,IBatchFillNativeOrdersFeature,MultiplexFeature,IMultiplexFeature,OtcOrdersFeature,IOtcOrdersFeature",
|
"publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,PositiveSlippageFeeTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,AffiliateFeeTransformer,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature,ILiquidityProviderFeature,NativeOrdersFeature,INativeOrdersFeature,FeeCollectorController,FeeCollector,CurveLiquidityProvider,BatchFillNativeOrdersFeature,IBatchFillNativeOrdersFeature,MultiplexFeature,IMultiplexFeature,OtcOrdersFeature,IOtcOrdersFeature",
|
||||||
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
|
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
|
||||||
"abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IFeature|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinAaveV2|MixinBalancer|MixinBalancerV2|MixinBancor|MixinCoFiX|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json"
|
"abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|ERC721OrdersFeature|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinERC721Spender|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IERC721OrderCallback|IERC721OrdersFeature|IERC721Token|IFeature|IFeeRecipient|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|IPropertyValidator|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibERC721Order|LibERC721OrdersRichErrors|LibERC721OrdersStorage|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinAaveV2|MixinBalancer|MixinBalancerV2|MixinBancor|MixinCoFiX|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -56,10 +56,10 @@
|
|||||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/zero-ex",
|
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/zero-ex",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^5.6.2",
|
"@0x/abi-gen": "^5.6.2",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/contracts-erc20": "^3.3.24",
|
"@0x/contracts-erc20": "^3.3.25",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.40",
|
||||||
"@0x/contracts-test-utils": "^5.4.15",
|
"@0x/contracts-test-utils": "^5.4.16",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^4.2.9",
|
||||||
"@0x/order-utils": "^10.4.28",
|
"@0x/order-utils": "^10.4.28",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.7.5",
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^6.4.2",
|
||||||
"@0x/protocol-utils": "^1.10.0",
|
"@0x/protocol-utils": "^1.10.1",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/subproviders": "^6.6.0",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/types": "^3.3.4",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/typescript-typings": "^5.2.1",
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ import * as BootstrapFeature from '../test/generated-artifacts/BootstrapFeature.
|
|||||||
import * as BridgeAdapter from '../test/generated-artifacts/BridgeAdapter.json';
|
import * as BridgeAdapter from '../test/generated-artifacts/BridgeAdapter.json';
|
||||||
import * as BridgeProtocols from '../test/generated-artifacts/BridgeProtocols.json';
|
import * as BridgeProtocols from '../test/generated-artifacts/BridgeProtocols.json';
|
||||||
import * as CurveLiquidityProvider from '../test/generated-artifacts/CurveLiquidityProvider.json';
|
import * as CurveLiquidityProvider from '../test/generated-artifacts/CurveLiquidityProvider.json';
|
||||||
|
import * as ERC721OrdersFeature from '../test/generated-artifacts/ERC721OrdersFeature.json';
|
||||||
import * as FeeCollector from '../test/generated-artifacts/FeeCollector.json';
|
import * as FeeCollector from '../test/generated-artifacts/FeeCollector.json';
|
||||||
import * as FeeCollectorController from '../test/generated-artifacts/FeeCollectorController.json';
|
import * as FeeCollectorController from '../test/generated-artifacts/FeeCollectorController.json';
|
||||||
import * as FillQuoteTransformer from '../test/generated-artifacts/FillQuoteTransformer.json';
|
import * as FillQuoteTransformer from '../test/generated-artifacts/FillQuoteTransformer.json';
|
||||||
import * as FixinCommon from '../test/generated-artifacts/FixinCommon.json';
|
import * as FixinCommon from '../test/generated-artifacts/FixinCommon.json';
|
||||||
import * as FixinEIP712 from '../test/generated-artifacts/FixinEIP712.json';
|
import * as FixinEIP712 from '../test/generated-artifacts/FixinEIP712.json';
|
||||||
|
import * as FixinERC721Spender from '../test/generated-artifacts/FixinERC721Spender.json';
|
||||||
import * as FixinProtocolFees from '../test/generated-artifacts/FixinProtocolFees.json';
|
import * as FixinProtocolFees from '../test/generated-artifacts/FixinProtocolFees.json';
|
||||||
import * as FixinReentrancyGuard from '../test/generated-artifacts/FixinReentrancyGuard.json';
|
import * as FixinReentrancyGuard from '../test/generated-artifacts/FixinReentrancyGuard.json';
|
||||||
import * as FixinTokenSpender from '../test/generated-artifacts/FixinTokenSpender.json';
|
import * as FixinTokenSpender from '../test/generated-artifacts/FixinTokenSpender.json';
|
||||||
@@ -27,7 +29,11 @@ import * as IBootstrapFeature from '../test/generated-artifacts/IBootstrapFeatur
|
|||||||
import * as IBridgeAdapter from '../test/generated-artifacts/IBridgeAdapter.json';
|
import * as IBridgeAdapter from '../test/generated-artifacts/IBridgeAdapter.json';
|
||||||
import * as IERC20Bridge from '../test/generated-artifacts/IERC20Bridge.json';
|
import * as IERC20Bridge from '../test/generated-artifacts/IERC20Bridge.json';
|
||||||
import * as IERC20Transformer from '../test/generated-artifacts/IERC20Transformer.json';
|
import * as IERC20Transformer from '../test/generated-artifacts/IERC20Transformer.json';
|
||||||
|
import * as IERC721OrderCallback from '../test/generated-artifacts/IERC721OrderCallback.json';
|
||||||
|
import * as IERC721OrdersFeature from '../test/generated-artifacts/IERC721OrdersFeature.json';
|
||||||
|
import * as IERC721Token from '../test/generated-artifacts/IERC721Token.json';
|
||||||
import * as IFeature from '../test/generated-artifacts/IFeature.json';
|
import * as IFeature from '../test/generated-artifacts/IFeature.json';
|
||||||
|
import * as IFeeRecipient from '../test/generated-artifacts/IFeeRecipient.json';
|
||||||
import * as IFlashWallet from '../test/generated-artifacts/IFlashWallet.json';
|
import * as IFlashWallet from '../test/generated-artifacts/IFlashWallet.json';
|
||||||
import * as IFundRecoveryFeature from '../test/generated-artifacts/IFundRecoveryFeature.json';
|
import * as IFundRecoveryFeature from '../test/generated-artifacts/IFundRecoveryFeature.json';
|
||||||
import * as ILiquidityProvider from '../test/generated-artifacts/ILiquidityProvider.json';
|
import * as ILiquidityProvider from '../test/generated-artifacts/ILiquidityProvider.json';
|
||||||
@@ -42,6 +48,7 @@ import * as InitialMigration from '../test/generated-artifacts/InitialMigration.
|
|||||||
import * as IOtcOrdersFeature from '../test/generated-artifacts/IOtcOrdersFeature.json';
|
import * as IOtcOrdersFeature from '../test/generated-artifacts/IOtcOrdersFeature.json';
|
||||||
import * as IOwnableFeature from '../test/generated-artifacts/IOwnableFeature.json';
|
import * as IOwnableFeature from '../test/generated-artifacts/IOwnableFeature.json';
|
||||||
import * as IPancakeSwapFeature from '../test/generated-artifacts/IPancakeSwapFeature.json';
|
import * as IPancakeSwapFeature from '../test/generated-artifacts/IPancakeSwapFeature.json';
|
||||||
|
import * as IPropertyValidator from '../test/generated-artifacts/IPropertyValidator.json';
|
||||||
import * as ISimpleFunctionRegistryFeature from '../test/generated-artifacts/ISimpleFunctionRegistryFeature.json';
|
import * as ISimpleFunctionRegistryFeature from '../test/generated-artifacts/ISimpleFunctionRegistryFeature.json';
|
||||||
import * as IStaking from '../test/generated-artifacts/IStaking.json';
|
import * as IStaking from '../test/generated-artifacts/IStaking.json';
|
||||||
import * as ITestSimpleFunctionRegistryFeature from '../test/generated-artifacts/ITestSimpleFunctionRegistryFeature.json';
|
import * as ITestSimpleFunctionRegistryFeature from '../test/generated-artifacts/ITestSimpleFunctionRegistryFeature.json';
|
||||||
@@ -55,6 +62,9 @@ import * as IZeroEx from '../test/generated-artifacts/IZeroEx.json';
|
|||||||
import * as LibBootstrap from '../test/generated-artifacts/LibBootstrap.json';
|
import * as LibBootstrap from '../test/generated-artifacts/LibBootstrap.json';
|
||||||
import * as LibCommonRichErrors from '../test/generated-artifacts/LibCommonRichErrors.json';
|
import * as LibCommonRichErrors from '../test/generated-artifacts/LibCommonRichErrors.json';
|
||||||
import * as LibERC20Transformer from '../test/generated-artifacts/LibERC20Transformer.json';
|
import * as LibERC20Transformer from '../test/generated-artifacts/LibERC20Transformer.json';
|
||||||
|
import * as LibERC721Order from '../test/generated-artifacts/LibERC721Order.json';
|
||||||
|
import * as LibERC721OrdersRichErrors from '../test/generated-artifacts/LibERC721OrdersRichErrors.json';
|
||||||
|
import * as LibERC721OrdersStorage from '../test/generated-artifacts/LibERC721OrdersStorage.json';
|
||||||
import * as LibFeeCollector from '../test/generated-artifacts/LibFeeCollector.json';
|
import * as LibFeeCollector from '../test/generated-artifacts/LibFeeCollector.json';
|
||||||
import * as LibLiquidityProviderRichErrors from '../test/generated-artifacts/LibLiquidityProviderRichErrors.json';
|
import * as LibLiquidityProviderRichErrors from '../test/generated-artifacts/LibLiquidityProviderRichErrors.json';
|
||||||
import * as LibMetaTransactionsRichErrors from '../test/generated-artifacts/LibMetaTransactionsRichErrors.json';
|
import * as LibMetaTransactionsRichErrors from '../test/generated-artifacts/LibMetaTransactionsRichErrors.json';
|
||||||
@@ -181,6 +191,7 @@ export const artifacts = {
|
|||||||
ZeroEx: ZeroEx as ContractArtifact,
|
ZeroEx: ZeroEx as ContractArtifact,
|
||||||
ZeroExOptimized: ZeroExOptimized as ContractArtifact,
|
ZeroExOptimized: ZeroExOptimized as ContractArtifact,
|
||||||
LibCommonRichErrors: LibCommonRichErrors as ContractArtifact,
|
LibCommonRichErrors: LibCommonRichErrors as ContractArtifact,
|
||||||
|
LibERC721OrdersRichErrors: LibERC721OrdersRichErrors as ContractArtifact,
|
||||||
LibLiquidityProviderRichErrors: LibLiquidityProviderRichErrors as ContractArtifact,
|
LibLiquidityProviderRichErrors: LibLiquidityProviderRichErrors as ContractArtifact,
|
||||||
LibMetaTransactionsRichErrors: LibMetaTransactionsRichErrors as ContractArtifact,
|
LibMetaTransactionsRichErrors: LibMetaTransactionsRichErrors as ContractArtifact,
|
||||||
LibNativeOrdersRichErrors: LibNativeOrdersRichErrors as ContractArtifact,
|
LibNativeOrdersRichErrors: LibNativeOrdersRichErrors as ContractArtifact,
|
||||||
@@ -201,6 +212,7 @@ export const artifacts = {
|
|||||||
TransformerDeployer: TransformerDeployer as ContractArtifact,
|
TransformerDeployer: TransformerDeployer as ContractArtifact,
|
||||||
BatchFillNativeOrdersFeature: BatchFillNativeOrdersFeature as ContractArtifact,
|
BatchFillNativeOrdersFeature: BatchFillNativeOrdersFeature as ContractArtifact,
|
||||||
BootstrapFeature: BootstrapFeature as ContractArtifact,
|
BootstrapFeature: BootstrapFeature as ContractArtifact,
|
||||||
|
ERC721OrdersFeature: ERC721OrdersFeature as ContractArtifact,
|
||||||
FundRecoveryFeature: FundRecoveryFeature as ContractArtifact,
|
FundRecoveryFeature: FundRecoveryFeature as ContractArtifact,
|
||||||
LiquidityProviderFeature: LiquidityProviderFeature as ContractArtifact,
|
LiquidityProviderFeature: LiquidityProviderFeature as ContractArtifact,
|
||||||
MetaTransactionsFeature: MetaTransactionsFeature as ContractArtifact,
|
MetaTransactionsFeature: MetaTransactionsFeature as ContractArtifact,
|
||||||
@@ -214,6 +226,7 @@ export const artifacts = {
|
|||||||
UniswapV3Feature: UniswapV3Feature as ContractArtifact,
|
UniswapV3Feature: UniswapV3Feature as ContractArtifact,
|
||||||
IBatchFillNativeOrdersFeature: IBatchFillNativeOrdersFeature as ContractArtifact,
|
IBatchFillNativeOrdersFeature: IBatchFillNativeOrdersFeature as ContractArtifact,
|
||||||
IBootstrapFeature: IBootstrapFeature as ContractArtifact,
|
IBootstrapFeature: IBootstrapFeature as ContractArtifact,
|
||||||
|
IERC721OrdersFeature: IERC721OrdersFeature as ContractArtifact,
|
||||||
IFeature: IFeature as ContractArtifact,
|
IFeature: IFeature as ContractArtifact,
|
||||||
IFundRecoveryFeature: IFundRecoveryFeature as ContractArtifact,
|
IFundRecoveryFeature: IFundRecoveryFeature as ContractArtifact,
|
||||||
ILiquidityProviderFeature: ILiquidityProviderFeature as ContractArtifact,
|
ILiquidityProviderFeature: ILiquidityProviderFeature as ContractArtifact,
|
||||||
@@ -229,6 +242,7 @@ export const artifacts = {
|
|||||||
ITransformERC20Feature: ITransformERC20Feature as ContractArtifact,
|
ITransformERC20Feature: ITransformERC20Feature as ContractArtifact,
|
||||||
IUniswapFeature: IUniswapFeature as ContractArtifact,
|
IUniswapFeature: IUniswapFeature as ContractArtifact,
|
||||||
IUniswapV3Feature: IUniswapV3Feature as ContractArtifact,
|
IUniswapV3Feature: IUniswapV3Feature as ContractArtifact,
|
||||||
|
LibERC721Order: LibERC721Order as ContractArtifact,
|
||||||
LibNativeOrder: LibNativeOrder as ContractArtifact,
|
LibNativeOrder: LibNativeOrder as ContractArtifact,
|
||||||
LibSignature: LibSignature as ContractArtifact,
|
LibSignature: LibSignature as ContractArtifact,
|
||||||
MultiplexFeature: MultiplexFeature as ContractArtifact,
|
MultiplexFeature: MultiplexFeature as ContractArtifact,
|
||||||
@@ -244,6 +258,7 @@ export const artifacts = {
|
|||||||
NativeOrdersSettlement: NativeOrdersSettlement as ContractArtifact,
|
NativeOrdersSettlement: NativeOrdersSettlement as ContractArtifact,
|
||||||
FixinCommon: FixinCommon as ContractArtifact,
|
FixinCommon: FixinCommon as ContractArtifact,
|
||||||
FixinEIP712: FixinEIP712 as ContractArtifact,
|
FixinEIP712: FixinEIP712 as ContractArtifact,
|
||||||
|
FixinERC721Spender: FixinERC721Spender as ContractArtifact,
|
||||||
FixinProtocolFees: FixinProtocolFees as ContractArtifact,
|
FixinProtocolFees: FixinProtocolFees as ContractArtifact,
|
||||||
FixinReentrancyGuard: FixinReentrancyGuard as ContractArtifact,
|
FixinReentrancyGuard: FixinReentrancyGuard as ContractArtifact,
|
||||||
FixinTokenSpender: FixinTokenSpender as ContractArtifact,
|
FixinTokenSpender: FixinTokenSpender as ContractArtifact,
|
||||||
@@ -253,6 +268,7 @@ export const artifacts = {
|
|||||||
InitialMigration: InitialMigration as ContractArtifact,
|
InitialMigration: InitialMigration as ContractArtifact,
|
||||||
LibBootstrap: LibBootstrap as ContractArtifact,
|
LibBootstrap: LibBootstrap as ContractArtifact,
|
||||||
LibMigrate: LibMigrate as ContractArtifact,
|
LibMigrate: LibMigrate as ContractArtifact,
|
||||||
|
LibERC721OrdersStorage: LibERC721OrdersStorage as ContractArtifact,
|
||||||
LibMetaTransactionsStorage: LibMetaTransactionsStorage as ContractArtifact,
|
LibMetaTransactionsStorage: LibMetaTransactionsStorage as ContractArtifact,
|
||||||
LibNativeOrdersStorage: LibNativeOrdersStorage as ContractArtifact,
|
LibNativeOrdersStorage: LibNativeOrdersStorage as ContractArtifact,
|
||||||
LibOtcOrdersStorage: LibOtcOrdersStorage as ContractArtifact,
|
LibOtcOrdersStorage: LibOtcOrdersStorage as ContractArtifact,
|
||||||
@@ -298,8 +314,12 @@ export const artifacts = {
|
|||||||
MixinUniswapV2: MixinUniswapV2 as ContractArtifact,
|
MixinUniswapV2: MixinUniswapV2 as ContractArtifact,
|
||||||
MixinUniswapV3: MixinUniswapV3 as ContractArtifact,
|
MixinUniswapV3: MixinUniswapV3 as ContractArtifact,
|
||||||
MixinZeroExBridge: MixinZeroExBridge as ContractArtifact,
|
MixinZeroExBridge: MixinZeroExBridge as ContractArtifact,
|
||||||
|
IERC721OrderCallback: IERC721OrderCallback as ContractArtifact,
|
||||||
|
IERC721Token: IERC721Token as ContractArtifact,
|
||||||
|
IFeeRecipient: IFeeRecipient as ContractArtifact,
|
||||||
ILiquidityProvider: ILiquidityProvider as ContractArtifact,
|
ILiquidityProvider: ILiquidityProvider as ContractArtifact,
|
||||||
IMooniswapPool: IMooniswapPool as ContractArtifact,
|
IMooniswapPool: IMooniswapPool as ContractArtifact,
|
||||||
|
IPropertyValidator: IPropertyValidator as ContractArtifact,
|
||||||
IUniswapV2Pair: IUniswapV2Pair as ContractArtifact,
|
IUniswapV2Pair: IUniswapV2Pair as ContractArtifact,
|
||||||
IUniswapV3Pool: IUniswapV3Pool as ContractArtifact,
|
IUniswapV3Pool: IUniswapV3Pool as ContractArtifact,
|
||||||
IERC20Bridge: IERC20Bridge as ContractArtifact,
|
IERC20Bridge: IERC20Bridge as ContractArtifact,
|
||||||
|
|||||||
@@ -9,11 +9,13 @@ export * from '../test/generated-wrappers/bootstrap_feature';
|
|||||||
export * from '../test/generated-wrappers/bridge_adapter';
|
export * from '../test/generated-wrappers/bridge_adapter';
|
||||||
export * from '../test/generated-wrappers/bridge_protocols';
|
export * from '../test/generated-wrappers/bridge_protocols';
|
||||||
export * from '../test/generated-wrappers/curve_liquidity_provider';
|
export * from '../test/generated-wrappers/curve_liquidity_provider';
|
||||||
|
export * from '../test/generated-wrappers/erc721_orders_feature';
|
||||||
export * from '../test/generated-wrappers/fee_collector';
|
export * from '../test/generated-wrappers/fee_collector';
|
||||||
export * from '../test/generated-wrappers/fee_collector_controller';
|
export * from '../test/generated-wrappers/fee_collector_controller';
|
||||||
export * from '../test/generated-wrappers/fill_quote_transformer';
|
export * from '../test/generated-wrappers/fill_quote_transformer';
|
||||||
export * from '../test/generated-wrappers/fixin_common';
|
export * from '../test/generated-wrappers/fixin_common';
|
||||||
export * from '../test/generated-wrappers/fixin_e_i_p712';
|
export * from '../test/generated-wrappers/fixin_e_i_p712';
|
||||||
|
export * from '../test/generated-wrappers/fixin_erc721_spender';
|
||||||
export * from '../test/generated-wrappers/fixin_protocol_fees';
|
export * from '../test/generated-wrappers/fixin_protocol_fees';
|
||||||
export * from '../test/generated-wrappers/fixin_reentrancy_guard';
|
export * from '../test/generated-wrappers/fixin_reentrancy_guard';
|
||||||
export * from '../test/generated-wrappers/fixin_token_spender';
|
export * from '../test/generated-wrappers/fixin_token_spender';
|
||||||
@@ -25,7 +27,11 @@ export * from '../test/generated-wrappers/i_bootstrap_feature';
|
|||||||
export * from '../test/generated-wrappers/i_bridge_adapter';
|
export * from '../test/generated-wrappers/i_bridge_adapter';
|
||||||
export * from '../test/generated-wrappers/i_erc20_bridge';
|
export * from '../test/generated-wrappers/i_erc20_bridge';
|
||||||
export * from '../test/generated-wrappers/i_erc20_transformer';
|
export * from '../test/generated-wrappers/i_erc20_transformer';
|
||||||
|
export * from '../test/generated-wrappers/i_erc721_order_callback';
|
||||||
|
export * from '../test/generated-wrappers/i_erc721_orders_feature';
|
||||||
|
export * from '../test/generated-wrappers/i_erc721_token';
|
||||||
export * from '../test/generated-wrappers/i_feature';
|
export * from '../test/generated-wrappers/i_feature';
|
||||||
|
export * from '../test/generated-wrappers/i_fee_recipient';
|
||||||
export * from '../test/generated-wrappers/i_flash_wallet';
|
export * from '../test/generated-wrappers/i_flash_wallet';
|
||||||
export * from '../test/generated-wrappers/i_fund_recovery_feature';
|
export * from '../test/generated-wrappers/i_fund_recovery_feature';
|
||||||
export * from '../test/generated-wrappers/i_liquidity_provider';
|
export * from '../test/generated-wrappers/i_liquidity_provider';
|
||||||
@@ -39,6 +45,7 @@ export * from '../test/generated-wrappers/i_native_orders_feature';
|
|||||||
export * from '../test/generated-wrappers/i_otc_orders_feature';
|
export * from '../test/generated-wrappers/i_otc_orders_feature';
|
||||||
export * from '../test/generated-wrappers/i_ownable_feature';
|
export * from '../test/generated-wrappers/i_ownable_feature';
|
||||||
export * from '../test/generated-wrappers/i_pancake_swap_feature';
|
export * from '../test/generated-wrappers/i_pancake_swap_feature';
|
||||||
|
export * from '../test/generated-wrappers/i_property_validator';
|
||||||
export * from '../test/generated-wrappers/i_simple_function_registry_feature';
|
export * from '../test/generated-wrappers/i_simple_function_registry_feature';
|
||||||
export * from '../test/generated-wrappers/i_staking';
|
export * from '../test/generated-wrappers/i_staking';
|
||||||
export * from '../test/generated-wrappers/i_test_simple_function_registry_feature';
|
export * from '../test/generated-wrappers/i_test_simple_function_registry_feature';
|
||||||
@@ -53,6 +60,9 @@ export * from '../test/generated-wrappers/initial_migration';
|
|||||||
export * from '../test/generated-wrappers/lib_bootstrap';
|
export * from '../test/generated-wrappers/lib_bootstrap';
|
||||||
export * from '../test/generated-wrappers/lib_common_rich_errors';
|
export * from '../test/generated-wrappers/lib_common_rich_errors';
|
||||||
export * from '../test/generated-wrappers/lib_erc20_transformer';
|
export * from '../test/generated-wrappers/lib_erc20_transformer';
|
||||||
|
export * from '../test/generated-wrappers/lib_erc721_order';
|
||||||
|
export * from '../test/generated-wrappers/lib_erc721_orders_rich_errors';
|
||||||
|
export * from '../test/generated-wrappers/lib_erc721_orders_storage';
|
||||||
export * from '../test/generated-wrappers/lib_fee_collector';
|
export * from '../test/generated-wrappers/lib_fee_collector';
|
||||||
export * from '../test/generated-wrappers/lib_liquidity_provider_rich_errors';
|
export * from '../test/generated-wrappers/lib_liquidity_provider_rich_errors';
|
||||||
export * from '../test/generated-wrappers/lib_meta_transactions_rich_errors';
|
export * from '../test/generated-wrappers/lib_meta_transactions_rich_errors';
|
||||||
|
|||||||
@@ -42,11 +42,13 @@
|
|||||||
"test/generated-artifacts/BridgeAdapter.json",
|
"test/generated-artifacts/BridgeAdapter.json",
|
||||||
"test/generated-artifacts/BridgeProtocols.json",
|
"test/generated-artifacts/BridgeProtocols.json",
|
||||||
"test/generated-artifacts/CurveLiquidityProvider.json",
|
"test/generated-artifacts/CurveLiquidityProvider.json",
|
||||||
|
"test/generated-artifacts/ERC721OrdersFeature.json",
|
||||||
"test/generated-artifacts/FeeCollector.json",
|
"test/generated-artifacts/FeeCollector.json",
|
||||||
"test/generated-artifacts/FeeCollectorController.json",
|
"test/generated-artifacts/FeeCollectorController.json",
|
||||||
"test/generated-artifacts/FillQuoteTransformer.json",
|
"test/generated-artifacts/FillQuoteTransformer.json",
|
||||||
"test/generated-artifacts/FixinCommon.json",
|
"test/generated-artifacts/FixinCommon.json",
|
||||||
"test/generated-artifacts/FixinEIP712.json",
|
"test/generated-artifacts/FixinEIP712.json",
|
||||||
|
"test/generated-artifacts/FixinERC721Spender.json",
|
||||||
"test/generated-artifacts/FixinProtocolFees.json",
|
"test/generated-artifacts/FixinProtocolFees.json",
|
||||||
"test/generated-artifacts/FixinReentrancyGuard.json",
|
"test/generated-artifacts/FixinReentrancyGuard.json",
|
||||||
"test/generated-artifacts/FixinTokenSpender.json",
|
"test/generated-artifacts/FixinTokenSpender.json",
|
||||||
@@ -58,7 +60,11 @@
|
|||||||
"test/generated-artifacts/IBridgeAdapter.json",
|
"test/generated-artifacts/IBridgeAdapter.json",
|
||||||
"test/generated-artifacts/IERC20Bridge.json",
|
"test/generated-artifacts/IERC20Bridge.json",
|
||||||
"test/generated-artifacts/IERC20Transformer.json",
|
"test/generated-artifacts/IERC20Transformer.json",
|
||||||
|
"test/generated-artifacts/IERC721OrderCallback.json",
|
||||||
|
"test/generated-artifacts/IERC721OrdersFeature.json",
|
||||||
|
"test/generated-artifacts/IERC721Token.json",
|
||||||
"test/generated-artifacts/IFeature.json",
|
"test/generated-artifacts/IFeature.json",
|
||||||
|
"test/generated-artifacts/IFeeRecipient.json",
|
||||||
"test/generated-artifacts/IFlashWallet.json",
|
"test/generated-artifacts/IFlashWallet.json",
|
||||||
"test/generated-artifacts/IFundRecoveryFeature.json",
|
"test/generated-artifacts/IFundRecoveryFeature.json",
|
||||||
"test/generated-artifacts/ILiquidityProvider.json",
|
"test/generated-artifacts/ILiquidityProvider.json",
|
||||||
@@ -72,6 +78,7 @@
|
|||||||
"test/generated-artifacts/IOtcOrdersFeature.json",
|
"test/generated-artifacts/IOtcOrdersFeature.json",
|
||||||
"test/generated-artifacts/IOwnableFeature.json",
|
"test/generated-artifacts/IOwnableFeature.json",
|
||||||
"test/generated-artifacts/IPancakeSwapFeature.json",
|
"test/generated-artifacts/IPancakeSwapFeature.json",
|
||||||
|
"test/generated-artifacts/IPropertyValidator.json",
|
||||||
"test/generated-artifacts/ISimpleFunctionRegistryFeature.json",
|
"test/generated-artifacts/ISimpleFunctionRegistryFeature.json",
|
||||||
"test/generated-artifacts/IStaking.json",
|
"test/generated-artifacts/IStaking.json",
|
||||||
"test/generated-artifacts/ITestSimpleFunctionRegistryFeature.json",
|
"test/generated-artifacts/ITestSimpleFunctionRegistryFeature.json",
|
||||||
@@ -86,6 +93,9 @@
|
|||||||
"test/generated-artifacts/LibBootstrap.json",
|
"test/generated-artifacts/LibBootstrap.json",
|
||||||
"test/generated-artifacts/LibCommonRichErrors.json",
|
"test/generated-artifacts/LibCommonRichErrors.json",
|
||||||
"test/generated-artifacts/LibERC20Transformer.json",
|
"test/generated-artifacts/LibERC20Transformer.json",
|
||||||
|
"test/generated-artifacts/LibERC721Order.json",
|
||||||
|
"test/generated-artifacts/LibERC721OrdersRichErrors.json",
|
||||||
|
"test/generated-artifacts/LibERC721OrdersStorage.json",
|
||||||
"test/generated-artifacts/LibFeeCollector.json",
|
"test/generated-artifacts/LibFeeCollector.json",
|
||||||
"test/generated-artifacts/LibLiquidityProviderRichErrors.json",
|
"test/generated-artifacts/LibLiquidityProviderRichErrors.json",
|
||||||
"test/generated-artifacts/LibMetaTransactionsRichErrors.json",
|
"test/generated-artifacts/LibMetaTransactionsRichErrors.json",
|
||||||
|
|||||||
@@ -1,4 +1,88 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "16.46.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Enable `Curve` ETH/CVX pool",
|
||||||
|
"pr": 394
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1641863395
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.45.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Handle 0 output samples and negative adjusted rate native orders in routing",
|
||||||
|
"pr": 387
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1641827361
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.45.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Update `Celo` intermediate tokens",
|
||||||
|
"pr": 390
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1641359319
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.45.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Capture router timings",
|
||||||
|
"pr": 388
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1641308410
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.44.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Update neon-router and use router estimated output amount",
|
||||||
|
"pr": 354
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1640778328
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.43.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "`UniswapV3` support for `Optimism`",
|
||||||
|
"pr": 385
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1640364306
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.42.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "`UniswapV3` support for `Polygon`",
|
||||||
|
"pr": 382
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Update `Beethoven` Graphql url",
|
||||||
|
"pr": 383
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1640124159
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.41.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Update mcusd contract address, and made celo native asset",
|
||||||
|
"pr": 376
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1638827302
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "16.40.0",
|
"version": "16.40.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
|||||||
@@ -5,6 +5,39 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v16.46.0 - _January 11, 2022_
|
||||||
|
|
||||||
|
* Enable `Curve` ETH/CVX pool (#394)
|
||||||
|
|
||||||
|
## v16.45.2 - _January 10, 2022_
|
||||||
|
|
||||||
|
* Handle 0 output samples and negative adjusted rate native orders in routing (#387)
|
||||||
|
|
||||||
|
## v16.45.1 - _January 5, 2022_
|
||||||
|
|
||||||
|
* Update `Celo` intermediate tokens (#390)
|
||||||
|
|
||||||
|
## v16.45.0 - _January 4, 2022_
|
||||||
|
|
||||||
|
* Capture router timings (#388)
|
||||||
|
|
||||||
|
## v16.44.0 - _December 29, 2021_
|
||||||
|
|
||||||
|
* Update neon-router and use router estimated output amount (#354)
|
||||||
|
|
||||||
|
## v16.43.0 - _December 24, 2021_
|
||||||
|
|
||||||
|
* `UniswapV3` support for `Optimism` (#385)
|
||||||
|
|
||||||
|
## v16.42.0 - _December 21, 2021_
|
||||||
|
|
||||||
|
* `UniswapV3` support for `Polygon` (#382)
|
||||||
|
* Update `Beethoven` Graphql url (#383)
|
||||||
|
|
||||||
|
## v16.41.0 - _December 6, 2021_
|
||||||
|
|
||||||
|
* Update mcusd contract address, and made celo native asset (#376)
|
||||||
|
|
||||||
## v16.40.0 - _December 1, 2021_
|
## v16.40.0 - _December 1, 2021_
|
||||||
|
|
||||||
* Add `AaveV2` and `Compound` deposit/withdrawal liquidity source (#321)
|
* Add `AaveV2` and `Compound` deposit/withdrawal liquidity source (#321)
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ interface IUniswapV3Pool {
|
|||||||
contract UniswapV3Sampler
|
contract UniswapV3Sampler
|
||||||
{
|
{
|
||||||
/// @dev Gas limit for UniswapV3 calls. This is 100% a guess.
|
/// @dev Gas limit for UniswapV3 calls. This is 100% a guess.
|
||||||
uint256 constant private QUOTE_GAS = 300e3;
|
uint256 constant private QUOTE_GAS = 600e3;
|
||||||
|
|
||||||
/// @dev Sample sell quotes from UniswapV3.
|
/// @dev Sample sell quotes from UniswapV3.
|
||||||
/// @param quoter UniswapV3 Quoter contract.
|
/// @param quoter UniswapV3 Quoter contract.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/asset-swapper",
|
"name": "@0x/asset-swapper",
|
||||||
"version": "16.40.0",
|
"version": "16.46.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -60,14 +60,14 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^3.0.29",
|
"@0x/assert": "^3.0.29",
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^6.4.2",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/contract-wrappers": "^13.18.4",
|
"@0x/contract-wrappers": "^13.18.5",
|
||||||
"@0x/contracts-erc20": "^3.3.24",
|
"@0x/contracts-erc20": "^3.3.25",
|
||||||
"@0x/contracts-zero-ex": "^0.30.0",
|
"@0x/contracts-zero-ex": "^0.30.1",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^4.2.9",
|
||||||
"@0x/json-schemas": "^6.3.0",
|
"@0x/json-schemas": "^6.3.0",
|
||||||
"@0x/neon-router": "^0.2.1",
|
"@0x/neon-router": "^0.3.1",
|
||||||
"@0x/protocol-utils": "^1.10.0",
|
"@0x/protocol-utils": "^1.10.1",
|
||||||
"@0x/quote-server": "^6.0.6",
|
"@0x/quote-server": "^6.0.6",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/types": "^3.3.4",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/typescript-typings": "^5.2.1",
|
||||||
@@ -98,10 +98,10 @@
|
|||||||
"@0x/contracts-exchange": "^3.2.38",
|
"@0x/contracts-exchange": "^3.2.38",
|
||||||
"@0x/contracts-exchange-libs": "^4.3.37",
|
"@0x/contracts-exchange-libs": "^4.3.37",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.40",
|
||||||
"@0x/contracts-test-utils": "^5.4.15",
|
"@0x/contracts-test-utils": "^5.4.16",
|
||||||
"@0x/contracts-utils": "^4.8.5",
|
"@0x/contracts-utils": "^4.8.6",
|
||||||
"@0x/mesh-rpc-client": "^9.4.2",
|
"@0x/mesh-rpc-client": "^9.4.2",
|
||||||
"@0x/migrations": "^8.1.13",
|
"@0x/migrations": "^8.1.14",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.7.5",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/subproviders": "^6.6.0",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
|
|||||||
@@ -223,7 +223,17 @@ export async function returnQuoteFromAltMMAsync<ResponseT>(
|
|||||||
cancelToken,
|
cancelToken,
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
warningLogger(err, `Alt RFQ MM request failed`);
|
if (err.response) {
|
||||||
|
// request was made and market maker responded
|
||||||
|
warningLogger(
|
||||||
|
{ data: err.response.data, status: err.response.status, headers: err.response.headers },
|
||||||
|
`Alt RFQ MM request failed`,
|
||||||
|
);
|
||||||
|
} else if (err.request) {
|
||||||
|
warningLogger({}, 'Alt RFQ MM no response received');
|
||||||
|
} else {
|
||||||
|
warningLogger({ err: err.message }, 'Failed to construct Alt RFQ MM request');
|
||||||
|
}
|
||||||
throw new Error(`Alt RFQ MM request failed`);
|
throw new Error(`Alt RFQ MM request failed`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ function valueByChainId<T>(rest: Partial<{ [key in ChainId]: T }>, defaultValue:
|
|||||||
[ChainId.Avalanche]: defaultValue,
|
[ChainId.Avalanche]: defaultValue,
|
||||||
[ChainId.Fantom]: defaultValue,
|
[ChainId.Fantom]: defaultValue,
|
||||||
[ChainId.Celo]: defaultValue,
|
[ChainId.Celo]: defaultValue,
|
||||||
|
[ChainId.Optimism]: defaultValue,
|
||||||
...(rest || {}),
|
...(rest || {}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -165,6 +166,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.JetSwap,
|
ERC20BridgeSource.JetSwap,
|
||||||
ERC20BridgeSource.IronSwap,
|
ERC20BridgeSource.IronSwap,
|
||||||
ERC20BridgeSource.AaveV2,
|
ERC20BridgeSource.AaveV2,
|
||||||
|
ERC20BridgeSource.UniswapV3,
|
||||||
]),
|
]),
|
||||||
[ChainId.Avalanche]: new SourceFilters([
|
[ChainId.Avalanche]: new SourceFilters([
|
||||||
ERC20BridgeSource.MultiHop,
|
ERC20BridgeSource.MultiHop,
|
||||||
@@ -192,6 +194,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.SushiSwap,
|
ERC20BridgeSource.SushiSwap,
|
||||||
ERC20BridgeSource.MultiHop,
|
ERC20BridgeSource.MultiHop,
|
||||||
]),
|
]),
|
||||||
|
[ChainId.Optimism]: new SourceFilters([ERC20BridgeSource.UniswapV3]),
|
||||||
},
|
},
|
||||||
new SourceFilters([]),
|
new SourceFilters([]),
|
||||||
);
|
);
|
||||||
@@ -296,6 +299,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.JetSwap,
|
ERC20BridgeSource.JetSwap,
|
||||||
ERC20BridgeSource.IronSwap,
|
ERC20BridgeSource.IronSwap,
|
||||||
ERC20BridgeSource.AaveV2,
|
ERC20BridgeSource.AaveV2,
|
||||||
|
ERC20BridgeSource.UniswapV3,
|
||||||
]),
|
]),
|
||||||
[ChainId.Avalanche]: new SourceFilters([
|
[ChainId.Avalanche]: new SourceFilters([
|
||||||
ERC20BridgeSource.MultiHop,
|
ERC20BridgeSource.MultiHop,
|
||||||
@@ -323,6 +327,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.SushiSwap,
|
ERC20BridgeSource.SushiSwap,
|
||||||
ERC20BridgeSource.MultiHop,
|
ERC20BridgeSource.MultiHop,
|
||||||
]),
|
]),
|
||||||
|
[ChainId.Optimism]: new SourceFilters([ERC20BridgeSource.UniswapV3]),
|
||||||
},
|
},
|
||||||
new SourceFilters([]),
|
new SourceFilters([]),
|
||||||
);
|
);
|
||||||
@@ -340,10 +345,11 @@ export const FEE_QUOTE_SOURCES_BY_CHAIN_ID = valueByChainId<ERC20BridgeSource[]>
|
|||||||
[ChainId.Mainnet]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.UniswapV3],
|
[ChainId.Mainnet]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.UniswapV3],
|
||||||
[ChainId.BSC]: [ERC20BridgeSource.PancakeSwap, ERC20BridgeSource.Mooniswap, ERC20BridgeSource.SushiSwap],
|
[ChainId.BSC]: [ERC20BridgeSource.PancakeSwap, ERC20BridgeSource.Mooniswap, ERC20BridgeSource.SushiSwap],
|
||||||
[ChainId.Ropsten]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap],
|
[ChainId.Ropsten]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap],
|
||||||
[ChainId.Polygon]: [ERC20BridgeSource.QuickSwap, ERC20BridgeSource.SushiSwap],
|
[ChainId.Polygon]: [ERC20BridgeSource.QuickSwap, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.UniswapV3],
|
||||||
[ChainId.Avalanche]: [ERC20BridgeSource.Pangolin, ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap],
|
[ChainId.Avalanche]: [ERC20BridgeSource.Pangolin, ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap],
|
||||||
[ChainId.Fantom]: [ERC20BridgeSource.SpiritSwap, ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap],
|
[ChainId.Fantom]: [ERC20BridgeSource.SpiritSwap, ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap],
|
||||||
[ChainId.Celo]: [ERC20BridgeSource.UbeSwap, ERC20BridgeSource.SushiSwap],
|
[ChainId.Celo]: [ERC20BridgeSource.UbeSwap, ERC20BridgeSource.SushiSwap],
|
||||||
|
[ChainId.Optimism]: [ERC20BridgeSource.UniswapV3],
|
||||||
},
|
},
|
||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
@@ -456,6 +462,7 @@ export const MAINNET_TOKENS = {
|
|||||||
CRV: '0xd533a949740bb3306d119cc777fa900ba034cd52',
|
CRV: '0xd533a949740bb3306d119cc777fa900ba034cd52',
|
||||||
MIM: '0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3',
|
MIM: '0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3',
|
||||||
EURT: '0xc581b735a1688071a1746c968e0798d642ede491',
|
EURT: '0xc581b735a1688071a1746c968e0798d642ede491',
|
||||||
|
CVX: '0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const BSC_TOKENS = {
|
export const BSC_TOKENS = {
|
||||||
@@ -504,9 +511,23 @@ export const AVALANCHE_TOKENS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const CELO_TOKENS = {
|
export const CELO_TOKENS = {
|
||||||
WETH: '0xe919f65739c26a42616b7b8eedc6b5524d1e3ac4',
|
WCELO: '0x471ece3750da237f93b8e339c536989b8978a438',
|
||||||
CELO: '0x471ece3750da237f93b8e339c536989b8978a438',
|
// Some of these tokens are Optics bridge? tokens which
|
||||||
mCUSD: '0x64defa3544c695db8c535d289d843a189aa26b98',
|
// had an issue and migrated from v1 to v2
|
||||||
|
WETHv1: '0xe919f65739c26a42616b7b8eedc6b5524d1e3ac4',
|
||||||
|
WETH: '0x122013fd7df1c6f636a5bb8f03108e876548b455',
|
||||||
|
WBTC: '0xbaab46e28388d2779e6e31fd00cf0e5ad95e327b',
|
||||||
|
cUSD: '0x765de816845861e75a25fca122bb6898b8b1282a',
|
||||||
|
// ??
|
||||||
|
WBTCv1: '0xd629eb00deced2a080b7ec630ef6ac117e614f1b',
|
||||||
|
cETH: '0x2def4285787d58a2f811af24755a8150622f4361',
|
||||||
|
UBE: '0x00be915b9dcf56a3cbe739d9b9c202ca692409ec',
|
||||||
|
// Moolah
|
||||||
|
mCELO: '0x7d00cd74ff385c955ea3d79e47bf06bd7386387d',
|
||||||
|
mCUSD: '0x918146359264c492bd6934071c6bd31c854edbc3',
|
||||||
|
mCEUR: '0xe273ad7ee11dcfaa87383ad5977ee1504ac07568',
|
||||||
|
amCUSD: '0x64defa3544c695db8c535d289d843a189aa26b98',
|
||||||
|
MOO: '0x17700282592d6917f6a73d0bf8accf4d578c131e',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const FANTOM_TOKENS = {
|
export const FANTOM_TOKENS = {
|
||||||
@@ -519,6 +540,14 @@ export const FANTOM_TOKENS = {
|
|||||||
renBTC: '0xdbf31df14b66535af65aac99c32e9ea844e14501',
|
renBTC: '0xdbf31df14b66535af65aac99c32e9ea844e14501',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const OPTIMISM_TOKENS = {
|
||||||
|
WETH: '0x4200000000000000000000000000000000000006',
|
||||||
|
USDC: '0x7f5c764cbc14f9669b88837ca1490cca17c31607',
|
||||||
|
USDT: '0x94b008aa00579c1307b0ef2c499ad98a8ce58e58',
|
||||||
|
DAI: '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1',
|
||||||
|
WBTC: '0x68f180fcce6836688e9084f035309e29bf0a2095',
|
||||||
|
};
|
||||||
|
|
||||||
export const CURVE_POOLS = {
|
export const CURVE_POOLS = {
|
||||||
compound: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56', // 0.Compound
|
compound: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56', // 0.Compound
|
||||||
// 1.USDT is dead
|
// 1.USDT is dead
|
||||||
@@ -564,6 +593,7 @@ export const CURVE_POOLS = {
|
|||||||
mim: '0x5a6a4d54456819380173272a5e8e9b9904bdf41b',
|
mim: '0x5a6a4d54456819380173272a5e8e9b9904bdf41b',
|
||||||
eurt: '0xfd5db7463a3ab53fd211b4af195c5bccc1a03890',
|
eurt: '0xfd5db7463a3ab53fd211b4af195c5bccc1a03890',
|
||||||
ethcrv: '0x8301ae4fc9c624d1d396cbdaa1ed877821d7c511',
|
ethcrv: '0x8301ae4fc9c624d1d396cbdaa1ed877821d7c511',
|
||||||
|
ethcvx: '0xb576491f1e6e5e62f1d8f26062ee822b40b0e0d4',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CURVE_V2_POOLS = {
|
export const CURVE_V2_POOLS = {
|
||||||
@@ -699,7 +729,8 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
|
|||||||
AVALANCHE_TOKENS.USDC,
|
AVALANCHE_TOKENS.USDC,
|
||||||
],
|
],
|
||||||
[ChainId.Fantom]: [FANTOM_TOKENS.WFTM, FANTOM_TOKENS.WETH, FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC],
|
[ChainId.Fantom]: [FANTOM_TOKENS.WFTM, FANTOM_TOKENS.WETH, FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC],
|
||||||
[ChainId.Celo]: [CELO_TOKENS.mCUSD, CELO_TOKENS.WETH, CELO_TOKENS.CELO],
|
[ChainId.Celo]: [CELO_TOKENS.WCELO, CELO_TOKENS.mCUSD, CELO_TOKENS.WETH, CELO_TOKENS.amCUSD, CELO_TOKENS.WBTC],
|
||||||
|
[ChainId.Optimism]: [OPTIMISM_TOKENS.WETH, OPTIMISM_TOKENS.DAI, OPTIMISM_TOKENS.USDC],
|
||||||
},
|
},
|
||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
@@ -739,6 +770,9 @@ export const DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID = valueByChainId<TokenAdj
|
|||||||
[ChainId.Celo]: new TokenAdjacencyGraphBuilder({
|
[ChainId.Celo]: new TokenAdjacencyGraphBuilder({
|
||||||
default: DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID[ChainId.Celo],
|
default: DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID[ChainId.Celo],
|
||||||
}).build(),
|
}).build(),
|
||||||
|
[ChainId.Optimism]: new TokenAdjacencyGraphBuilder({
|
||||||
|
default: DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID[ChainId.Optimism],
|
||||||
|
}).build(),
|
||||||
},
|
},
|
||||||
new TokenAdjacencyGraphBuilder({ default: [] }).build(),
|
new TokenAdjacencyGraphBuilder({ default: [] }).build(),
|
||||||
);
|
);
|
||||||
@@ -755,6 +789,7 @@ export const NATIVE_FEE_TOKEN_BY_CHAIN_ID = valueByChainId<string>(
|
|||||||
[ChainId.Avalanche]: getContractAddressesForChainOrThrow(ChainId.Avalanche).etherToken,
|
[ChainId.Avalanche]: getContractAddressesForChainOrThrow(ChainId.Avalanche).etherToken,
|
||||||
[ChainId.Fantom]: getContractAddressesForChainOrThrow(ChainId.Fantom).etherToken,
|
[ChainId.Fantom]: getContractAddressesForChainOrThrow(ChainId.Fantom).etherToken,
|
||||||
[ChainId.Celo]: getContractAddressesForChainOrThrow(ChainId.Celo).etherToken,
|
[ChainId.Celo]: getContractAddressesForChainOrThrow(ChainId.Celo).etherToken,
|
||||||
|
[ChainId.Optimism]: getContractAddressesForChainOrThrow(ChainId.Optimism).etherToken,
|
||||||
},
|
},
|
||||||
NULL_ADDRESS,
|
NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
@@ -1040,6 +1075,17 @@ export const CURVE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
|||||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_uint256,
|
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_uint256,
|
||||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying_uint256,
|
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying_uint256,
|
||||||
},
|
},
|
||||||
|
[CURVE_POOLS.ethcvx]: {
|
||||||
|
...createCurveExchangePool({
|
||||||
|
// This pool uses ETH
|
||||||
|
tokens: [MAINNET_TOKENS.WETH, MAINNET_TOKENS.CVX],
|
||||||
|
pool: CURVE_POOLS.ethcvx,
|
||||||
|
gasSchedule: 350e3,
|
||||||
|
}),
|
||||||
|
// This pool has a custom get_dy and exchange selector with uint256
|
||||||
|
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_uint256,
|
||||||
|
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying_uint256,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CURVE_V2_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
export const CURVE_V2_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||||
@@ -1693,9 +1739,9 @@ export const BALANCER_V2_SUBGRAPH_URL_BY_CHAIN = valueByChainId<string>(
|
|||||||
|
|
||||||
export const BEETHOVEN_X_SUBGRAPH_URL_BY_CHAIN = valueByChainId<string>(
|
export const BEETHOVEN_X_SUBGRAPH_URL_BY_CHAIN = valueByChainId<string>(
|
||||||
{
|
{
|
||||||
[ChainId.Fantom]: 'https://graph-node.beets-ftm-node.com/subgraphs/name/beethovenx-v4',
|
[ChainId.Fantom]: 'https://graph-node.beets-ftm-node.com/subgraphs/name/beethovenx',
|
||||||
},
|
},
|
||||||
'https://graph-node.beets-ftm-node.com/subgraphs/name/beethovenx-v4',
|
'https://graph-node.beets-ftm-node.com/subgraphs/name/beethovenx',
|
||||||
);
|
);
|
||||||
|
|
||||||
export const UNISWAPV3_CONFIG_BY_CHAIN_ID = valueByChainId(
|
export const UNISWAPV3_CONFIG_BY_CHAIN_ID = valueByChainId(
|
||||||
@@ -1708,6 +1754,14 @@ export const UNISWAPV3_CONFIG_BY_CHAIN_ID = valueByChainId(
|
|||||||
quoter: '0x2f9e608fd881861b8916257b76613cb22ee0652c',
|
quoter: '0x2f9e608fd881861b8916257b76613cb22ee0652c',
|
||||||
router: '0x03782388516e94fcd4c18666303601a12aa729ea',
|
router: '0x03782388516e94fcd4c18666303601a12aa729ea',
|
||||||
},
|
},
|
||||||
|
[ChainId.Polygon]: {
|
||||||
|
quoter: '0xb27308f9f90d607463bb33ea1bebb41c27ce5ab6',
|
||||||
|
router: '0xe592427a0aece92de3edee1f18e0157c05861564',
|
||||||
|
},
|
||||||
|
[ChainId.Optimism]: {
|
||||||
|
quoter: '0xb27308f9f90d607463bb33ea1bebb41c27ce5ab6',
|
||||||
|
router: '0xe592427a0aece92de3edee1f18e0157c05861564',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{ quoter: NULL_ADDRESS, router: NULL_ADDRESS },
|
{ quoter: NULL_ADDRESS, router: NULL_ADDRESS },
|
||||||
);
|
);
|
||||||
@@ -2076,4 +2130,5 @@ export const DEFAULT_GET_MARKET_ORDERS_OPTS: Omit<GetMarketOrdersOpts, 'gasPrice
|
|||||||
shouldGenerateQuoteReport: true,
|
shouldGenerateQuoteReport: true,
|
||||||
shouldIncludePriceComparisonsReport: false,
|
shouldIncludePriceComparisonsReport: false,
|
||||||
tokenAdjacencyGraph: { default: [] },
|
tokenAdjacencyGraph: { default: [] },
|
||||||
|
neonRouterNumSamples: 14,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -443,6 +443,7 @@ export class MarketOperationUtils {
|
|||||||
feeSchedule: _opts.feeSchedule,
|
feeSchedule: _opts.feeSchedule,
|
||||||
allowFallback: _opts.allowFallback,
|
allowFallback: _opts.allowFallback,
|
||||||
gasPrice: _opts.gasPrice,
|
gasPrice: _opts.gasPrice,
|
||||||
|
neonRouterNumSamples: _opts.neonRouterNumSamples,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
return optimizerResult;
|
return optimizerResult;
|
||||||
@@ -531,9 +532,18 @@ export class MarketOperationUtils {
|
|||||||
penaltyOpts,
|
penaltyOpts,
|
||||||
opts.feeSchedule,
|
opts.feeSchedule,
|
||||||
this._sampler.chainId,
|
this._sampler.chainId,
|
||||||
|
opts.neonRouterNumSamples,
|
||||||
|
opts.samplerMetrics,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
optimalPath = await findOptimalPathJSAsync(side, fills, inputAmount, opts.runLimit, penaltyOpts);
|
optimalPath = await findOptimalPathJSAsync(
|
||||||
|
side,
|
||||||
|
fills,
|
||||||
|
inputAmount,
|
||||||
|
opts.runLimit,
|
||||||
|
opts.samplerMetrics,
|
||||||
|
penaltyOpts,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const optimalPathRate = optimalPath ? optimalPath.adjustedRate() : ZERO_AMOUNT;
|
const optimalPathRate = optimalPath ? optimalPath.adjustedRate() : ZERO_AMOUNT;
|
||||||
@@ -596,6 +606,8 @@ export class MarketOperationUtils {
|
|||||||
allowFallback: _opts.allowFallback,
|
allowFallback: _opts.allowFallback,
|
||||||
exchangeProxyOverhead: _opts.exchangeProxyOverhead,
|
exchangeProxyOverhead: _opts.exchangeProxyOverhead,
|
||||||
gasPrice: _opts.gasPrice,
|
gasPrice: _opts.gasPrice,
|
||||||
|
neonRouterNumSamples: _opts.neonRouterNumSamples,
|
||||||
|
samplerMetrics: _opts.samplerMetrics,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (nativeOrders.length === 0) {
|
if (nativeOrders.length === 0) {
|
||||||
@@ -806,6 +818,8 @@ export class MarketOperationUtils {
|
|||||||
sturdyPenaltyOpts,
|
sturdyPenaltyOpts,
|
||||||
opts.feeSchedule,
|
opts.feeSchedule,
|
||||||
this._sampler.chainId,
|
this._sampler.chainId,
|
||||||
|
opts.neonRouterNumSamples,
|
||||||
|
undefined, // hack: set sampler metrics to undefined to avoid fallback timings
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
const sturdyFills = fills.filter(p => p.length > 0 && !fragileSources.includes(p[0].source));
|
const sturdyFills = fills.filter(p => p.length > 0 && !fragileSources.includes(p[0].source));
|
||||||
@@ -814,6 +828,7 @@ export class MarketOperationUtils {
|
|||||||
sturdyFills,
|
sturdyFills,
|
||||||
inputAmount,
|
inputAmount,
|
||||||
opts.runLimit,
|
opts.runLimit,
|
||||||
|
undefined, // hack: set sampler metrics to undefined to avoid fallback timings
|
||||||
sturdyPenaltyOpts,
|
sturdyPenaltyOpts,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
import { assert } from '@0x/assert';
|
import { assert } from '@0x/assert';
|
||||||
import { ChainId } from '@0x/contract-addresses';
|
import { ChainId } from '@0x/contract-addresses';
|
||||||
import { OptimizerCapture, route, SerializedPath } from '@0x/neon-router';
|
import { OptimizerCapture, route, SerializedPath } from '@0x/neon-router';
|
||||||
import { BigNumber } from '@0x/utils';
|
import { BigNumber, hexUtils } from '@0x/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import { performance } from 'perf_hooks';
|
import { performance } from 'perf_hooks';
|
||||||
|
|
||||||
import { DEFAULT_INFO_LOGGER } from '../../constants';
|
|
||||||
import { MarketOperation, NativeOrderWithFillableAmounts } from '../../types';
|
import { MarketOperation, NativeOrderWithFillableAmounts } from '../../types';
|
||||||
import { VIP_ERC20_BRIDGE_SOURCES_BY_CHAIN_ID } from '../market_operation_utils/constants';
|
import { VIP_ERC20_BRIDGE_SOURCES_BY_CHAIN_ID } from '../market_operation_utils/constants';
|
||||||
|
|
||||||
import { dexSamplesToFills, ethToOutputAmount, nativeOrdersToFills } from './fills';
|
import { dexSamplesToFills, ethToOutputAmount, nativeOrdersToFills } from './fills';
|
||||||
import { DEFAULT_PATH_PENALTY_OPTS, Path, PathPenaltyOpts } from './path';
|
import { DEFAULT_PATH_PENALTY_OPTS, Path, PathPenaltyOpts } from './path';
|
||||||
import { getRate } from './rate_utils';
|
import { getRate } from './rate_utils';
|
||||||
import { DexSample, ERC20BridgeSource, FeeSchedule, Fill, FillData } from './types';
|
import { DexSample, ERC20BridgeSource, FeeSchedule, Fill, FillData, SamplerMetrics } from './types';
|
||||||
|
|
||||||
// tslint:disable: prefer-for-of custom-no-magic-numbers completed-docs no-bitwise
|
// tslint:disable: prefer-for-of custom-no-magic-numbers completed-docs no-bitwise
|
||||||
|
|
||||||
const RUN_LIMIT_DECAY_FACTOR = 0.5;
|
const RUN_LIMIT_DECAY_FACTOR = 0.5;
|
||||||
const RUST_ROUTER_NUM_SAMPLES = 200;
|
|
||||||
const FILL_QUOTE_TRANSFORMER_GAS_OVERHEAD = new BigNumber(150e3);
|
const FILL_QUOTE_TRANSFORMER_GAS_OVERHEAD = new BigNumber(150e3);
|
||||||
// NOTE: The Rust router will panic with less than 3 samples
|
// NOTE: The Rust router will panic with less than 3 samples
|
||||||
const MIN_NUM_SAMPLE_INPUTS = 3;
|
const MIN_NUM_SAMPLE_INPUTS = 3;
|
||||||
@@ -69,21 +67,6 @@ function calculateOuputFee(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use linear interpolation to approximate the output
|
|
||||||
// at a certain input somewhere between the two samples
|
|
||||||
// See https://en.wikipedia.org/wiki/Linear_interpolation
|
|
||||||
const interpolateOutputFromSamples = (
|
|
||||||
left: { input: BigNumber; output: BigNumber },
|
|
||||||
right: { input: BigNumber; output: BigNumber },
|
|
||||||
targetInput: BigNumber,
|
|
||||||
): BigNumber =>
|
|
||||||
left.output.plus(
|
|
||||||
right.output
|
|
||||||
.minus(left.output)
|
|
||||||
.dividedBy(right.input.minus(left.input))
|
|
||||||
.times(targetInput.minus(left.input)),
|
|
||||||
);
|
|
||||||
|
|
||||||
function findRoutesAndCreateOptimalPath(
|
function findRoutesAndCreateOptimalPath(
|
||||||
side: MarketOperation,
|
side: MarketOperation,
|
||||||
samples: DexSample[][],
|
samples: DexSample[][],
|
||||||
@@ -91,29 +74,27 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
input: BigNumber,
|
input: BigNumber,
|
||||||
opts: PathPenaltyOpts,
|
opts: PathPenaltyOpts,
|
||||||
fees: FeeSchedule,
|
fees: FeeSchedule,
|
||||||
|
neonRouterNumSamples: number,
|
||||||
): Path | undefined {
|
): Path | undefined {
|
||||||
const createFill = (sample: DexSample) =>
|
const createFill = (sample: DexSample): Fill | undefined => {
|
||||||
dexSamplesToFills(side, [sample], opts.outputAmountPerEth, opts.inputAmountPerEth, fees)[0];
|
const fills = dexSamplesToFills(side, [sample], opts.outputAmountPerEth, opts.inputAmountPerEth, fees);
|
||||||
// Track sample id's to integers (required by rust router)
|
// NOTE: If the sample has 0 output dexSamplesToFills will return [] because no fill can be created
|
||||||
const sampleIdLookup: { [key: string]: number } = {};
|
if (fills.length === 0) {
|
||||||
let sampleIdCounter = 0;
|
return undefined;
|
||||||
const sampleToId = (source: ERC20BridgeSource, index: number): number => {
|
|
||||||
const key = `${source}-${index}`;
|
|
||||||
if (sampleIdLookup[key]) {
|
|
||||||
return sampleIdLookup[key];
|
|
||||||
} else {
|
|
||||||
sampleIdLookup[key] = ++sampleIdCounter;
|
|
||||||
return sampleIdLookup[key];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return fills[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
const samplesAndNativeOrdersWithResults: Array<DexSample[] | NativeOrderWithFillableAmounts[]> = [];
|
const samplesAndNativeOrdersWithResults: Array<DexSample[] | NativeOrderWithFillableAmounts[]> = [];
|
||||||
const serializedPaths: SerializedPath[] = [];
|
const serializedPaths: SerializedPath[] = [];
|
||||||
|
const sampleSourcePathIds: string[] = [];
|
||||||
for (const singleSourceSamples of samples) {
|
for (const singleSourceSamples of samples) {
|
||||||
if (singleSourceSamples.length === 0) {
|
if (singleSourceSamples.length === 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sourcePathId = hexUtils.random();
|
||||||
const singleSourceSamplesWithOutput = [...singleSourceSamples];
|
const singleSourceSamplesWithOutput = [...singleSourceSamples];
|
||||||
for (let i = singleSourceSamples.length - 1; i >= 0; i--) {
|
for (let i = singleSourceSamples.length - 1; i >= 0; i--) {
|
||||||
if (singleSourceSamples[i].output.isZero()) {
|
if (singleSourceSamples[i].output.isZero()) {
|
||||||
@@ -131,7 +112,7 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
// TODO(kimpers): Do we need to handle 0 entries, from eg Kyber?
|
// TODO(kimpers): Do we need to handle 0 entries, from eg Kyber?
|
||||||
const serializedPath = singleSourceSamplesWithOutput.reduce<SerializedPath>(
|
const serializedPath = singleSourceSamplesWithOutput.reduce<SerializedPath>(
|
||||||
(memo, sample, sampleIdx) => {
|
(memo, sample, sampleIdx) => {
|
||||||
memo.ids.push(sampleToId(sample.source, sampleIdx));
|
memo.ids.push(`${sample.source}-${serializedPaths.length}-${sampleIdx}`);
|
||||||
memo.inputs.push(sample.input.integerValue().toNumber());
|
memo.inputs.push(sample.input.integerValue().toNumber());
|
||||||
memo.outputs.push(sample.output.integerValue().toNumber());
|
memo.outputs.push(sample.output.integerValue().toNumber());
|
||||||
memo.outputFees.push(
|
memo.outputFees.push(
|
||||||
@@ -152,8 +133,10 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
|
|
||||||
samplesAndNativeOrdersWithResults.push(singleSourceSamplesWithOutput);
|
samplesAndNativeOrdersWithResults.push(singleSourceSamplesWithOutput);
|
||||||
serializedPaths.push(serializedPath);
|
serializedPaths.push(serializedPath);
|
||||||
|
sampleSourcePathIds.push(sourcePathId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const nativeOrdersourcePathId = hexUtils.random();
|
||||||
for (const [idx, nativeOrder] of nativeOrders.entries()) {
|
for (const [idx, nativeOrder] of nativeOrders.entries()) {
|
||||||
const { input: normalizedOrderInput, output: normalizedOrderOutput } = nativeOrderToNormalizedAmounts(
|
const { input: normalizedOrderInput, output: normalizedOrderOutput } = nativeOrderToNormalizedAmounts(
|
||||||
side,
|
side,
|
||||||
@@ -164,32 +147,25 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
if (normalizedOrderInput.isLessThanOrEqualTo(0) || normalizedOrderOutput.isLessThanOrEqualTo(0)) {
|
if (normalizedOrderInput.isLessThanOrEqualTo(0) || normalizedOrderOutput.isLessThanOrEqualTo(0)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// HACK: the router requires at minimum 3 samples as a basis for interpolation
|
|
||||||
const inputs = [
|
|
||||||
0,
|
|
||||||
normalizedOrderInput
|
|
||||||
.dividedBy(2)
|
|
||||||
.integerValue()
|
|
||||||
.toNumber(),
|
|
||||||
normalizedOrderInput.integerValue().toNumber(),
|
|
||||||
];
|
|
||||||
const outputs = [
|
|
||||||
0,
|
|
||||||
normalizedOrderOutput
|
|
||||||
.dividedBy(2)
|
|
||||||
.integerValue()
|
|
||||||
.toNumber(),
|
|
||||||
normalizedOrderOutput.integerValue().toNumber(),
|
|
||||||
];
|
|
||||||
// NOTE: same fee no matter if full or partial fill
|
|
||||||
const fee = calculateOuputFee(side, nativeOrder, opts.outputAmountPerEth, opts.inputAmountPerEth, fees)
|
const fee = calculateOuputFee(side, nativeOrder, opts.outputAmountPerEth, opts.inputAmountPerEth, fees)
|
||||||
.integerValue()
|
.integerValue()
|
||||||
.toNumber();
|
.toNumber();
|
||||||
const outputFees = [fee, fee, fee];
|
|
||||||
// NOTE: ids can be the same for all fake samples
|
// HACK: due to an issue with the Rust router interpolation we need to create exactly 13 samples from the native order
|
||||||
const id = sampleToId(ERC20BridgeSource.Native, idx);
|
const ids = [];
|
||||||
const ids = [id, id, id];
|
const inputs = [];
|
||||||
|
const outputs = [];
|
||||||
|
const outputFees = [];
|
||||||
|
for (let i = 1; i <= 13; i++) {
|
||||||
|
const fraction = i / 13;
|
||||||
|
const currentInput = BigNumber.min(normalizedOrderInput.times(fraction), normalizedOrderInput);
|
||||||
|
const currentOutput = BigNumber.min(normalizedOrderOutput.times(fraction), normalizedOrderOutput);
|
||||||
|
const id = `${ERC20BridgeSource.Native}-${serializedPaths.length}-${idx}-${i}`;
|
||||||
|
inputs.push(currentInput.integerValue().toNumber());
|
||||||
|
outputs.push(currentOutput.integerValue().toNumber());
|
||||||
|
outputFees.push(fee);
|
||||||
|
ids.push(id);
|
||||||
|
}
|
||||||
|
|
||||||
const serializedPath: SerializedPath = {
|
const serializedPath: SerializedPath = {
|
||||||
ids,
|
ids,
|
||||||
@@ -200,6 +176,7 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
|
|
||||||
samplesAndNativeOrdersWithResults.push([nativeOrder]);
|
samplesAndNativeOrdersWithResults.push([nativeOrder]);
|
||||||
serializedPaths.push(serializedPath);
|
serializedPaths.push(serializedPath);
|
||||||
|
sampleSourcePathIds.push(nativeOrdersourcePathId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serializedPaths.length === 0) {
|
if (serializedPaths.length === 0) {
|
||||||
@@ -212,30 +189,33 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
pathsIn: serializedPaths,
|
pathsIn: serializedPaths,
|
||||||
};
|
};
|
||||||
|
|
||||||
const before = performance.now();
|
|
||||||
const allSourcesRustRoute = new Float64Array(rustArgs.pathsIn.length);
|
const allSourcesRustRoute = new Float64Array(rustArgs.pathsIn.length);
|
||||||
route(rustArgs, allSourcesRustRoute, RUST_ROUTER_NUM_SAMPLES);
|
const strategySourcesOutputAmounts = new Float64Array(rustArgs.pathsIn.length);
|
||||||
DEFAULT_INFO_LOGGER(
|
route(rustArgs, allSourcesRustRoute, strategySourcesOutputAmounts, neonRouterNumSamples);
|
||||||
{ router: 'neon-router', performanceMs: performance.now() - before, type: 'real' },
|
|
||||||
'Rust router real routing performance',
|
|
||||||
);
|
|
||||||
|
|
||||||
assert.assert(
|
assert.assert(
|
||||||
rustArgs.pathsIn.length === allSourcesRustRoute.length,
|
rustArgs.pathsIn.length === allSourcesRustRoute.length,
|
||||||
'different number of sources in the Router output than the input',
|
'different number of sources in the Router output than the input',
|
||||||
);
|
);
|
||||||
|
assert.assert(
|
||||||
|
rustArgs.pathsIn.length === strategySourcesOutputAmounts.length,
|
||||||
|
'different number of sources in the Router output amounts results than the input',
|
||||||
|
);
|
||||||
|
|
||||||
const routesAndSamples = _.zip(allSourcesRustRoute, samplesAndNativeOrdersWithResults);
|
const routesAndSamplesAndOutputs = _.zip(
|
||||||
|
allSourcesRustRoute,
|
||||||
|
samplesAndNativeOrdersWithResults,
|
||||||
|
strategySourcesOutputAmounts,
|
||||||
|
sampleSourcePathIds,
|
||||||
|
);
|
||||||
const adjustedFills: Fill[] = [];
|
const adjustedFills: Fill[] = [];
|
||||||
const totalRoutedAmount = BigNumber.sum(...allSourcesRustRoute);
|
const totalRoutedAmount = BigNumber.sum(...allSourcesRustRoute);
|
||||||
|
|
||||||
const scale = input.dividedBy(totalRoutedAmount);
|
const scale = input.dividedBy(totalRoutedAmount);
|
||||||
for (const [routeInput, routeSamplesAndNativeOrders] of routesAndSamples) {
|
for (const [routeInput, routeSamplesAndNativeOrders, outputAmount, sourcePathId] of routesAndSamplesAndOutputs) {
|
||||||
if (!routeInput || !routeSamplesAndNativeOrders) {
|
if (!routeInput || !routeSamplesAndNativeOrders || !outputAmount || !Number.isFinite(outputAmount)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// TODO(kimpers): [TKR-241] amounts are sometimes clipped in the router due to precisions loss for number/f64
|
// TODO(kimpers): [TKR-241] amounts are sometimes clipped in the router due to precision loss for number/f64
|
||||||
// we can work around it by scaling it and rounding up. However now we end up with a total amount of a couple base units too much
|
// we can work around it by scaling it and rounding up. However now we end up with a total amount of a couple base units too much
|
||||||
const rustInputAdjusted = BigNumber.min(
|
const rustInputAdjusted = BigNumber.min(
|
||||||
new BigNumber(routeInput).multipliedBy(scale).integerValue(BigNumber.ROUND_CEIL),
|
new BigNumber(routeInput).multipliedBy(scale).integerValue(BigNumber.ROUND_CEIL),
|
||||||
@@ -251,14 +231,21 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
opts.outputAmountPerEth,
|
opts.outputAmountPerEth,
|
||||||
opts.inputAmountPerEth,
|
opts.inputAmountPerEth,
|
||||||
fees,
|
fees,
|
||||||
)[0];
|
)[0] as Fill | undefined;
|
||||||
// NOTE: For Limit/RFQ orders we are done here. No need to scale output
|
// Note: If the order has an adjusted rate of less than or equal to 0 it will be skipped
|
||||||
adjustedFills.push(nativeFill);
|
// and nativeFill will be `undefined`
|
||||||
|
if (nativeFill) {
|
||||||
|
// NOTE: For Limit/RFQ orders we are done here. No need to scale output
|
||||||
|
adjustedFills.push({ ...nativeFill, sourcePathId: sourcePathId ?? hexUtils.random() });
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: For DexSamples only
|
// NOTE: For DexSamples only
|
||||||
let fill = createFill(current);
|
let fill = createFill(current);
|
||||||
|
if (!fill) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const routeSamples = routeSamplesAndNativeOrders as Array<DexSample<FillData>>;
|
const routeSamples = routeSamplesAndNativeOrders as Array<DexSample<FillData>>;
|
||||||
// Descend to approach a closer fill for fillData which may not be consistent
|
// Descend to approach a closer fill for fillData which may not be consistent
|
||||||
// throughout the path (UniswapV3) and for a closer guesstimate at
|
// throughout the path (UniswapV3) and for a closer guesstimate at
|
||||||
@@ -267,49 +254,47 @@ function findRoutesAndCreateOptimalPath(
|
|||||||
assert.assert(routeSamples.length >= 1, 'Found no sample to use for source');
|
assert.assert(routeSamples.length >= 1, 'Found no sample to use for source');
|
||||||
for (let k = routeSamples.length - 1; k >= 0; k--) {
|
for (let k = routeSamples.length - 1; k >= 0; k--) {
|
||||||
if (k === 0) {
|
if (k === 0) {
|
||||||
fill = createFill(routeSamples[0]);
|
fill = createFill(routeSamples[0]) ?? fill;
|
||||||
}
|
}
|
||||||
if (rustInputAdjusted.isGreaterThan(routeSamples[k].input)) {
|
if (rustInputAdjusted.isGreaterThan(routeSamples[k].input)) {
|
||||||
// Between here and the previous fill
|
|
||||||
// HACK: Use the midpoint between the two
|
|
||||||
const left = routeSamples[k];
|
const left = routeSamples[k];
|
||||||
const right = routeSamples[k + 1];
|
const right = routeSamples[k + 1];
|
||||||
if (left && right) {
|
if (left && right) {
|
||||||
// Approximate how much output we get for the input with the surrounding samples
|
fill =
|
||||||
const interpolatedOutput = interpolateOutputFromSamples(
|
createFill({
|
||||||
left,
|
...right, // default to the greater (for gas used)
|
||||||
right,
|
input: rustInputAdjusted,
|
||||||
rustInputAdjusted,
|
output: new BigNumber(outputAmount),
|
||||||
).decimalPlaces(0, side === MarketOperation.Sell ? BigNumber.ROUND_FLOOR : BigNumber.ROUND_CEIL);
|
}) ?? fill;
|
||||||
|
|
||||||
fill = createFill({
|
|
||||||
...right, // default to the greater (for gas used)
|
|
||||||
input: rustInputAdjusted,
|
|
||||||
output: interpolatedOutput,
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
assert.assert(Boolean(left || right), 'No valid sample to use');
|
assert.assert(Boolean(left || right), 'No valid sample to use');
|
||||||
fill = createFill(left || right);
|
fill = createFill(left || right) ?? fill;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const scaleOutput = (output: BigNumber) =>
|
// TODO(kimpers): remove once we have solved the rounding/precision loss issues in the Rust router
|
||||||
|
const scaleOutput = (fillInput: BigNumber, output: BigNumber) =>
|
||||||
output
|
output
|
||||||
.dividedBy(fill.input)
|
.dividedBy(fillInput)
|
||||||
.times(rustInputAdjusted)
|
.times(rustInputAdjusted)
|
||||||
.decimalPlaces(0, side === MarketOperation.Sell ? BigNumber.ROUND_FLOOR : BigNumber.ROUND_CEIL);
|
.decimalPlaces(0, side === MarketOperation.Sell ? BigNumber.ROUND_FLOOR : BigNumber.ROUND_CEIL);
|
||||||
adjustedFills.push({
|
adjustedFills.push({
|
||||||
...fill,
|
...fill,
|
||||||
input: rustInputAdjusted,
|
input: rustInputAdjusted,
|
||||||
output: scaleOutput(fill.output),
|
output: scaleOutput(fill.input, fill.output),
|
||||||
adjustedOutput: scaleOutput(fill.adjustedOutput),
|
adjustedOutput: scaleOutput(fill.input, fill.adjustedOutput),
|
||||||
index: 0,
|
index: 0,
|
||||||
parent: undefined,
|
parent: undefined,
|
||||||
|
sourcePathId: sourcePathId ?? hexUtils.random(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (adjustedFills.length === 0) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
const pathFromRustInputs = Path.create(side, adjustedFills, input);
|
const pathFromRustInputs = Path.create(side, adjustedFills, input);
|
||||||
|
|
||||||
return pathFromRustInputs;
|
return pathFromRustInputs;
|
||||||
@@ -323,15 +308,27 @@ export function findOptimalRustPathFromSamples(
|
|||||||
opts: PathPenaltyOpts,
|
opts: PathPenaltyOpts,
|
||||||
fees: FeeSchedule,
|
fees: FeeSchedule,
|
||||||
chainId: ChainId,
|
chainId: ChainId,
|
||||||
|
neonRouterNumSamples: number,
|
||||||
|
samplerMetrics?: SamplerMetrics,
|
||||||
): Path | undefined {
|
): Path | undefined {
|
||||||
const before = performance.now();
|
const beforeAllTimeMs = performance.now();
|
||||||
const logPerformance = () =>
|
let beforeTimeMs = performance.now();
|
||||||
DEFAULT_INFO_LOGGER(
|
const allSourcesPath = findRoutesAndCreateOptimalPath(
|
||||||
{ router: 'neon-router', performanceMs: performance.now() - before, type: 'total' },
|
side,
|
||||||
'Rust router total routing performance',
|
samples,
|
||||||
);
|
nativeOrders,
|
||||||
|
input,
|
||||||
const allSourcesPath = findRoutesAndCreateOptimalPath(side, samples, nativeOrders, input, opts, fees);
|
opts,
|
||||||
|
fees,
|
||||||
|
neonRouterNumSamples,
|
||||||
|
);
|
||||||
|
// tslint:disable-next-line: no-unused-expression
|
||||||
|
samplerMetrics &&
|
||||||
|
samplerMetrics.logRouterDetails({
|
||||||
|
router: 'neon-router',
|
||||||
|
type: 'all',
|
||||||
|
timingMs: performance.now() - beforeTimeMs,
|
||||||
|
});
|
||||||
if (!allSourcesPath) {
|
if (!allSourcesPath) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
@@ -341,11 +338,27 @@ export function findOptimalRustPathFromSamples(
|
|||||||
// HACK(kimpers): The Rust router currently doesn't account for VIP sources correctly
|
// HACK(kimpers): The Rust router currently doesn't account for VIP sources correctly
|
||||||
// we need to try to route them in isolation and compare with the results all sources
|
// we need to try to route them in isolation and compare with the results all sources
|
||||||
if (vipSources.length > 0) {
|
if (vipSources.length > 0) {
|
||||||
|
beforeTimeMs = performance.now();
|
||||||
const vipSourcesSet = new Set(vipSources);
|
const vipSourcesSet = new Set(vipSources);
|
||||||
const vipSourcesSamples = samples.filter(s => s[0] && vipSourcesSet.has(s[0].source));
|
const vipSourcesSamples = samples.filter(s => s[0] && vipSourcesSet.has(s[0].source));
|
||||||
|
|
||||||
if (vipSourcesSamples.length > 0) {
|
if (vipSourcesSamples.length > 0) {
|
||||||
const vipSourcesPath = findRoutesAndCreateOptimalPath(side, vipSourcesSamples, [], input, opts, fees);
|
const vipSourcesPath = findRoutesAndCreateOptimalPath(
|
||||||
|
side,
|
||||||
|
vipSourcesSamples,
|
||||||
|
[],
|
||||||
|
input,
|
||||||
|
opts,
|
||||||
|
fees,
|
||||||
|
neonRouterNumSamples,
|
||||||
|
);
|
||||||
|
// tslint:disable-next-line: no-unused-expression
|
||||||
|
samplerMetrics &&
|
||||||
|
samplerMetrics.logRouterDetails({
|
||||||
|
router: 'neon-router',
|
||||||
|
type: 'vip',
|
||||||
|
timingMs: performance.now() - beforeTimeMs,
|
||||||
|
});
|
||||||
|
|
||||||
const { input: allSourcesInput, output: allSourcesOutput } = allSourcesPath.adjustedSize();
|
const { input: allSourcesInput, output: allSourcesOutput } = allSourcesPath.adjustedSize();
|
||||||
// NOTE: For sell quotes input is the taker asset and for buy quotes input is the maker asset
|
// NOTE: For sell quotes input is the taker asset and for buy quotes input is the maker asset
|
||||||
@@ -358,13 +371,18 @@ export function findOptimalRustPathFromSamples(
|
|||||||
const allSourcesAdjustedRateWithFqtOverhead = getRate(side, allSourcesInput, outputWithFqtOverhead);
|
const allSourcesAdjustedRateWithFqtOverhead = getRate(side, allSourcesInput, outputWithFqtOverhead);
|
||||||
|
|
||||||
if (vipSourcesPath?.adjustedRate().isGreaterThan(allSourcesAdjustedRateWithFqtOverhead)) {
|
if (vipSourcesPath?.adjustedRate().isGreaterThan(allSourcesAdjustedRateWithFqtOverhead)) {
|
||||||
logPerformance();
|
|
||||||
return vipSourcesPath;
|
return vipSourcesPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// tslint:disable-next-line: no-unused-expression
|
||||||
|
samplerMetrics &&
|
||||||
|
samplerMetrics.logRouterDetails({
|
||||||
|
router: 'neon-router',
|
||||||
|
type: 'total',
|
||||||
|
timingMs: performance.now() - beforeAllTimeMs,
|
||||||
|
});
|
||||||
|
|
||||||
logPerformance();
|
|
||||||
return allSourcesPath;
|
return allSourcesPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,8 +395,10 @@ export async function findOptimalPathJSAsync(
|
|||||||
fills: Fill[][],
|
fills: Fill[][],
|
||||||
targetInput: BigNumber,
|
targetInput: BigNumber,
|
||||||
runLimit: number = 2 ** 8,
|
runLimit: number = 2 ** 8,
|
||||||
|
samplerMetrics?: SamplerMetrics,
|
||||||
opts: PathPenaltyOpts = DEFAULT_PATH_PENALTY_OPTS,
|
opts: PathPenaltyOpts = DEFAULT_PATH_PENALTY_OPTS,
|
||||||
): Promise<Path | undefined> {
|
): Promise<Path | undefined> {
|
||||||
|
const beforeTimeMs = performance.now();
|
||||||
// Sort fill arrays by descending adjusted completed rate.
|
// Sort fill arrays by descending adjusted completed rate.
|
||||||
// Remove any paths which cannot impact the optimal path
|
// Remove any paths which cannot impact the optimal path
|
||||||
const sortedPaths = reducePaths(fillsToSortedPaths(fills, side, targetInput, opts), side);
|
const sortedPaths = reducePaths(fillsToSortedPaths(fills, side, targetInput, opts), side);
|
||||||
@@ -392,7 +412,15 @@ export async function findOptimalPathJSAsync(
|
|||||||
// Yield to event loop.
|
// Yield to event loop.
|
||||||
await Promise.resolve();
|
await Promise.resolve();
|
||||||
}
|
}
|
||||||
return optimalPath.isComplete() ? optimalPath : undefined;
|
const finalPath = optimalPath.isComplete() ? optimalPath : undefined;
|
||||||
|
// tslint:disable-next-line: no-unused-expression
|
||||||
|
samplerMetrics &&
|
||||||
|
samplerMetrics.logRouterDetails({
|
||||||
|
router: 'js',
|
||||||
|
type: 'total',
|
||||||
|
timingMs: performance.now() - beforeTimeMs,
|
||||||
|
});
|
||||||
|
return finalPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort fill arrays by descending adjusted completed rate.
|
// Sort fill arrays by descending adjusted completed rate.
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ import { BatchedOperation, ERC20BridgeSource, LiquidityProviderRegistry, TokenAd
|
|||||||
*/
|
*/
|
||||||
export function getSampleAmounts(maxFillAmount: BigNumber, numSamples: number, expBase: number = 1): BigNumber[] {
|
export function getSampleAmounts(maxFillAmount: BigNumber, numSamples: number, expBase: number = 1): BigNumber[] {
|
||||||
const distribution = [...Array<BigNumber>(numSamples)].map((_v, i) => new BigNumber(expBase).pow(i));
|
const distribution = [...Array<BigNumber>(numSamples)].map((_v, i) => new BigNumber(expBase).pow(i));
|
||||||
const stepSizes = distribution.map(d => d.div(BigNumber.sum(...distribution)));
|
const distributionSum = BigNumber.sum(...distribution);
|
||||||
|
const stepSizes = distribution.map(d => d.div(distributionSum));
|
||||||
const amounts = stepSizes.map((_s, i) => {
|
const amounts = stepSizes.map((_s, i) => {
|
||||||
if (i === numSamples - 1) {
|
if (i === numSamples - 1) {
|
||||||
return maxFillAmount;
|
return maxFillAmount;
|
||||||
|
|||||||
@@ -455,6 +455,10 @@ export interface GetMarketOrdersOpts {
|
|||||||
* Default: 1.25.
|
* Default: 1.25.
|
||||||
*/
|
*/
|
||||||
sampleDistributionBase: number;
|
sampleDistributionBase: number;
|
||||||
|
/**
|
||||||
|
* Number of samples to use when creating fill curves with neon-router
|
||||||
|
*/
|
||||||
|
neonRouterNumSamples: number;
|
||||||
/**
|
/**
|
||||||
* Fees for each liquidity source, expressed in gas.
|
* Fees for each liquidity source, expressed in gas.
|
||||||
*/
|
*/
|
||||||
@@ -514,6 +518,15 @@ export interface SamplerMetrics {
|
|||||||
* @param blockNumber block number of the sampler call
|
* @param blockNumber block number of the sampler call
|
||||||
*/
|
*/
|
||||||
logBlockNumber(blockNumber: BigNumber): void;
|
logBlockNumber(blockNumber: BigNumber): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs the routing timings
|
||||||
|
*
|
||||||
|
* @param data.router The router type (neon-router or js)
|
||||||
|
* @param data.type The type of timing being recorded (e.g total timing, all sources timing or vip timing)
|
||||||
|
* @param data.timingMs The timing in milliseconds
|
||||||
|
*/
|
||||||
|
logRouterDetails(data: { router: 'neon-router' | 'js'; type: 'all' | 'vip' | 'total'; timingMs: number }): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -599,6 +612,8 @@ export interface GenerateOptimizedOrdersOpts {
|
|||||||
allowFallback?: boolean;
|
allowFallback?: boolean;
|
||||||
shouldBatchBridgeOrders?: boolean;
|
shouldBatchBridgeOrders?: boolean;
|
||||||
gasPrice: BigNumber;
|
gasPrice: BigNumber;
|
||||||
|
neonRouterNumSamples: number;
|
||||||
|
samplerMetrics?: SamplerMetrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ComparisonPrice {
|
export interface ComparisonPrice {
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "6.11.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add Optimism addresses",
|
||||||
|
"pr": 385
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1640364306
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "6.10.0",
|
"version": "6.10.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v6.11.0 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Add Optimism addresses (#385)
|
||||||
|
|
||||||
## v6.10.0 - _December 1, 2021_
|
## v6.10.0 - _December 1, 2021_
|
||||||
|
|
||||||
* Add Aave supported FQT addresses for Polygon, Avalanche (#321)
|
* Add Aave supported FQT addresses for Polygon, Avalanche (#321)
|
||||||
|
|||||||
@@ -460,5 +460,47 @@
|
|||||||
"fillQuoteTransformer": "0xa825d4d3c4d2820c52da69fcccf269b4081871f2",
|
"fillQuoteTransformer": "0xa825d4d3c4d2820c52da69fcccf269b4081871f2",
|
||||||
"positiveSlippageFeeTransformer": "0x9ffc7a79133ed5242777e40764777a6d5aab282c"
|
"positiveSlippageFeeTransformer": "0x9ffc7a79133ed5242777e40764777a6d5aab282c"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"erc20Proxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"erc721Proxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"zrxToken": "0x0000000000000000000000000000000000000000",
|
||||||
|
"etherToken": "0x4200000000000000000000000000000000000006",
|
||||||
|
"exchangeV2": "0x0000000000000000000000000000000000000000",
|
||||||
|
"exchange": "0x0000000000000000000000000000000000000000",
|
||||||
|
"assetProxyOwner": "0x0000000000000000000000000000000000000000",
|
||||||
|
"zeroExGovernor": "0x0000000000000000000000000000000000000000",
|
||||||
|
"forwarder": "0x0000000000000000000000000000000000000000",
|
||||||
|
"coordinatorRegistry": "0x0000000000000000000000000000000000000000",
|
||||||
|
"coordinator": "0x0000000000000000000000000000000000000000",
|
||||||
|
"multiAssetProxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"staticCallProxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"erc1155Proxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"devUtils": "0x0000000000000000000000000000000000000000",
|
||||||
|
"zrxVault": "0x0000000000000000000000000000000000000000",
|
||||||
|
"staking": "0x0000000000000000000000000000000000000000",
|
||||||
|
"stakingProxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"erc20BridgeProxy": "0x0000000000000000000000000000000000000000",
|
||||||
|
"erc20BridgeSampler": "0x0000000000000000000000000000000000000000",
|
||||||
|
"chaiBridge": "0x0000000000000000000000000000000000000000",
|
||||||
|
"dydxBridge": "0x0000000000000000000000000000000000000000",
|
||||||
|
"godsUnchainedValidator": "0x0000000000000000000000000000000000000000",
|
||||||
|
"broker": "0x0000000000000000000000000000000000000000",
|
||||||
|
"chainlinkStopLimit": "0x0000000000000000000000000000000000000000",
|
||||||
|
"maximumGasPrice": "0x0000000000000000000000000000000000000000",
|
||||||
|
"dexForwarderBridge": "0x0000000000000000000000000000000000000000",
|
||||||
|
"exchangeProxyGovernor": "0x6d506b2847df0c6f04d2628da1adaf4d8fb2e81b",
|
||||||
|
"exchangeProxy": "0xdef1abe32c034e558cdd535791643c58a13acc10",
|
||||||
|
"exchangeProxyTransformerDeployer": "0x3a539ed6bd42de8fbaf3899fb490c792e153d647",
|
||||||
|
"exchangeProxyFlashWallet": "0xa3128d9b7cca7d5af29780a56abeec12b05a6740",
|
||||||
|
"exchangeProxyLiquidityProviderSandbox": "0x0000000000000000000000000000000000000000",
|
||||||
|
"zrxTreasury": "0x0000000000000000000000000000000000000000",
|
||||||
|
"transformers": {
|
||||||
|
"wethTransformer": "0x02ce7af6520e2862f961f5d7eda746642865179c",
|
||||||
|
"payTakerTransformer": "0x085d10a34f14f6a631ea8ff7d016782ee3ffaa11",
|
||||||
|
"affiliateFeeTransformer": "0x55cf1d7535250db75bf0190493f55781ee583553",
|
||||||
|
"fillQuoteTransformer": "0x3543ef833d28b7e983c293856561f21a7f089f1d",
|
||||||
|
"positiveSlippageFeeTransformer": "0xb11e14565dfbeb702dea9bc0cb47f1a8b32f4783"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contract-addresses",
|
"name": "@0x/contract-addresses",
|
||||||
"version": "6.10.0",
|
"version": "6.11.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ export enum ChainId {
|
|||||||
Avalanche = 43114,
|
Avalanche = 43114,
|
||||||
Fantom = 250,
|
Fantom = 250,
|
||||||
Celo = 42220,
|
Celo = 42220,
|
||||||
|
Optimism = 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "13.18.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1638390144,
|
"timestamp": 1638390144,
|
||||||
"version": "13.18.4",
|
"version": "13.18.4",
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v13.18.5 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v13.18.4 - _December 1, 2021_
|
## v13.18.4 - _December 1, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contract-wrappers",
|
"name": "@0x/contract-wrappers",
|
||||||
"version": "13.18.4",
|
"version": "13.18.5",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^3.0.29",
|
"@0x/assert": "^3.0.29",
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^6.4.2",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/json-schemas": "^6.3.0",
|
"@0x/json-schemas": "^6.3.0",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/types": "^3.3.4",
|
||||||
"@0x/utils": "^6.4.4",
|
"@0x/utils": "^6.4.4",
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "8.1.14",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1638390144,
|
"timestamp": 1638390144,
|
||||||
"version": "8.1.13",
|
"version": "8.1.13",
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v8.1.14 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v8.1.13 - _December 1, 2021_
|
## v8.1.13 - _December 1, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/migrations",
|
"name": "@0x/migrations",
|
||||||
"version": "8.1.13",
|
"version": "8.1.14",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -68,20 +68,20 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^6.4.2",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/contracts-asset-proxy": "^3.7.19",
|
"@0x/contracts-asset-proxy": "^3.7.19",
|
||||||
"@0x/contracts-coordinator": "^3.1.38",
|
"@0x/contracts-coordinator": "^3.1.38",
|
||||||
"@0x/contracts-dev-utils": "^1.3.36",
|
"@0x/contracts-dev-utils": "^1.3.36",
|
||||||
"@0x/contracts-erc1155": "^2.1.37",
|
"@0x/contracts-erc1155": "^2.1.37",
|
||||||
"@0x/contracts-erc20": "^3.3.24",
|
"@0x/contracts-erc20": "^3.3.25",
|
||||||
"@0x/contracts-erc721": "^3.1.37",
|
"@0x/contracts-erc721": "^3.1.37",
|
||||||
"@0x/contracts-exchange": "^3.2.38",
|
"@0x/contracts-exchange": "^3.2.38",
|
||||||
"@0x/contracts-exchange-forwarder": "^4.2.38",
|
"@0x/contracts-exchange-forwarder": "^4.2.38",
|
||||||
"@0x/contracts-extensions": "^6.2.32",
|
"@0x/contracts-extensions": "^6.2.32",
|
||||||
"@0x/contracts-multisig": "^4.1.38",
|
"@0x/contracts-multisig": "^4.1.38",
|
||||||
"@0x/contracts-staking": "^2.0.45",
|
"@0x/contracts-staking": "^2.0.45",
|
||||||
"@0x/contracts-utils": "^4.8.5",
|
"@0x/contracts-utils": "^4.8.6",
|
||||||
"@0x/contracts-zero-ex": "^0.30.0",
|
"@0x/contracts-zero-ex": "^0.30.1",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.7.5",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/subproviders": "^6.6.0",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/typescript-typings": "^5.2.1",
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "1.10.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.10.1 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.10.0 - _December 1, 2021_
|
## v1.10.0 - _December 1, 2021_
|
||||||
|
|
||||||
* Add `AaveV2` and `Compound` deposit/withdrawal liquidity source (#321)
|
* Add `AaveV2` and `Compound` deposit/withdrawal liquidity source (#321)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/protocol-utils",
|
"name": "@0x/protocol-utils",
|
||||||
"version": "1.10.0",
|
"version": "1.10.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -63,8 +63,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^3.0.29",
|
"@0x/assert": "^3.0.29",
|
||||||
"@0x/contract-addresses": "^6.10.0",
|
"@0x/contract-addresses": "^6.11.0",
|
||||||
"@0x/contract-wrappers": "^13.18.4",
|
"@0x/contract-wrappers": "^13.18.5",
|
||||||
"@0x/json-schemas": "^6.3.0",
|
"@0x/json-schemas": "^6.3.0",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/subproviders": "^6.6.0",
|
||||||
"@0x/utils": "^6.4.4",
|
"@0x/utils": "^6.4.4",
|
||||||
|
|||||||
@@ -959,10 +959,10 @@
|
|||||||
typedoc "~0.16.11"
|
typedoc "~0.16.11"
|
||||||
yargs "^10.0.3"
|
yargs "^10.0.3"
|
||||||
|
|
||||||
"@0x/neon-router@^0.2.1":
|
"@0x/neon-router@^0.3.1":
|
||||||
version "0.2.1"
|
version "0.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@0x/neon-router/-/neon-router-0.2.1.tgz#23bb3cedc0eafd55a8ba6b6ea8a59ee4c538064b"
|
resolved "https://registry.yarnpkg.com/@0x/neon-router/-/neon-router-0.3.1.tgz#4ec13e750d1435357c4928d7f2521a2b4376f27e"
|
||||||
integrity sha512-feCCKuox4staZl8lxLY4nf5U256NcDHrgvSFra5cU/TUhoblLHb8F7eWAC9ygpukZUCVFLy13mExkFQHXlEOYw==
|
integrity sha512-M4ypTov9KyxsGJpYwobrld3Y2JOlR7U0XjR6BEQE2gQ1k3nie/1wNEI2J4ZjKw++RLDxdv/RCqhgA5VnINzjxA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@mapbox/node-pre-gyp" "^1.0.5"
|
"@mapbox/node-pre-gyp" "^1.0.5"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user