Compare commits
7 Commits
@0x/contra
...
@0x/contra
Author | SHA1 | Date | |
---|---|---|---|
|
f99804d56a | ||
|
f13d27b749 | ||
|
465fd59cbc | ||
|
5fdabe6612 | ||
|
861871134b | ||
|
c246d98093 | ||
|
02076dba1b |
48
.github/workflows/publish.yml
vendored
Normal file
48
.github/workflows/publish.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
name: publish
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
ci_status:
|
||||||
|
description: 'required CI status'
|
||||||
|
default: 'success'
|
||||||
|
required: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: 'check successful status'
|
||||||
|
run: |
|
||||||
|
REF_STATUS=$(curl -s \
|
||||||
|
'https://api.github.com/repos/${{ github.repository }}/commits/${{ github.ref }}/status' \
|
||||||
|
| jq .state)
|
||||||
|
[[ "${REF_STATUS}" == '"${{ github.event.inputs.ci_status }}"' ]] || \
|
||||||
|
(echo "::error ::${{ github.ref }} does not have a successful CI status" && false)
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: 'development'
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-node@v1
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
node-version: 10
|
||||||
|
- name: 'configure git'
|
||||||
|
run: |
|
||||||
|
git config --global user.email "github-actions@github.com"
|
||||||
|
git config --global user.name "Github Actions"
|
||||||
|
- name: 'install dependencies'
|
||||||
|
run: |
|
||||||
|
yarn -D
|
||||||
|
- name: 'build and publish'
|
||||||
|
run: |
|
||||||
|
echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > .npmrc
|
||||||
|
npm run run:publish:gha
|
||||||
|
env:
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
|
||||||
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
- name: 'merge into main branch'
|
||||||
|
run: |
|
||||||
|
git checkout main && \
|
||||||
|
git merge ${{ github.ref }} && \
|
||||||
|
git push
|
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1603487270,
|
||||||
|
"version": "2.7.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2.7.0",
|
"version": "2.7.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v2.7.1 - _October 23, 2020_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v2.7.0 - _October 21, 2020_
|
## v2.7.0 - _October 21, 2020_
|
||||||
|
|
||||||
* Update curveBridge tests (#2633)
|
* Update curveBridge tests (#2633)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-integrations",
|
"name": "@0x/contracts-integrations",
|
||||||
"version": "2.7.0",
|
"version": "2.7.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
"@0x/contracts-utils": "^4.5.2",
|
"@0x/contracts-utils": "^4.5.2",
|
||||||
"@0x/coordinator-server": "^1.0.5",
|
"@0x/coordinator-server": "^1.0.5",
|
||||||
"@0x/dev-utils": "^3.3.4",
|
"@0x/dev-utils": "^3.3.4",
|
||||||
"@0x/migrations": "^6.4.1",
|
"@0x/migrations": "^6.4.2",
|
||||||
"@0x/order-utils": "^10.4.0",
|
"@0x/order-utils": "^10.4.0",
|
||||||
"@0x/sol-compiler": "^4.2.3",
|
"@0x/sol-compiler": "^4.2.3",
|
||||||
"@0x/tslint-config": "^4.1.3",
|
"@0x/tslint-config": "^4.1.3",
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
"typescript": "3.0.1"
|
"typescript": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/asset-swapper": "0xProject/gitpkg-registry#0x-asset-swapper-v4.6.0-36546480b",
|
"@0x/asset-swapper": "^4.7.1",
|
||||||
"@0x/base-contract": "^6.2.7",
|
"@0x/base-contract": "^6.2.7",
|
||||||
"@0x/contracts-asset-proxy": "^3.5.0",
|
"@0x/contracts-asset-proxy": "^3.5.0",
|
||||||
"@0x/contracts-erc1155": "^2.1.8",
|
"@0x/contracts-erc1155": "^2.1.8",
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
"@0x/contracts-multisig": "^4.1.8",
|
"@0x/contracts-multisig": "^4.1.8",
|
||||||
"@0x/contracts-staking": "^2.0.15",
|
"@0x/contracts-staking": "^2.0.15",
|
||||||
"@0x/contracts-test-utils": "^5.3.5",
|
"@0x/contracts-test-utils": "^5.3.5",
|
||||||
"@0x/contracts-zero-ex": "^0.3.0",
|
"@0x/contracts-zero-ex": "^0.4.0",
|
||||||
"@0x/subproviders": "^6.1.5",
|
"@0x/subproviders": "^6.1.5",
|
||||||
"@0x/types": "^3.2.4",
|
"@0x/types": "^3.2.4",
|
||||||
"@0x/typescript-typings": "^5.1.5",
|
"@0x/typescript-typings": "^5.1.5",
|
||||||
|
@@ -1,4 +1,14 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "0.4.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Use the exchange proxy as the primary allowance target",
|
||||||
|
"pr": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1603487270
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.4.0 - _October 23, 2020_
|
||||||
|
|
||||||
|
* Use the exchange proxy as the primary allowance target (#3)
|
||||||
|
|
||||||
## v0.3.0 - _October 21, 2020_
|
## v0.3.0 - _October 21, 2020_
|
||||||
|
|
||||||
* Internal audit fixes (#2657)
|
* Internal audit fixes (#2657)
|
||||||
|
@@ -31,7 +31,7 @@ import "../storage/LibLiquidityProviderStorage.sol";
|
|||||||
import "../vendor/v3/IERC20Bridge.sol";
|
import "../vendor/v3/IERC20Bridge.sol";
|
||||||
import "./IFeature.sol";
|
import "./IFeature.sol";
|
||||||
import "./ILiquidityProviderFeature.sol";
|
import "./ILiquidityProviderFeature.sol";
|
||||||
import "./ITokenSpenderFeature.sol";
|
import "./libs/LibTokenSpender.sol";
|
||||||
|
|
||||||
|
|
||||||
contract LiquidityProviderFeature is
|
contract LiquidityProviderFeature is
|
||||||
@@ -97,7 +97,7 @@ contract LiquidityProviderFeature is
|
|||||||
weth.deposit{value: sellAmount}();
|
weth.deposit{value: sellAmount}();
|
||||||
weth.transfer(providerAddress, sellAmount);
|
weth.transfer(providerAddress, sellAmount);
|
||||||
} else {
|
} else {
|
||||||
ITokenSpenderFeature(address(this))._spendERC20Tokens(
|
LibTokenSpender.spendERC20Tokens(
|
||||||
IERC20TokenV06(takerToken),
|
IERC20TokenV06(takerToken),
|
||||||
msg.sender,
|
msg.sender,
|
||||||
providerAddress,
|
providerAddress,
|
||||||
|
@@ -32,8 +32,8 @@ import "./libs/LibSignedCallData.sol";
|
|||||||
import "./IMetaTransactionsFeature.sol";
|
import "./IMetaTransactionsFeature.sol";
|
||||||
import "./ITransformERC20Feature.sol";
|
import "./ITransformERC20Feature.sol";
|
||||||
import "./ISignatureValidatorFeature.sol";
|
import "./ISignatureValidatorFeature.sol";
|
||||||
import "./ITokenSpenderFeature.sol";
|
|
||||||
import "./IFeature.sol";
|
import "./IFeature.sol";
|
||||||
|
import "./libs/LibTokenSpender.sol";
|
||||||
|
|
||||||
|
|
||||||
/// @dev MetaTransactions feature.
|
/// @dev MetaTransactions feature.
|
||||||
@@ -279,10 +279,10 @@ contract MetaTransactionsFeature is
|
|||||||
|
|
||||||
// Pay the fee to the sender.
|
// Pay the fee to the sender.
|
||||||
if (mtx.feeAmount > 0) {
|
if (mtx.feeAmount > 0) {
|
||||||
ITokenSpenderFeature(address(this))._spendERC20Tokens(
|
LibTokenSpender.spendERC20Tokens(
|
||||||
mtx.feeToken,
|
mtx.feeToken,
|
||||||
mtx.signer, // From the signer.
|
mtx.signer,
|
||||||
sender, // To the sender.
|
sender,
|
||||||
mtx.feeAmount
|
mtx.feeAmount
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -33,9 +33,9 @@ import "../transformers/IERC20Transformer.sol";
|
|||||||
import "../transformers/LibERC20Transformer.sol";
|
import "../transformers/LibERC20Transformer.sol";
|
||||||
import "./libs/LibSignedCallData.sol";
|
import "./libs/LibSignedCallData.sol";
|
||||||
import "./ITransformERC20Feature.sol";
|
import "./ITransformERC20Feature.sol";
|
||||||
import "./ITokenSpenderFeature.sol";
|
|
||||||
import "./IFeature.sol";
|
import "./IFeature.sol";
|
||||||
import "./ISignatureValidatorFeature.sol";
|
import "./ISignatureValidatorFeature.sol";
|
||||||
|
import "./libs/LibTokenSpender.sol";
|
||||||
|
|
||||||
|
|
||||||
/// @dev Feature to composably transform between ERC20 tokens.
|
/// @dev Feature to composably transform between ERC20 tokens.
|
||||||
@@ -211,8 +211,10 @@ contract TransformERC20Feature is
|
|||||||
// If the input token amount is -1, transform the taker's entire
|
// If the input token amount is -1, transform the taker's entire
|
||||||
// spendable balance.
|
// spendable balance.
|
||||||
if (args.inputTokenAmount == uint256(-1)) {
|
if (args.inputTokenAmount == uint256(-1)) {
|
||||||
args.inputTokenAmount = ITokenSpenderFeature(address(this))
|
args.inputTokenAmount = LibTokenSpender.getSpendableERC20BalanceOf(
|
||||||
.getSpendableERC20BalanceOf(args.inputToken, args.taker);
|
args.inputToken,
|
||||||
|
args.taker
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TransformERC20PrivateState memory state;
|
TransformERC20PrivateState memory state;
|
||||||
@@ -315,12 +317,7 @@ contract TransformERC20Feature is
|
|||||||
// Transfer input tokens.
|
// Transfer input tokens.
|
||||||
if (!LibERC20Transformer.isTokenETH(inputToken)) {
|
if (!LibERC20Transformer.isTokenETH(inputToken)) {
|
||||||
// Token is not ETH, so pull ERC20 tokens.
|
// Token is not ETH, so pull ERC20 tokens.
|
||||||
ITokenSpenderFeature(address(this))._spendERC20Tokens(
|
LibTokenSpender.spendERC20Tokens(inputToken, from, to, amount);
|
||||||
inputToken,
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
amount
|
|
||||||
);
|
|
||||||
} else if (msg.value < amount) {
|
} else if (msg.value < amount) {
|
||||||
// Token is ETH, so the caller must attach enough ETH to the call.
|
// Token is ETH, so the caller must attach enough ETH to the call.
|
||||||
LibTransformERC20RichErrors.InsufficientEthAttachedError(
|
LibTransformERC20RichErrors.InsufficientEthAttachedError(
|
||||||
|
@@ -157,17 +157,49 @@ contract UniswapFeature is
|
|||||||
switch eq(sellToken, ETH_TOKEN_ADDRESS_32)
|
switch eq(sellToken, ETH_TOKEN_ADDRESS_32)
|
||||||
case 0 {
|
case 0 {
|
||||||
// For the first pair we need to transfer sellTokens into the
|
// For the first pair we need to transfer sellTokens into the
|
||||||
// pair contract using `AllowanceTarget.executeCall()`
|
// pair contract.
|
||||||
mstore(0xB00, ALLOWANCE_TARGET_EXECUTE_CALL_SELECTOR_32)
|
mstore(0xB00, TRANSFER_FROM_CALL_SELECTOR_32)
|
||||||
mstore(0xB04, sellToken)
|
mstore(0xB04, caller())
|
||||||
mstore(0xB24, 0x40)
|
mstore(0xB24, pair)
|
||||||
mstore(0xB44, 0x64)
|
mstore(0xB44, sellAmount)
|
||||||
mstore(0xB64, TRANSFER_FROM_CALL_SELECTOR_32)
|
|
||||||
mstore(0xB68, caller())
|
// Copy only the first 32 bytes of return data. We
|
||||||
mstore(0xB88, pair)
|
// only care about reading a boolean in the success
|
||||||
mstore(0xBA8, sellAmount)
|
// case, and we discard the return data in the
|
||||||
if iszero(call(gas(), mload(0xA60), 0, 0xB00, 0xC8, 0x00, 0x0)) {
|
// failure case.
|
||||||
bubbleRevert()
|
let success := call(gas(), sellToken, 0, 0xB00, 0x64, 0xC00, 0x20)
|
||||||
|
|
||||||
|
let rdsize := returndatasize()
|
||||||
|
|
||||||
|
// Check for ERC20 success. ERC20 tokens should
|
||||||
|
// return a boolean, but some return nothing or
|
||||||
|
// extra data. We accept 0-length return data as
|
||||||
|
// success, or at least 32 bytes that starts with
|
||||||
|
// a 32-byte boolean true.
|
||||||
|
success := and(
|
||||||
|
success, // call itself succeeded
|
||||||
|
or(
|
||||||
|
iszero(rdsize), // no return data, or
|
||||||
|
and(
|
||||||
|
iszero(lt(rdsize, 32)), // at least 32 bytes
|
||||||
|
eq(mload(0xC00), 1) // starts with uint256(1)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if iszero(success) {
|
||||||
|
// Try to fall back to the allowance target.
|
||||||
|
mstore(0xB00, ALLOWANCE_TARGET_EXECUTE_CALL_SELECTOR_32)
|
||||||
|
mstore(0xB04, sellToken)
|
||||||
|
mstore(0xB24, 0x40)
|
||||||
|
mstore(0xB44, 0x64)
|
||||||
|
mstore(0xB64, TRANSFER_FROM_CALL_SELECTOR_32)
|
||||||
|
mstore(0xB68, caller())
|
||||||
|
mstore(0xB88, pair)
|
||||||
|
mstore(0xBA8, sellAmount)
|
||||||
|
if iszero(call(gas(), mload(0xA60), 0, 0xB00, 0xC8, 0x00, 0x0)) {
|
||||||
|
bubbleRevert()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default {
|
default {
|
||||||
|
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2020 ZeroEx Intl.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
pragma solidity ^0.6.5;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
||||||
|
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
|
||||||
|
import "../../errors/LibSpenderRichErrors.sol";
|
||||||
|
import "../ITokenSpenderFeature.sol";
|
||||||
|
|
||||||
|
library LibTokenSpender {
|
||||||
|
using LibRichErrorsV06 for bytes;
|
||||||
|
|
||||||
|
/// @dev Transfers ERC20 tokens from `owner` to `to`.
|
||||||
|
/// @param token The token to spend.
|
||||||
|
/// @param owner The owner of the tokens.
|
||||||
|
/// @param to The recipient of the tokens.
|
||||||
|
/// @param amount The amount of `token` to transfer.
|
||||||
|
function spendERC20Tokens(
|
||||||
|
IERC20TokenV06 token,
|
||||||
|
address owner,
|
||||||
|
address to,
|
||||||
|
uint256 amount
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
{
|
||||||
|
bool success;
|
||||||
|
bytes memory revertData;
|
||||||
|
|
||||||
|
require(address(token) != address(this), "LibTokenSpender/CANNOT_INVOKE_SELF");
|
||||||
|
|
||||||
|
assembly {
|
||||||
|
let ptr := mload(0x40) // free memory pointer
|
||||||
|
|
||||||
|
// selector for transferFrom(address,address,uint256)
|
||||||
|
mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
|
||||||
|
mstore(add(ptr, 0x04), owner)
|
||||||
|
mstore(add(ptr, 0x24), to)
|
||||||
|
mstore(add(ptr, 0x44), amount)
|
||||||
|
|
||||||
|
success := call(gas(), token, 0, ptr, 0x64, 0, 0)
|
||||||
|
|
||||||
|
let rdsize := returndatasize()
|
||||||
|
|
||||||
|
returndatacopy(add(ptr, 0x20), 0, rdsize) // reuse memory
|
||||||
|
|
||||||
|
// Check for ERC20 success. ERC20 tokens should return a boolean,
|
||||||
|
// but some don't. We accept 0-length return data as success, or at
|
||||||
|
// least 32 bytes that starts with a 32-byte boolean true.
|
||||||
|
success := and(
|
||||||
|
success, // call itself succeeded
|
||||||
|
or(
|
||||||
|
iszero(rdsize), // no return data, or
|
||||||
|
and(
|
||||||
|
iszero(lt(rdsize, 32)), // at least 32 bytes
|
||||||
|
eq(mload(add(ptr, 0x20)), 1) // starts with uint256(1)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if iszero(success) {
|
||||||
|
// revertData is a bytes, so length-prefixed data
|
||||||
|
mstore(ptr, rdsize)
|
||||||
|
revertData := ptr
|
||||||
|
|
||||||
|
// update free memory pointer (ptr + 32-byte length + return data)
|
||||||
|
mstore(0x40, add(add(ptr, 0x20), rdsize))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
// Try the old AllowanceTarget.
|
||||||
|
try ITokenSpenderFeature(address(this))._spendERC20Tokens(
|
||||||
|
token,
|
||||||
|
owner,
|
||||||
|
to,
|
||||||
|
amount
|
||||||
|
) {
|
||||||
|
} catch {
|
||||||
|
// Bubble up the first error message. (In general, the fallback to the
|
||||||
|
// allowance target is opportunistic. We ignore the specific error
|
||||||
|
// message if it fails.)
|
||||||
|
LibSpenderRichErrors.SpenderERC20TransferFromFailedError(
|
||||||
|
address(token),
|
||||||
|
owner,
|
||||||
|
to,
|
||||||
|
amount,
|
||||||
|
revertData
|
||||||
|
).rrevert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Gets the maximum amount of an ERC20 token `token` that can be
|
||||||
|
/// pulled from `owner` by this address.
|
||||||
|
/// @param token The token to spend.
|
||||||
|
/// @param owner The owner of the tokens.
|
||||||
|
/// @return amount The amount of tokens that can be pulled.
|
||||||
|
function getSpendableERC20BalanceOf(
|
||||||
|
IERC20TokenV06 token,
|
||||||
|
address owner
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
view
|
||||||
|
returns (uint256)
|
||||||
|
{
|
||||||
|
return LibSafeMathV06.min256(
|
||||||
|
token.allowance(owner, address(this)),
|
||||||
|
token.balanceOf(owner)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
72
contracts/zero-ex/contracts/test/TestLibTokenSpender.sol
Normal file
72
contracts/zero-ex/contracts/test/TestLibTokenSpender.sol
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2020 ZeroEx Intl.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
pragma solidity ^0.6.5;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
||||||
|
|
||||||
|
import "../src/features/libs/LibTokenSpender.sol";
|
||||||
|
|
||||||
|
contract TestLibTokenSpender {
|
||||||
|
uint256 constant private TRIGGER_FALLBACK_SUCCESS_AMOUNT = 1340;
|
||||||
|
|
||||||
|
function spendERC20Tokens(
|
||||||
|
IERC20TokenV06 token,
|
||||||
|
address owner,
|
||||||
|
address to,
|
||||||
|
uint256 amount
|
||||||
|
)
|
||||||
|
external
|
||||||
|
{
|
||||||
|
LibTokenSpender.spendERC20Tokens(token, owner, to, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
event FallbackCalled(
|
||||||
|
address token,
|
||||||
|
address owner,
|
||||||
|
address to,
|
||||||
|
uint256 amount
|
||||||
|
);
|
||||||
|
|
||||||
|
// This is called as a fallback when the original transferFrom() fails.
|
||||||
|
function _spendERC20Tokens(
|
||||||
|
IERC20TokenV06 token,
|
||||||
|
address owner,
|
||||||
|
address to,
|
||||||
|
uint256 amount
|
||||||
|
)
|
||||||
|
external
|
||||||
|
{
|
||||||
|
require(amount == TRIGGER_FALLBACK_SUCCESS_AMOUNT,
|
||||||
|
"TokenSpenderFallback/FAILURE_AMOUNT");
|
||||||
|
|
||||||
|
emit FallbackCalled(address(token), owner, to, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSpendableERC20BalanceOf(
|
||||||
|
IERC20TokenV06 token,
|
||||||
|
address owner
|
||||||
|
)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (uint256)
|
||||||
|
{
|
||||||
|
return LibTokenSpender.getSpendableERC20BalanceOf(token, owner);
|
||||||
|
}
|
||||||
|
}
|
@@ -37,6 +37,9 @@ contract TestTokenSpenderERC20Token is
|
|||||||
uint256 constant private EMPTY_RETURN_AMOUNT = 1337;
|
uint256 constant private EMPTY_RETURN_AMOUNT = 1337;
|
||||||
uint256 constant private FALSE_RETURN_AMOUNT = 1338;
|
uint256 constant private FALSE_RETURN_AMOUNT = 1338;
|
||||||
uint256 constant private REVERT_RETURN_AMOUNT = 1339;
|
uint256 constant private REVERT_RETURN_AMOUNT = 1339;
|
||||||
|
uint256 constant private TRIGGER_FALLBACK_SUCCESS_AMOUNT = 1340;
|
||||||
|
uint256 constant private EXTRA_RETURN_TRUE_AMOUNT = 1341;
|
||||||
|
uint256 constant private EXTRA_RETURN_FALSE_AMOUNT = 1342;
|
||||||
|
|
||||||
function transferFrom(address from, address to, uint256 amount)
|
function transferFrom(address from, address to, uint256 amount)
|
||||||
public
|
public
|
||||||
@@ -53,6 +56,19 @@ contract TestTokenSpenderERC20Token is
|
|||||||
if (amount == REVERT_RETURN_AMOUNT) {
|
if (amount == REVERT_RETURN_AMOUNT) {
|
||||||
revert("TestTokenSpenderERC20Token/Revert");
|
revert("TestTokenSpenderERC20Token/Revert");
|
||||||
}
|
}
|
||||||
|
if (amount == TRIGGER_FALLBACK_SUCCESS_AMOUNT) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (amount == EXTRA_RETURN_TRUE_AMOUNT
|
||||||
|
|| amount == EXTRA_RETURN_FALSE_AMOUNT) {
|
||||||
|
bool ret = amount == EXTRA_RETURN_TRUE_AMOUNT;
|
||||||
|
|
||||||
|
assembly {
|
||||||
|
mstore(0x00, ret)
|
||||||
|
mstore(0x20, amount) // just something extra to return
|
||||||
|
return(0, 0x40)
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-zero-ex",
|
"name": "@0x/contracts-zero-ex",
|
||||||
"version": "0.3.0",
|
"version": "0.4.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IAllowanceTarget,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITokenSpenderFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,TokenSpenderFeature,AffiliateFeeTransformer,SignatureValidatorFeature,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature",
|
"publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IAllowanceTarget,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITokenSpenderFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,TokenSpenderFeature,AffiliateFeeTransformer,SignatureValidatorFeature,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature",
|
||||||
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
|
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
|
||||||
"abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|AllowanceTarget|BootstrapFeature|BridgeAdapter|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinReentrancyGuard|FlashWallet|FullMigration|IAllowanceTarget|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IExchange|IFeature|IFlashWallet|IGasToken|ILiquidityProviderFeature|IMetaTransactionsFeature|IOwnableFeature|ISignatureValidatorFeature|ISimpleFunctionRegistryFeature|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibLiquidityProviderRichErrors|LibLiquidityProviderStorage|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignatureRichErrors|LibSignedCallData|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibSpenderRichErrors|LibStorage|LibTokenSpenderStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LogMetadataTransformer|MetaTransactionsFeature|MixinAdapterAddresses|MixinBalancer|MixinCurve|MixinKyber|MixinMStable|MixinMooniswap|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinZeroExBridge|OwnableFeature|PayTakerTransformer|SignatureValidatorFeature|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestDelegateCaller|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFullMigration|TestInitialMigration|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestTokenSpender|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestWeth|TestWethTransformerHost|TestZeroExFeature|TokenSpenderFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|WethTransformer|ZeroEx).json"
|
"abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|AllowanceTarget|BootstrapFeature|BridgeAdapter|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinReentrancyGuard|FlashWallet|FullMigration|IAllowanceTarget|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IExchange|IFeature|IFlashWallet|IGasToken|ILiquidityProviderFeature|IMetaTransactionsFeature|IOwnableFeature|ISignatureValidatorFeature|ISimpleFunctionRegistryFeature|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibLiquidityProviderRichErrors|LibLiquidityProviderStorage|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignatureRichErrors|LibSignedCallData|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibSpenderRichErrors|LibStorage|LibTokenSpender|LibTokenSpenderStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LogMetadataTransformer|MetaTransactionsFeature|MixinAdapterAddresses|MixinBalancer|MixinCurve|MixinKyber|MixinMStable|MixinMooniswap|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinZeroExBridge|OwnableFeature|PayTakerTransformer|SignatureValidatorFeature|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestDelegateCaller|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFullMigration|TestInitialMigration|TestLibTokenSpender|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestTokenSpender|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestWeth|TestWethTransformerHost|TestZeroExFeature|TokenSpenderFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|WethTransformer|ZeroEx).json"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@@ -54,6 +54,7 @@ import * as LibSimpleFunctionRegistryRichErrors from '../test/generated-artifact
|
|||||||
import * as LibSimpleFunctionRegistryStorage from '../test/generated-artifacts/LibSimpleFunctionRegistryStorage.json';
|
import * as LibSimpleFunctionRegistryStorage from '../test/generated-artifacts/LibSimpleFunctionRegistryStorage.json';
|
||||||
import * as LibSpenderRichErrors from '../test/generated-artifacts/LibSpenderRichErrors.json';
|
import * as LibSpenderRichErrors from '../test/generated-artifacts/LibSpenderRichErrors.json';
|
||||||
import * as LibStorage from '../test/generated-artifacts/LibStorage.json';
|
import * as LibStorage from '../test/generated-artifacts/LibStorage.json';
|
||||||
|
import * as LibTokenSpender from '../test/generated-artifacts/LibTokenSpender.json';
|
||||||
import * as LibTokenSpenderStorage from '../test/generated-artifacts/LibTokenSpenderStorage.json';
|
import * as LibTokenSpenderStorage from '../test/generated-artifacts/LibTokenSpenderStorage.json';
|
||||||
import * as LibTransformERC20RichErrors from '../test/generated-artifacts/LibTransformERC20RichErrors.json';
|
import * as LibTransformERC20RichErrors from '../test/generated-artifacts/LibTransformERC20RichErrors.json';
|
||||||
import * as LibTransformERC20Storage from '../test/generated-artifacts/LibTransformERC20Storage.json';
|
import * as LibTransformERC20Storage from '../test/generated-artifacts/LibTransformERC20Storage.json';
|
||||||
@@ -84,6 +85,7 @@ import * as TestFillQuoteTransformerExchange from '../test/generated-artifacts/T
|
|||||||
import * as TestFillQuoteTransformerHost from '../test/generated-artifacts/TestFillQuoteTransformerHost.json';
|
import * as TestFillQuoteTransformerHost from '../test/generated-artifacts/TestFillQuoteTransformerHost.json';
|
||||||
import * as TestFullMigration from '../test/generated-artifacts/TestFullMigration.json';
|
import * as TestFullMigration from '../test/generated-artifacts/TestFullMigration.json';
|
||||||
import * as TestInitialMigration from '../test/generated-artifacts/TestInitialMigration.json';
|
import * as TestInitialMigration from '../test/generated-artifacts/TestInitialMigration.json';
|
||||||
|
import * as TestLibTokenSpender from '../test/generated-artifacts/TestLibTokenSpender.json';
|
||||||
import * as TestMetaTransactionsTransformERC20Feature from '../test/generated-artifacts/TestMetaTransactionsTransformERC20Feature.json';
|
import * as TestMetaTransactionsTransformERC20Feature from '../test/generated-artifacts/TestMetaTransactionsTransformERC20Feature.json';
|
||||||
import * as TestMigrator from '../test/generated-artifacts/TestMigrator.json';
|
import * as TestMigrator from '../test/generated-artifacts/TestMigrator.json';
|
||||||
import * as TestMintableERC20Token from '../test/generated-artifacts/TestMintableERC20Token.json';
|
import * as TestMintableERC20Token from '../test/generated-artifacts/TestMintableERC20Token.json';
|
||||||
@@ -144,6 +146,7 @@ export const artifacts = {
|
|||||||
TransformERC20Feature: TransformERC20Feature as ContractArtifact,
|
TransformERC20Feature: TransformERC20Feature as ContractArtifact,
|
||||||
UniswapFeature: UniswapFeature as ContractArtifact,
|
UniswapFeature: UniswapFeature as ContractArtifact,
|
||||||
LibSignedCallData: LibSignedCallData as ContractArtifact,
|
LibSignedCallData: LibSignedCallData as ContractArtifact,
|
||||||
|
LibTokenSpender: LibTokenSpender as ContractArtifact,
|
||||||
FixinCommon: FixinCommon as ContractArtifact,
|
FixinCommon: FixinCommon as ContractArtifact,
|
||||||
FixinEIP712: FixinEIP712 as ContractArtifact,
|
FixinEIP712: FixinEIP712 as ContractArtifact,
|
||||||
FixinReentrancyGuard: FixinReentrancyGuard as ContractArtifact,
|
FixinReentrancyGuard: FixinReentrancyGuard as ContractArtifact,
|
||||||
@@ -193,6 +196,7 @@ export const artifacts = {
|
|||||||
TestFillQuoteTransformerHost: TestFillQuoteTransformerHost as ContractArtifact,
|
TestFillQuoteTransformerHost: TestFillQuoteTransformerHost as ContractArtifact,
|
||||||
TestFullMigration: TestFullMigration as ContractArtifact,
|
TestFullMigration: TestFullMigration as ContractArtifact,
|
||||||
TestInitialMigration: TestInitialMigration as ContractArtifact,
|
TestInitialMigration: TestInitialMigration as ContractArtifact,
|
||||||
|
TestLibTokenSpender: TestLibTokenSpender as ContractArtifact,
|
||||||
TestMetaTransactionsTransformERC20Feature: TestMetaTransactionsTransformERC20Feature as ContractArtifact,
|
TestMetaTransactionsTransformERC20Feature: TestMetaTransactionsTransformERC20Feature as ContractArtifact,
|
||||||
TestMigrator: TestMigrator as ContractArtifact,
|
TestMigrator: TestMigrator as ContractArtifact,
|
||||||
TestMintTokenERC20Transformer: TestMintTokenERC20Transformer as ContractArtifact,
|
TestMintTokenERC20Transformer: TestMintTokenERC20Transformer as ContractArtifact,
|
||||||
|
@@ -2,12 +2,7 @@ import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contra
|
|||||||
import { blockchainTests, constants, expect, randomAddress, verifyEventsFromLogs } from '@0x/contracts-test-utils';
|
import { blockchainTests, constants, expect, randomAddress, verifyEventsFromLogs } from '@0x/contracts-test-utils';
|
||||||
import { BigNumber, OwnableRevertErrors, ZeroExRevertErrors } from '@0x/utils';
|
import { BigNumber, OwnableRevertErrors, ZeroExRevertErrors } from '@0x/utils';
|
||||||
|
|
||||||
import {
|
import { IOwnableFeatureContract, IZeroExContract, LiquidityProviderFeatureContract } from '../../src/wrappers';
|
||||||
IOwnableFeatureContract,
|
|
||||||
IZeroExContract,
|
|
||||||
LiquidityProviderFeatureContract,
|
|
||||||
TokenSpenderFeatureContract,
|
|
||||||
} from '../../src/wrappers';
|
|
||||||
import { artifacts } from '../artifacts';
|
import { artifacts } from '../artifacts';
|
||||||
import { abis } from '../utils/abis';
|
import { abis } from '../utils/abis';
|
||||||
import { fullMigrateAsync } from '../utils/migration';
|
import { fullMigrateAsync } from '../utils/migration';
|
||||||
@@ -23,16 +18,7 @@ blockchainTests('LiquidityProvider feature', env => {
|
|||||||
|
|
||||||
before(async () => {
|
before(async () => {
|
||||||
[owner, taker] = await env.getAccountAddressesAsync();
|
[owner, taker] = await env.getAccountAddressesAsync();
|
||||||
zeroEx = await fullMigrateAsync(owner, env.provider, env.txDefaults, {
|
zeroEx = await fullMigrateAsync(owner, env.provider, env.txDefaults, {});
|
||||||
tokenSpender: (await TokenSpenderFeatureContract.deployFrom0xArtifactAsync(
|
|
||||||
artifacts.TestTokenSpender,
|
|
||||||
env.provider,
|
|
||||||
env.txDefaults,
|
|
||||||
artifacts,
|
|
||||||
)).address,
|
|
||||||
});
|
|
||||||
const tokenSpender = new TokenSpenderFeatureContract(zeroEx.address, env.provider, env.txDefaults, abis);
|
|
||||||
const allowanceTarget = await tokenSpender.getAllowanceTarget().callAsync();
|
|
||||||
|
|
||||||
token = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
|
token = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
|
||||||
erc20Artifacts.DummyERC20Token,
|
erc20Artifacts.DummyERC20Token,
|
||||||
@@ -52,7 +38,7 @@ blockchainTests('LiquidityProvider feature', env => {
|
|||||||
artifacts,
|
artifacts,
|
||||||
);
|
);
|
||||||
await token
|
await token
|
||||||
.approve(allowanceTarget, constants.INITIAL_ERC20_ALLOWANCE)
|
.approve(zeroEx.address, constants.INITIAL_ERC20_ALLOWANCE)
|
||||||
.awaitTransactionSuccessAsync({ from: taker });
|
.awaitTransactionSuccessAsync({ from: taker });
|
||||||
|
|
||||||
feature = new LiquidityProviderFeatureContract(zeroEx.address, env.provider, env.txDefaults, abis);
|
feature = new LiquidityProviderFeatureContract(zeroEx.address, env.provider, env.txDefaults, abis);
|
||||||
|
@@ -17,7 +17,6 @@ import { artifacts } from '../artifacts';
|
|||||||
import { abis } from '../utils/abis';
|
import { abis } from '../utils/abis';
|
||||||
import { fullMigrateAsync } from '../utils/migration';
|
import { fullMigrateAsync } from '../utils/migration';
|
||||||
import {
|
import {
|
||||||
ITokenSpenderFeatureContract,
|
|
||||||
TestMetaTransactionsTransformERC20FeatureContract,
|
TestMetaTransactionsTransformERC20FeatureContract,
|
||||||
TestMetaTransactionsTransformERC20FeatureEvents,
|
TestMetaTransactionsTransformERC20FeatureEvents,
|
||||||
TestMintableERC20TokenContract,
|
TestMintableERC20TokenContract,
|
||||||
@@ -33,7 +32,6 @@ blockchainTests.resets('MetaTransactions feature', env => {
|
|||||||
let feature: MetaTransactionsFeatureContract;
|
let feature: MetaTransactionsFeatureContract;
|
||||||
let feeToken: TestMintableERC20TokenContract;
|
let feeToken: TestMintableERC20TokenContract;
|
||||||
let transformERC20Feature: TestMetaTransactionsTransformERC20FeatureContract;
|
let transformERC20Feature: TestMetaTransactionsTransformERC20FeatureContract;
|
||||||
let allowanceTarget: string;
|
|
||||||
|
|
||||||
const MAX_FEE_AMOUNT = new BigNumber('1e18');
|
const MAX_FEE_AMOUNT = new BigNumber('1e18');
|
||||||
const TRANSFORM_ERC20_FAILING_VALUE = new BigNumber(666);
|
const TRANSFORM_ERC20_FAILING_VALUE = new BigNumber(666);
|
||||||
@@ -64,14 +62,11 @@ blockchainTests.resets('MetaTransactions feature', env => {
|
|||||||
env.txDefaults,
|
env.txDefaults,
|
||||||
{},
|
{},
|
||||||
);
|
);
|
||||||
allowanceTarget = await new ITokenSpenderFeatureContract(zeroEx.address, env.provider, env.txDefaults)
|
|
||||||
.getAllowanceTarget()
|
|
||||||
.callAsync();
|
|
||||||
// Fund signers with fee tokens.
|
// Fund signers with fee tokens.
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
signers.map(async signer => {
|
signers.map(async signer => {
|
||||||
await feeToken.mint(signer, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync();
|
await feeToken.mint(signer, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync();
|
||||||
await feeToken.approve(allowanceTarget, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync({ from: signer });
|
await feeToken.approve(zeroEx.address, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync({ from: signer });
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@@ -20,7 +20,6 @@ import { abis } from '../utils/abis';
|
|||||||
import { fullMigrateAsync } from '../utils/migration';
|
import { fullMigrateAsync } from '../utils/migration';
|
||||||
import {
|
import {
|
||||||
FlashWalletContract,
|
FlashWalletContract,
|
||||||
ITokenSpenderFeatureContract,
|
|
||||||
TestMintableERC20TokenContract,
|
TestMintableERC20TokenContract,
|
||||||
TestMintTokenERC20TransformerContract,
|
TestMintTokenERC20TransformerContract,
|
||||||
TestMintTokenERC20TransformerEvents,
|
TestMintTokenERC20TransformerEvents,
|
||||||
@@ -42,7 +41,6 @@ blockchainTests.resets('TransformERC20 feature', env => {
|
|||||||
let zeroEx: IZeroExContract;
|
let zeroEx: IZeroExContract;
|
||||||
let feature: TransformERC20FeatureContract;
|
let feature: TransformERC20FeatureContract;
|
||||||
let wallet: FlashWalletContract;
|
let wallet: FlashWalletContract;
|
||||||
let allowanceTarget: string;
|
|
||||||
|
|
||||||
before(async () => {
|
before(async () => {
|
||||||
[owner, taker, sender, transformerDeployer] = await env.getAccountAddressesAsync();
|
[owner, taker, sender, transformerDeployer] = await env.getAccountAddressesAsync();
|
||||||
@@ -67,9 +65,6 @@ blockchainTests.resets('TransformERC20 feature', env => {
|
|||||||
abis,
|
abis,
|
||||||
);
|
);
|
||||||
wallet = new FlashWalletContract(await feature.getTransformWallet().callAsync(), env.provider, env.txDefaults);
|
wallet = new FlashWalletContract(await feature.getTransformWallet().callAsync(), env.provider, env.txDefaults);
|
||||||
allowanceTarget = await new ITokenSpenderFeatureContract(zeroEx.address, env.provider, env.txDefaults)
|
|
||||||
.getAllowanceTarget()
|
|
||||||
.callAsync();
|
|
||||||
await feature.setQuoteSigner(callDataSigner).awaitTransactionSuccessAsync({ from: owner });
|
await feature.setQuoteSigner(callDataSigner).awaitTransactionSuccessAsync({ from: owner });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -173,7 +168,7 @@ blockchainTests.resets('TransformERC20 feature', env => {
|
|||||||
},
|
},
|
||||||
artifacts,
|
artifacts,
|
||||||
);
|
);
|
||||||
await inputToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker });
|
await inputToken.approve(zeroEx.address, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker });
|
||||||
});
|
});
|
||||||
|
|
||||||
interface Transformation {
|
interface Transformation {
|
||||||
|
210
contracts/zero-ex/test/lib_token_spender_test.ts
Normal file
210
contracts/zero-ex/test/lib_token_spender_test.ts
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
import {
|
||||||
|
blockchainTests,
|
||||||
|
expect,
|
||||||
|
getRandomInteger,
|
||||||
|
randomAddress,
|
||||||
|
verifyEventsFromLogs,
|
||||||
|
} from '@0x/contracts-test-utils';
|
||||||
|
import { BigNumber, hexUtils, StringRevertError, ZeroExRevertErrors } from '@0x/utils';
|
||||||
|
|
||||||
|
import { artifacts } from './artifacts';
|
||||||
|
import {
|
||||||
|
TestLibTokenSpenderContract,
|
||||||
|
TestLibTokenSpenderEvents,
|
||||||
|
TestTokenSpenderERC20TokenContract,
|
||||||
|
TestTokenSpenderERC20TokenEvents,
|
||||||
|
} from './wrappers';
|
||||||
|
|
||||||
|
blockchainTests.resets('LibTokenSpender library', env => {
|
||||||
|
let tokenSpender: TestLibTokenSpenderContract;
|
||||||
|
let token: TestTokenSpenderERC20TokenContract;
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
tokenSpender = await TestLibTokenSpenderContract.deployFrom0xArtifactAsync(
|
||||||
|
artifacts.TestLibTokenSpender,
|
||||||
|
env.provider,
|
||||||
|
env.txDefaults,
|
||||||
|
artifacts,
|
||||||
|
);
|
||||||
|
token = await TestTokenSpenderERC20TokenContract.deployFrom0xArtifactAsync(
|
||||||
|
artifacts.TestTokenSpenderERC20Token,
|
||||||
|
env.provider,
|
||||||
|
env.txDefaults,
|
||||||
|
artifacts,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('spendERC20Tokens()', () => {
|
||||||
|
const EMPTY_RETURN_AMOUNT = 1337;
|
||||||
|
const FALSE_RETURN_AMOUNT = 1338;
|
||||||
|
const REVERT_RETURN_AMOUNT = 1339;
|
||||||
|
const TRIGGER_FALLBACK_SUCCESS_AMOUNT = 1340;
|
||||||
|
const EXTRA_RETURN_TRUE_AMOUNT = 1341;
|
||||||
|
const EXTRA_RETURN_FALSE_AMOUNT = 1342;
|
||||||
|
|
||||||
|
it('spendERC20Tokens() successfully calls compliant ERC20 token', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(123456);
|
||||||
|
const receipt = await tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
verifyEventsFromLogs(
|
||||||
|
receipt.logs,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
sender: tokenSpender.address,
|
||||||
|
from: tokenFrom,
|
||||||
|
to: tokenTo,
|
||||||
|
amount: tokenAmount,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
TestTokenSpenderERC20TokenEvents.TransferFromCalled,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spendERC20Tokens() successfully calls non-compliant ERC20 token', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(EMPTY_RETURN_AMOUNT);
|
||||||
|
const receipt = await tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
verifyEventsFromLogs(
|
||||||
|
receipt.logs,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
sender: tokenSpender.address,
|
||||||
|
from: tokenFrom,
|
||||||
|
to: tokenTo,
|
||||||
|
amount: tokenAmount,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
TestTokenSpenderERC20TokenEvents.TransferFromCalled,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spendERC20Tokens() reverts if ERC20 token reverts', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(REVERT_RETURN_AMOUNT);
|
||||||
|
const tx = tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
const expectedError = new ZeroExRevertErrors.Spender.SpenderERC20TransferFromFailedError(
|
||||||
|
token.address,
|
||||||
|
tokenFrom,
|
||||||
|
tokenTo,
|
||||||
|
tokenAmount,
|
||||||
|
new StringRevertError('TestTokenSpenderERC20Token/Revert').encode(),
|
||||||
|
);
|
||||||
|
return expect(tx).to.revertWith(expectedError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spendERC20Tokens() reverts if ERC20 token returns false', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(FALSE_RETURN_AMOUNT);
|
||||||
|
const tx = tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
return expect(tx).to.revertWith(
|
||||||
|
new ZeroExRevertErrors.Spender.SpenderERC20TransferFromFailedError(
|
||||||
|
token.address,
|
||||||
|
tokenFrom,
|
||||||
|
tokenTo,
|
||||||
|
tokenAmount,
|
||||||
|
hexUtils.leftPad(0),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spendERC20Tokens() falls back successfully to TokenSpender._spendERC20Tokens()', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(TRIGGER_FALLBACK_SUCCESS_AMOUNT);
|
||||||
|
const receipt = await tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
verifyEventsFromLogs(
|
||||||
|
receipt.logs,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
token: token.address,
|
||||||
|
owner: tokenFrom,
|
||||||
|
to: tokenTo,
|
||||||
|
amount: tokenAmount,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
TestLibTokenSpenderEvents.FallbackCalled,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spendERC20Tokens() allows extra data after true', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(EXTRA_RETURN_TRUE_AMOUNT);
|
||||||
|
|
||||||
|
const receipt = await tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
verifyEventsFromLogs(
|
||||||
|
receipt.logs,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
sender: tokenSpender.address,
|
||||||
|
from: tokenFrom,
|
||||||
|
to: tokenTo,
|
||||||
|
amount: tokenAmount,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
TestTokenSpenderERC20TokenEvents.TransferFromCalled,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("spendERC20Tokens() reverts when there's extra data after false", async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(EXTRA_RETURN_FALSE_AMOUNT);
|
||||||
|
|
||||||
|
const tx = tokenSpender
|
||||||
|
.spendERC20Tokens(token.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
return expect(tx).to.revertWith(
|
||||||
|
new ZeroExRevertErrors.Spender.SpenderERC20TransferFromFailedError(
|
||||||
|
token.address,
|
||||||
|
tokenFrom,
|
||||||
|
tokenTo,
|
||||||
|
tokenAmount,
|
||||||
|
hexUtils.leftPad(EXTRA_RETURN_FALSE_AMOUNT, 64),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spendERC20Tokens() cannot call self', async () => {
|
||||||
|
const tokenFrom = randomAddress();
|
||||||
|
const tokenTo = randomAddress();
|
||||||
|
const tokenAmount = new BigNumber(123456);
|
||||||
|
|
||||||
|
const tx = tokenSpender
|
||||||
|
.spendERC20Tokens(tokenSpender.address, tokenFrom, tokenTo, tokenAmount)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
return expect(tx).to.revertWith('LibTokenSpender/CANNOT_INVOKE_SELF');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getSpendableERC20BalanceOf()', () => {
|
||||||
|
it("returns the minimum of the owner's balance and allowance", async () => {
|
||||||
|
const balance = getRandomInteger(1, '1e18');
|
||||||
|
const allowance = getRandomInteger(1, '1e18');
|
||||||
|
const tokenOwner = randomAddress();
|
||||||
|
await token
|
||||||
|
.setBalanceAndAllowanceOf(tokenOwner, balance, tokenSpender.address, allowance)
|
||||||
|
.awaitTransactionSuccessAsync();
|
||||||
|
const spendableBalance = await tokenSpender
|
||||||
|
.getSpendableERC20BalanceOf(token.address, tokenOwner)
|
||||||
|
.callAsync();
|
||||||
|
expect(spendableBalance).to.bignumber.eq(BigNumber.min(balance, allowance));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -52,6 +52,7 @@ export * from '../test/generated-wrappers/lib_simple_function_registry_rich_erro
|
|||||||
export * from '../test/generated-wrappers/lib_simple_function_registry_storage';
|
export * from '../test/generated-wrappers/lib_simple_function_registry_storage';
|
||||||
export * from '../test/generated-wrappers/lib_spender_rich_errors';
|
export * from '../test/generated-wrappers/lib_spender_rich_errors';
|
||||||
export * from '../test/generated-wrappers/lib_storage';
|
export * from '../test/generated-wrappers/lib_storage';
|
||||||
|
export * from '../test/generated-wrappers/lib_token_spender';
|
||||||
export * from '../test/generated-wrappers/lib_token_spender_storage';
|
export * from '../test/generated-wrappers/lib_token_spender_storage';
|
||||||
export * from '../test/generated-wrappers/lib_transform_erc20_rich_errors';
|
export * from '../test/generated-wrappers/lib_transform_erc20_rich_errors';
|
||||||
export * from '../test/generated-wrappers/lib_transform_erc20_storage';
|
export * from '../test/generated-wrappers/lib_transform_erc20_storage';
|
||||||
@@ -82,6 +83,7 @@ export * from '../test/generated-wrappers/test_fill_quote_transformer_exchange';
|
|||||||
export * from '../test/generated-wrappers/test_fill_quote_transformer_host';
|
export * from '../test/generated-wrappers/test_fill_quote_transformer_host';
|
||||||
export * from '../test/generated-wrappers/test_full_migration';
|
export * from '../test/generated-wrappers/test_full_migration';
|
||||||
export * from '../test/generated-wrappers/test_initial_migration';
|
export * from '../test/generated-wrappers/test_initial_migration';
|
||||||
|
export * from '../test/generated-wrappers/test_lib_token_spender';
|
||||||
export * from '../test/generated-wrappers/test_meta_transactions_transform_erc20_feature';
|
export * from '../test/generated-wrappers/test_meta_transactions_transform_erc20_feature';
|
||||||
export * from '../test/generated-wrappers/test_migrator';
|
export * from '../test/generated-wrappers/test_migrator';
|
||||||
export * from '../test/generated-wrappers/test_mint_token_erc20_transformer';
|
export * from '../test/generated-wrappers/test_mint_token_erc20_transformer';
|
||||||
|
@@ -76,6 +76,7 @@
|
|||||||
"test/generated-artifacts/LibSimpleFunctionRegistryStorage.json",
|
"test/generated-artifacts/LibSimpleFunctionRegistryStorage.json",
|
||||||
"test/generated-artifacts/LibSpenderRichErrors.json",
|
"test/generated-artifacts/LibSpenderRichErrors.json",
|
||||||
"test/generated-artifacts/LibStorage.json",
|
"test/generated-artifacts/LibStorage.json",
|
||||||
|
"test/generated-artifacts/LibTokenSpender.json",
|
||||||
"test/generated-artifacts/LibTokenSpenderStorage.json",
|
"test/generated-artifacts/LibTokenSpenderStorage.json",
|
||||||
"test/generated-artifacts/LibTransformERC20RichErrors.json",
|
"test/generated-artifacts/LibTransformERC20RichErrors.json",
|
||||||
"test/generated-artifacts/LibTransformERC20Storage.json",
|
"test/generated-artifacts/LibTransformERC20Storage.json",
|
||||||
@@ -106,6 +107,7 @@
|
|||||||
"test/generated-artifacts/TestFillQuoteTransformerHost.json",
|
"test/generated-artifacts/TestFillQuoteTransformerHost.json",
|
||||||
"test/generated-artifacts/TestFullMigration.json",
|
"test/generated-artifacts/TestFullMigration.json",
|
||||||
"test/generated-artifacts/TestInitialMigration.json",
|
"test/generated-artifacts/TestInitialMigration.json",
|
||||||
|
"test/generated-artifacts/TestLibTokenSpender.json",
|
||||||
"test/generated-artifacts/TestMetaTransactionsTransformERC20Feature.json",
|
"test/generated-artifacts/TestMetaTransactionsTransformERC20Feature.json",
|
||||||
"test/generated-artifacts/TestMigrator.json",
|
"test/generated-artifacts/TestMigrator.json",
|
||||||
"test/generated-artifacts/TestMintTokenERC20Transformer.json",
|
"test/generated-artifacts/TestMintTokenERC20Transformer.json",
|
||||||
|
@@ -20,8 +20,10 @@
|
|||||||
"test:publish:circleci": "yarn npm-cli-login -u test -p test -e test@example.com -r http://localhost:4873 && IS_LOCAL_PUBLISH=true run-s script:publish test:installation:local",
|
"test:publish:circleci": "yarn npm-cli-login -u test -p test -e test@example.com -r http://localhost:4873 && IS_LOCAL_PUBLISH=true run-s script:publish test:installation:local",
|
||||||
"run:publish": "run-s install:all script:prepublish_checks rebuild script:publish",
|
"run:publish": "run-s install:all script:prepublish_checks rebuild script:publish",
|
||||||
"run:publish:local": "IS_LOCAL_PUBLISH=true yarn run:publish",
|
"run:publish:local": "IS_LOCAL_PUBLISH=true yarn run:publish",
|
||||||
|
"run:publish:gha": "run-s install:all rebuild script:publish:gha",
|
||||||
"script:prepublish_checks": "node ./node_modules/@0x/monorepo-scripts/lib/prepublish_checks.js",
|
"script:prepublish_checks": "node ./node_modules/@0x/monorepo-scripts/lib/prepublish_checks.js",
|
||||||
"script:publish": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo protocol",
|
"script:publish": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo protocol",
|
||||||
|
"script:publish:gha": "node ./node_modules/@0x/monorepo-scripts/lib/publish.js --repo tools --auto-commit --no-upload-docs --yes",
|
||||||
"install:all": "yarn install",
|
"install:all": "yarn install",
|
||||||
"wsrun": "wsrun",
|
"wsrun": "wsrun",
|
||||||
"lerna": "lerna",
|
"lerna": "lerna",
|
||||||
@@ -64,7 +66,7 @@
|
|||||||
"ignoreDependencyVersionsForPackage": "contract-wrappers"
|
"ignoreDependencyVersionsForPackage": "contract-wrappers"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/monorepo-scripts": "^2.0.3",
|
"@0x/monorepo-scripts": "^2.0.4",
|
||||||
"@0x-lerna-fork/lerna": "3.16.10",
|
"@0x-lerna-fork/lerna": "3.16.10",
|
||||||
"@0xproject/npm-cli-login": "^0.0.11",
|
"@0xproject/npm-cli-login": "^0.0.11",
|
||||||
"async-child-process": "^1.1.1",
|
"async-child-process": "^1.1.1",
|
||||||
|
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1603487270,
|
||||||
|
"version": "4.7.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "4.7.0",
|
"version": "4.7.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v4.7.1 - _October 23, 2020_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v4.7.0 - _October 21, 2020_
|
## v4.7.0 - _October 21, 2020_
|
||||||
|
|
||||||
* Return quoteReport from SwapQuoter functions (#2627)
|
* Return quoteReport from SwapQuoter functions (#2627)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/asset-swapper",
|
"name": "@0x/asset-swapper",
|
||||||
"version": "4.7.0",
|
"version": "4.7.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
"@0x/contracts-test-utils": "^5.3.5",
|
"@0x/contracts-test-utils": "^5.3.5",
|
||||||
"@0x/contracts-utils": "^4.5.2",
|
"@0x/contracts-utils": "^4.5.2",
|
||||||
"@0x/mesh-rpc-client": "^9.4.2",
|
"@0x/mesh-rpc-client": "^9.4.2",
|
||||||
"@0x/migrations": "^6.4.1",
|
"@0x/migrations": "^6.4.2",
|
||||||
"@0x/sol-compiler": "^4.2.3",
|
"@0x/sol-compiler": "^4.2.3",
|
||||||
"@0x/subproviders": "^6.1.5",
|
"@0x/subproviders": "^6.1.5",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contract-wrappers-test",
|
"name": "@0x/contract-wrappers-test",
|
||||||
"version": "12.2.17",
|
"version": "12.2.18",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
"@0x/contract-wrappers": "^13.9.0",
|
"@0x/contract-wrappers": "^13.9.0",
|
||||||
"@0x/contracts-test-utils": "^5.3.5",
|
"@0x/contracts-test-utils": "^5.3.5",
|
||||||
"@0x/dev-utils": "^3.3.4",
|
"@0x/dev-utils": "^3.3.4",
|
||||||
"@0x/migrations": "^6.4.1",
|
"@0x/migrations": "^6.4.2",
|
||||||
"@0x/order-utils": "^10.4.0",
|
"@0x/order-utils": "^10.4.0",
|
||||||
"@0x/subproviders": "^6.1.5",
|
"@0x/subproviders": "^6.1.5",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
|
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1603487270,
|
||||||
|
"version": "6.4.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "6.4.1",
|
"version": "6.4.1",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v6.4.2 - _October 23, 2020_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v6.4.1 - _October 21, 2020_
|
## v6.4.1 - _October 21, 2020_
|
||||||
|
|
||||||
* Change test protocol fee to 70000. (#2637)
|
* Change test protocol fee to 70000. (#2637)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/migrations",
|
"name": "@0x/migrations",
|
||||||
"version": "6.4.1",
|
"version": "6.4.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
"@0x/contracts-multisig": "^4.1.8",
|
"@0x/contracts-multisig": "^4.1.8",
|
||||||
"@0x/contracts-staking": "^2.0.15",
|
"@0x/contracts-staking": "^2.0.15",
|
||||||
"@0x/contracts-utils": "^4.5.2",
|
"@0x/contracts-utils": "^4.5.2",
|
||||||
"@0x/contracts-zero-ex": "^0.3.0",
|
"@0x/contracts-zero-ex": "^0.4.0",
|
||||||
"@0x/sol-compiler": "^4.2.3",
|
"@0x/sol-compiler": "^4.2.3",
|
||||||
"@0x/subproviders": "^6.1.5",
|
"@0x/subproviders": "^6.1.5",
|
||||||
"@0x/typescript-typings": "^5.1.5",
|
"@0x/typescript-typings": "^5.1.5",
|
||||||
|
123
yarn.lock
123
yarn.lock
@@ -749,33 +749,7 @@
|
|||||||
lodash "^4.17.11"
|
lodash "^4.17.11"
|
||||||
valid-url "^1.0.9"
|
valid-url "^1.0.9"
|
||||||
|
|
||||||
"@0x/asset-swapper@0xProject/gitpkg-registry#0x-asset-swapper-v4.6.0-36546480b":
|
"@0x/base-contract@^6.2.7":
|
||||||
version "4.6.0"
|
|
||||||
resolved "https://codeload.github.com/0xProject/gitpkg-registry/tar.gz/4d2c5fc7cc1645b8a65f20c999d66ea2ab8e0048"
|
|
||||||
dependencies:
|
|
||||||
"@0x/assert" "^3.0.9"
|
|
||||||
"@0x/base-contract" "^6.2.3"
|
|
||||||
"@0x/contract-addresses" "^4.11.0"
|
|
||||||
"@0x/contract-wrappers" "^13.8.0"
|
|
||||||
"@0x/json-schemas" "^5.1.0"
|
|
||||||
"@0x/order-utils" "^10.3.0"
|
|
||||||
"@0x/orderbook" "^2.2.7"
|
|
||||||
"@0x/quote-server" "^2.0.2"
|
|
||||||
"@0x/types" "^3.2.0"
|
|
||||||
"@0x/typescript-typings" "^5.1.1"
|
|
||||||
"@0x/utils" "^5.5.1"
|
|
||||||
"@0x/web3-wrapper" "^7.2.0"
|
|
||||||
"@balancer-labs/sor" "0.3.2"
|
|
||||||
"@bancor/sdk" "^0.2.9"
|
|
||||||
axios "^0.19.2"
|
|
||||||
axios-mock-adapter "^1.18.1"
|
|
||||||
decimal.js "^10.2.0"
|
|
||||||
ethereum-types "^3.2.0"
|
|
||||||
ethereumjs-util "^5.1.1"
|
|
||||||
heartbeats "^5.0.1"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
|
|
||||||
"@0x/base-contract@^6.2.3", "@0x/base-contract@^6.2.7":
|
|
||||||
version "6.2.7"
|
version "6.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/@0x/base-contract/-/base-contract-6.2.7.tgz#1d29b2f63f668d39715c1ff64fcf781c0471e209"
|
resolved "https://registry.yarnpkg.com/@0x/base-contract/-/base-contract-6.2.7.tgz#1d29b2f63f668d39715c1ff64fcf781c0471e209"
|
||||||
integrity sha512-R1EbFRyDC6g/0y9oMeUl/nwb9XGMzINR+G1aN1dRqFwJkyGiFJilY1rOkzvvjgdNcr6sdRDs7lxMHKeMloHW4w==
|
integrity sha512-R1EbFRyDC6g/0y9oMeUl/nwb9XGMzINR+G1aN1dRqFwJkyGiFJilY1rOkzvvjgdNcr6sdRDs7lxMHKeMloHW4w==
|
||||||
@@ -938,10 +912,10 @@
|
|||||||
web3-providers "^2.0.0-alpha.1"
|
web3-providers "^2.0.0-alpha.1"
|
||||||
websocket "^1.0.29"
|
websocket "^1.0.29"
|
||||||
|
|
||||||
"@0x/monorepo-scripts@^2.0.3":
|
"@0x/monorepo-scripts@^2.0.4":
|
||||||
version "2.0.3"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/@0x/monorepo-scripts/-/monorepo-scripts-2.0.3.tgz#4766b31329e9323eceb34abedbcff4113ffeb2d1"
|
resolved "https://registry.yarnpkg.com/@0x/monorepo-scripts/-/monorepo-scripts-2.0.4.tgz#26e5d868197e371408a400b22768ef7840d83c0c"
|
||||||
integrity sha512-jqycycIFZb+5g1Am9sOCHojXpqHx+7RPzjx3d4X/X0rQ6C/kct9dcSnWcMxStb9G411BcKjSpkTuW3c1FQeGIg==
|
integrity sha512-swxC+UZFdAKgcCrVpWmgydLNJXdOdTE5g6kiGIsiHMWBxIfAVjbXnHCpri6VYX16Jk2iu04F3STFJ0QlhfQmCA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@0x/types" "^3.2.4"
|
"@0x/types" "^3.2.4"
|
||||||
"@0x/utils" "^5.6.3"
|
"@0x/utils" "^5.6.3"
|
||||||
@@ -978,19 +952,6 @@
|
|||||||
"@0x/order-utils" "^10.3.0"
|
"@0x/order-utils" "^10.3.0"
|
||||||
"@0x/utils" "^5.5.1"
|
"@0x/utils" "^5.5.1"
|
||||||
|
|
||||||
"@0x/quote-server@^2.0.2":
|
|
||||||
version "2.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@0x/quote-server/-/quote-server-2.1.0.tgz#48b4da703116bf373728789ae67dd647616e8332"
|
|
||||||
integrity sha512-b6zDzpF3KygXyRGOREpLklSObJXvhYVSuVVOXQToR94unkzJtY5wsNSC6aRGiKsgDevLA0kDuiz55Ym3UOSxhg==
|
|
||||||
dependencies:
|
|
||||||
"@0x/json-schemas" "^5.0.7"
|
|
||||||
"@0x/order-utils" "^10.2.4"
|
|
||||||
"@0x/utils" "^5.4.1"
|
|
||||||
"@types/express" "^4.17.3"
|
|
||||||
express "^4.17.1"
|
|
||||||
express-async-handler "^1.1.4"
|
|
||||||
http-status-codes "^1.4.0"
|
|
||||||
|
|
||||||
"@0x/quote-server@^3.1.0":
|
"@0x/quote-server@^3.1.0":
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@0x/quote-server/-/quote-server-3.1.0.tgz#ba5c0de9f88fedfd522ec1ef608dd8eebb868509"
|
resolved "https://registry.yarnpkg.com/@0x/quote-server/-/quote-server-3.1.0.tgz#ba5c0de9f88fedfd522ec1ef608dd8eebb868509"
|
||||||
@@ -1276,7 +1237,7 @@
|
|||||||
websocket "^1.0.28"
|
websocket "^1.0.28"
|
||||||
xhr2-cookies "1.1.0"
|
xhr2-cookies "1.1.0"
|
||||||
|
|
||||||
"@0x/web3-wrapper@^7.2.0", "@0x/web3-wrapper@^7.2.4":
|
"@0x/web3-wrapper@^7.2.4":
|
||||||
version "7.2.4"
|
version "7.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-7.2.4.tgz#c66a506900c1144c465b971ae2cad3b580619f1f"
|
resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-7.2.4.tgz#c66a506900c1144c465b971ae2cad3b580619f1f"
|
||||||
integrity sha512-/Rtwd/uVJBXCW40Z+Bp/+wEv4AQCGU+8K7uqYh+dzU3aRsKPpar9pTBEO2wbujTeYQRHfq1SB1zVdAJWrMSBdg==
|
integrity sha512-/Rtwd/uVJBXCW40Z+Bp/+wEv4AQCGU+8K7uqYh+dzU3aRsKPpar9pTBEO2wbujTeYQRHfq1SB1zVdAJWrMSBdg==
|
||||||
@@ -1529,9 +1490,9 @@
|
|||||||
"@ethersproject/logger" "^5.0.5"
|
"@ethersproject/logger" "^5.0.5"
|
||||||
|
|
||||||
"@ethersproject/providers@^5.0.4":
|
"@ethersproject/providers@^5.0.4":
|
||||||
version "5.0.13"
|
version "5.0.14"
|
||||||
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.13.tgz#1ec39e544353e1090803955ba6a1920ee942d6ab"
|
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.14.tgz#751ccb14b4a8c8e9e4be171818c23f4601be90ba"
|
||||||
integrity sha512-5jsuk1FwXxmoQApGs8LSQyS43KP01pHA+6cQ1OPov5pT5Pcqe6ffh6UD1//BZ9Vjf+5e9AQqIk8w7FkGyROuCA==
|
integrity sha512-K9QRRkkHWyprm3g4L8U9aPx5uyivznL4RYemkN2shCQumyGqFJ5SO+OtQrgebVm0JpGwFAUGugnhRUh49sjErw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@ethersproject/abstract-provider" "^5.0.4"
|
"@ethersproject/abstract-provider" "^5.0.4"
|
||||||
"@ethersproject/abstract-signer" "^5.0.4"
|
"@ethersproject/abstract-signer" "^5.0.4"
|
||||||
@@ -2517,9 +2478,9 @@
|
|||||||
"@octokit/types" "^2.0.1"
|
"@octokit/types" "^2.0.1"
|
||||||
|
|
||||||
"@octokit/plugin-request-log@^1.0.0":
|
"@octokit/plugin-request-log@^1.0.0":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e"
|
resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.1.tgz#07e3bfeb94559a2538cdf54d435b097fba6d6fd3"
|
||||||
integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==
|
integrity sha512-d8vmiGAUGswxErdIGfpd0I2UHo2Cs7EaBDpFUZQ9UqYmA0s5/4XoMO4HBld73xGpCj2BvyVyQe2qd9e+/nvKwQ==
|
||||||
|
|
||||||
"@octokit/plugin-rest-endpoint-methods@2.4.0":
|
"@octokit/plugin-rest-endpoint-methods@2.4.0":
|
||||||
version "2.4.0"
|
version "2.4.0"
|
||||||
@@ -2756,9 +2717,9 @@
|
|||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/node@*", "@types/node@>= 8":
|
"@types/node@*", "@types/node@>= 8":
|
||||||
version "14.14.0"
|
version "14.14.2"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.0.tgz#f1091b6ad5de18e8e91bdbd43ec63f13de372538"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb"
|
||||||
integrity sha512-BfbIHP9IapdupGhq/hc+jT5dyiBVZ2DdeC5WwJWQWDb0GijQlzUFAeIQn/2GtvZcd2HVUU7An8felIICFTC2qg==
|
integrity sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==
|
||||||
|
|
||||||
"@types/node@12.12.54":
|
"@types/node@12.12.54":
|
||||||
version "12.12.54"
|
version "12.12.54"
|
||||||
@@ -2766,14 +2727,14 @@
|
|||||||
integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==
|
integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==
|
||||||
|
|
||||||
"@types/node@^10.12.18", "@types/node@^10.3.2":
|
"@types/node@^10.12.18", "@types/node@^10.3.2":
|
||||||
version "10.17.40"
|
version "10.17.42"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.40.tgz#8a50e47daff15fd4a89dc56f5221b3729e506be6"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.42.tgz#90dd71b26fe4f4e2929df6b07e72ef2e9648a173"
|
||||||
integrity sha512-3hZT2z2/531A5pc8hYhn1gU5Qb1SIRSgMLQ6zuHA5xtt16lWAxUGprtr8lJuc9zNJMXEIIBWfSnzqBP/4mglpA==
|
integrity sha512-HElxYF7C/MSkuvlaHB2c+82zhXiuO49Cq056Dol8AQuTph7oJtduo2n6J8rFa+YhJyNgQ/Lm20ZaxqD0vxU0+Q==
|
||||||
|
|
||||||
"@types/node@^12.12.6", "@types/node@^12.6.1":
|
"@types/node@^12.12.6", "@types/node@^12.6.1":
|
||||||
version "12.12.69"
|
version "12.19.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.69.tgz#7cb6a3aa0d16664bf2dcd1450ccb8477464fbd79"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.1.tgz#303f74c8a2b35644594139e948b2be470ae1186f"
|
||||||
integrity sha512-2F2VQRSFmzqgUEXw75L51MgnnZqc6bKWVSUPfrDPzp6mzGGibeVwyQcpvZvBr5RnsoMRHmC8EcBQiobSeqeJxg==
|
integrity sha512-/xaVmBBjOGh55WCqumLAHXU9VhjGtmyTGqJzFBXRWZzByOXI5JAJNx9xPVGEsNizrNwcec92fQMj458MWfjN1A==
|
||||||
|
|
||||||
"@types/normalize-package-data@^2.4.0":
|
"@types/normalize-package-data@^2.4.0":
|
||||||
version "2.4.0"
|
version "2.4.0"
|
||||||
@@ -4511,9 +4472,9 @@ camelcase@^5.0.0, camelcase@^5.3.1:
|
|||||||
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
|
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
|
||||||
|
|
||||||
caniuse-lite@^1.0.30000844:
|
caniuse-lite@^1.0.30000844:
|
||||||
version "1.0.30001148"
|
version "1.0.30001150"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz#dc97c7ed918ab33bf8706ddd5e387287e015d637"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz#6d0d829da654b0b233576de00335586bc2004df1"
|
||||||
integrity sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==
|
integrity sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==
|
||||||
|
|
||||||
caseless@~0.12.0:
|
caseless@~0.12.0:
|
||||||
version "0.12.0"
|
version "0.12.0"
|
||||||
@@ -5307,9 +5268,9 @@ crypto-browserify@3.12.0:
|
|||||||
randomfill "^1.0.3"
|
randomfill "^1.0.3"
|
||||||
|
|
||||||
csstype@^3.0.2:
|
csstype@^3.0.2:
|
||||||
version "3.0.3"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8"
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.4.tgz#b156d7be03b84ff425c9a0a4b1e5f4da9c5ca888"
|
||||||
integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==
|
integrity sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==
|
||||||
|
|
||||||
currently-unhandled@^0.4.1:
|
currently-unhandled@^0.4.1:
|
||||||
version "0.4.1"
|
version "0.4.1"
|
||||||
@@ -5863,9 +5824,9 @@ ee-first@1.1.1:
|
|||||||
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
|
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
|
||||||
|
|
||||||
electron-to-chromium@^1.3.47:
|
electron-to-chromium@^1.3.47:
|
||||||
version "1.3.582"
|
version "1.3.583"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz#1adfac5affce84d85b3d7b3dfbc4ade293a6ffc4"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz#47a9fde74740b1205dba96db2e433132964ba3ee"
|
||||||
integrity sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==
|
integrity sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ==
|
||||||
|
|
||||||
elliptic@6.3.3:
|
elliptic@6.3.3:
|
||||||
version "6.3.3"
|
version "6.3.3"
|
||||||
@@ -6432,7 +6393,7 @@ ethereum-types@^2.2.0-beta.2:
|
|||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
bignumber.js "~9.0.0"
|
bignumber.js "~9.0.0"
|
||||||
|
|
||||||
ethereum-types@^3.2.0, ethereum-types@^3.3.2, ethereum-types@^3.3.3:
|
ethereum-types@^3.3.2, ethereum-types@^3.3.3:
|
||||||
version "3.3.3"
|
version "3.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-3.3.3.tgz#b9328185034ee52efa32176eb6fd9f3e741cb231"
|
resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-3.3.3.tgz#b9328185034ee52efa32176eb6fd9f3e741cb231"
|
||||||
integrity sha512-FWW7ajHqgoqVHhPMX4sY2ycARpPFL8p/64rpToo8awNrJY7rBDnSC8esQYlAPeaiawf9fTM/xAgEm9VKY7J5kg==
|
integrity sha512-FWW7ajHqgoqVHhPMX4sY2ycARpPFL8p/64rpToo8awNrJY7rBDnSC8esQYlAPeaiawf9fTM/xAgEm9VKY7J5kg==
|
||||||
@@ -7586,9 +7547,9 @@ git-up@^4.0.0:
|
|||||||
parse-url "^5.0.0"
|
parse-url "^5.0.0"
|
||||||
|
|
||||||
git-url-parse@^11.1.2:
|
git-url-parse@^11.1.2:
|
||||||
version "11.3.0"
|
version "11.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.3.0.tgz#1515b4574c4eb2efda7d25cc50b29ce8beaefaae"
|
resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.0.tgz#f2bb1f2b00f05552540e95a62e31399a639a6aa6"
|
||||||
integrity sha512-i3XNa8IKmqnUqWBcdWBjOcnyZYfN3C1WRvnKI6ouFWwsXCZEnlgbwbm55ZpJ3OJMhfEP/ryFhqW8bBhej3C5Ug==
|
integrity sha512-KlIa5jvMYLjXMQXkqpFzobsyD/V2K5DRHl5OAf+6oDFPlPLxrGDVQlIdI63c4/Kt6kai4kALENSALlzTGST3GQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
git-up "^4.0.0"
|
git-up "^4.0.0"
|
||||||
|
|
||||||
@@ -9067,9 +9028,9 @@ jsonparse@^1.2.0:
|
|||||||
integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
|
integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
|
||||||
|
|
||||||
jsonschema@^1.2.0, jsonschema@^1.2.4:
|
jsonschema@^1.2.0, jsonschema@^1.2.4:
|
||||||
version "1.3.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.3.0.tgz#def86ca039b4f4254e76528d173462bc5da36162"
|
resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2"
|
||||||
integrity sha512-qg48ckmeeQNPyPAUVIb4Qgmg/U2Kgg5SuEyMs8Z72cnxsw5Ra088U/Foi6sMp/cs7sZ+LNrmvX0Ww+ohE2By0g==
|
integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==
|
||||||
|
|
||||||
jsprim@^1.2.2:
|
jsprim@^1.2.2:
|
||||||
version "1.4.1"
|
version "1.4.1"
|
||||||
@@ -11716,9 +11677,9 @@ public-encrypt@^4.0.0:
|
|||||||
randombytes "^2.0.1"
|
randombytes "^2.0.1"
|
||||||
safe-buffer "^5.1.2"
|
safe-buffer "^5.1.2"
|
||||||
|
|
||||||
"publish-release@git+https://github.com/0xProject/publish-release.git#3f8be1105a356527f4b362ff456d94bf9a82f2ed":
|
"publish-release@https://github.com/0xProject/publish-release.git#3f8be1105a356527f4b362ff456d94bf9a82f2ed":
|
||||||
version "1.3.3"
|
version "1.3.3"
|
||||||
resolved "git+https://github.com/0xProject/publish-release.git#3f8be1105a356527f4b362ff456d94bf9a82f2ed"
|
resolved "https://github.com/0xProject/publish-release.git#3f8be1105a356527f4b362ff456d94bf9a82f2ed"
|
||||||
dependencies:
|
dependencies:
|
||||||
async "^0.9.0"
|
async "^0.9.0"
|
||||||
ghauth "^2.0.0"
|
ghauth "^2.0.0"
|
||||||
@@ -13845,9 +13806,9 @@ trim-right@^1.0.1:
|
|||||||
integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
|
integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
|
||||||
|
|
||||||
truffle@^5.0.32:
|
truffle@^5.0.32:
|
||||||
version "5.1.49"
|
version "5.1.50"
|
||||||
resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.49.tgz#c9edc95192047ff4d170fcad235d26d0c4545de5"
|
resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.50.tgz#78d7f06f0fbd6ec6d5651d4ba90cecf2c16d332f"
|
||||||
integrity sha512-SkCfYRPhruowxH+qpJBAvM0u5+j/LK51U85ErXeiuRhyCNEWMNjUtISHTlEZ0KLr0Kki68iXk+o2UekN4Nlp5g==
|
integrity sha512-SCAn29Z2i713BsUVfxRqM7AcvBuodTfFa1O9IX2KtqYs4/ACjJCp+702aRb63R9NowCeQ8WawrgRbYlmzCtpPA==
|
||||||
dependencies:
|
dependencies:
|
||||||
app-module-path "^2.2.0"
|
app-module-path "^2.2.0"
|
||||||
mocha "8.1.2"
|
mocha "8.1.2"
|
||||||
|
Reference in New Issue
Block a user