Compare commits
	
		
			157 Commits
		
	
	
		
			@0x/contra
			...
			protocol@4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4c3fbe83ac | ||
| 
						 | 
					7caa43d02c | ||
| 
						 | 
					3d4c03c9df | ||
| 
						 | 
					22e1ed35d3 | ||
| 
						 | 
					dabe6fd793 | ||
| 
						 | 
					3cc639c8d0 | ||
| 
						 | 
					22c8e0b6db | ||
| 
						 | 
					f3ca4293bc | ||
| 
						 | 
					db3e076d03 | ||
| 
						 | 
					1a6759820a | ||
| 
						 | 
					61c5e7b948 | ||
| 
						 | 
					5fd78ef32f | ||
| 
						 | 
					14ff9b827c | ||
| 
						 | 
					598dc2cd71 | ||
| 
						 | 
					08e1c5109f | ||
| 
						 | 
					6f7a843742 | ||
| 
						 | 
					c9c9615bb5 | ||
| 
						 | 
					f98609686d | ||
| 
						 | 
					5b8bbc34e8 | ||
| 
						 | 
					49cb00a9ab | ||
| 
						 | 
					74b240fb88 | ||
| 
						 | 
					514f9d2621 | ||
| 
						 | 
					fa78d1092a | ||
| 
						 | 
					297342092b | ||
| 
						 | 
					076f263a86 | ||
| 
						 | 
					0c56207abc | ||
| 
						 | 
					23953d8a5a | ||
| 
						 | 
					c6919eb25a | ||
| 
						 | 
					d509604b52 | ||
| 
						 | 
					a74a3450eb | ||
| 
						 | 
					72c5399b9d | ||
| 
						 | 
					b29196b983 | ||
| 
						 | 
					ce76a7033d | ||
| 
						 | 
					3f4bb933d1 | ||
| 
						 | 
					501b7b9b65 | ||
| 
						 | 
					c0ea88e864 | ||
| 
						 | 
					48f8bea460 | ||
| 
						 | 
					f4e5b6e38d | ||
| 
						 | 
					477cb0a48d | ||
| 
						 | 
					d6bc0a3368 | ||
| 
						 | 
					e544a804c2 | ||
| 
						 | 
					96e0ad7899 | ||
| 
						 | 
					5a1fee5d31 | ||
| 
						 | 
					3557a5e5a9 | ||
| 
						 | 
					0bd43d5265 | ||
| 
						 | 
					8fd7c1b386 | ||
| 
						 | 
					50068750f5 | ||
| 
						 | 
					a7a905de4c | ||
| 
						 | 
					f283108586 | ||
| 
						 | 
					9afe05095a | ||
| 
						 | 
					3dab892978 | ||
| 
						 | 
					e40ddb800e | ||
| 
						 | 
					72a74e7c66 | ||
| 
						 | 
					e8ae64673f | ||
| 
						 | 
					2451f419c8 | ||
| 
						 | 
					2394eb62aa | ||
| 
						 | 
					f9078bb1c3 | ||
| 
						 | 
					bf25c81f1c | ||
| 
						 | 
					03ecc530c3 | ||
| 
						 | 
					d52b1d24d0 | ||
| 
						 | 
					5083fab06a | ||
| 
						 | 
					1249bf9ccc | ||
| 
						 | 
					681f6b3f07 | ||
| 
						 | 
					d3ca1fe96b | ||
| 
						 | 
					9e4f5815e4 | ||
| 
						 | 
					c3c27eaedc | ||
| 
						 | 
					4bf6a23d23 | ||
| 
						 | 
					aaaf0d02de | ||
| 
						 | 
					825cc4d035 | ||
| 
						 | 
					c2d44e5c10 | ||
| 
						 | 
					0efd0860c8 | ||
| 
						 | 
					a890a06664 | ||
| 
						 | 
					5befb87071 | ||
| 
						 | 
					12ba4c373a | ||
| 
						 | 
					7fd25be02e | ||
| 
						 | 
					aa688c4a92 | ||
| 
						 | 
					fb437551c9 | ||
| 
						 | 
					6fa1de7889 | ||
| 
						 | 
					7a42df9a65 | ||
| 
						 | 
					15a508f3ea | ||
| 
						 | 
					b3c20ff909 | ||
| 
						 | 
					682c07cb73 | ||
| 
						 | 
					602605ab4b | ||
| 
						 | 
					0eff2548d5 | ||
| 
						 | 
					93ee681204 | ||
| 
						 | 
					d7bea98075 | ||
| 
						 | 
					437a3b048d | ||
| 
						 | 
					f55a9454b5 | ||
| 
						 | 
					3b03ad0db4 | ||
| 
						 | 
					27d679e1f1 | ||
| 
						 | 
					1e16d59c23 | ||
| 
						 | 
					1e7c9bbb1f | ||
| 
						 | 
					edda1edc50 | ||
| 
						 | 
					d1eb6279b4 | ||
| 
						 | 
					4ace79d947 | ||
| 
						 | 
					e5eee96487 | ||
| 
						 | 
					907adf9145 | ||
| 
						 | 
					c046fe6220 | ||
| 
						 | 
					84bf20de41 | ||
| 
						 | 
					f5a6f74d9a | ||
| 
						 | 
					7c7fc51ccf | ||
| 
						 | 
					fa22f6de0d | ||
| 
						 | 
					4f41214af2 | ||
| 
						 | 
					607b7169bc | ||
| 
						 | 
					1253490a38 | ||
| 
						 | 
					0a37a588e8 | ||
| 
						 | 
					23ee108089 | ||
| 
						 | 
					64feeeea75 | ||
| 
						 | 
					2ebef23b8c | ||
| 
						 | 
					cc9f43ba3b | ||
| 
						 | 
					5f1c139176 | ||
| 
						 | 
					9eea7de340 | ||
| 
						 | 
					4480f84efa | ||
| 
						 | 
					5a8b8afff1 | ||
| 
						 | 
					67c95bc0b7 | ||
| 
						 | 
					e70ec02be8 | ||
| 
						 | 
					db81a94adb | ||
| 
						 | 
					475b608338 | ||
| 
						 | 
					27e36b112e | ||
| 
						 | 
					f698721484 | ||
| 
						 | 
					0c08353b2c | ||
| 
						 | 
					a074b49732 | ||
| 
						 | 
					43b75c7953 | ||
| 
						 | 
					84a78eafc4 | ||
| 
						 | 
					3c1ab889dd | ||
| 
						 | 
					012fff46f6 | ||
| 
						 | 
					6307ebc3a2 | ||
| 
						 | 
					88d7e73eba | ||
| 
						 | 
					9653eb9e70 | ||
| 
						 | 
					ad337271d3 | ||
| 
						 | 
					7591e99316 | ||
| 
						 | 
					ca20df4752 | ||
| 
						 | 
					841e4ee666 | ||
| 
						 | 
					e2ee3414ea | ||
| 
						 | 
					5306cc03e9 | ||
| 
						 | 
					85f5d32de2 | ||
| 
						 | 
					ab698cec14 | ||
| 
						 | 
					b463a39bfa | ||
| 
						 | 
					018e25345b | ||
| 
						 | 
					b60fa8a7d7 | ||
| 
						 | 
					048d8dee60 | ||
| 
						 | 
					927fe2b58b | ||
| 
						 | 
					89948b360c | ||
| 
						 | 
					561b60a24d | ||
| 
						 | 
					4f82543bdf | ||
| 
						 | 
					3133c509f9 | ||
| 
						 | 
					426c15692d | ||
| 
						 | 
					8c87a77faa | ||
| 
						 | 
					d2018f07a2 | ||
| 
						 | 
					d2e57d8163 | ||
| 
						 | 
					7403c0255a | ||
| 
						 | 
					75dcd687e2 | ||
| 
						 | 
					afd4805421 | ||
| 
						 | 
					6aa582d140 | ||
| 
						 | 
					534d92fa00 | ||
| 
						 | 
					37aae134ab | ||
| 
						 | 
					36bd8f68c9 | 
							
								
								
									
										7
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,6 +7,9 @@ on:
 | 
			
		||||
              description: 'required CI status'
 | 
			
		||||
              default: 'success'
 | 
			
		||||
              required: true
 | 
			
		||||
          prerelease:
 | 
			
		||||
              description: 'prerelease name'
 | 
			
		||||
              required: false
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
    publish:
 | 
			
		||||
@@ -21,7 +24,7 @@ jobs:
 | 
			
		||||
                  (echo "::error ::${{ github.ref }} does not have a successful CI status" && false)
 | 
			
		||||
            - uses: actions/checkout@v2
 | 
			
		||||
              with:
 | 
			
		||||
                ref: 'development'
 | 
			
		||||
                ref: ${{ github.ref }}
 | 
			
		||||
                fetch-depth: 0
 | 
			
		||||
            - uses: actions/setup-node@v1
 | 
			
		||||
              with:
 | 
			
		||||
@@ -41,7 +44,9 @@ jobs:
 | 
			
		||||
              env:
 | 
			
		||||
                  NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
 | 
			
		||||
                  GITHUB_TOKEN: ${{ github.token }}
 | 
			
		||||
                  PUBLISH_PRERELEASE: ${{ github.event.inputs.prerelease }}
 | 
			
		||||
            - name: 'merge into main branch'
 | 
			
		||||
              if: github.event.inputs.prerelease == '' # unless it's a prerelease
 | 
			
		||||
              run: |
 | 
			
		||||
                  git checkout main && \
 | 
			
		||||
                  git merge ${{ github.ref }} && \
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -113,6 +113,8 @@ contracts/dev-utils/generated-artifacts/
 | 
			
		||||
contracts/dev-utils/test/generated-artifacts/
 | 
			
		||||
contracts/zero-ex/generated-artifacts/
 | 
			
		||||
contracts/zero-ex/test/generated-artifacts/
 | 
			
		||||
contracts/treasury/generated-artifacts/
 | 
			
		||||
contracts/treasury/test/generated-artifacts/
 | 
			
		||||
 | 
			
		||||
# generated truffle contract artifacts/
 | 
			
		||||
contracts/broker/build/
 | 
			
		||||
@@ -167,6 +169,8 @@ contracts/dev-utils/generated-wrappers/
 | 
			
		||||
contracts/dev-utils/test/generated-wrappers/
 | 
			
		||||
contracts/zero-ex/generated-wrappers/
 | 
			
		||||
contracts/zero-ex/test/generated-wrappers/
 | 
			
		||||
contracts/treasury/generated-wrappers/
 | 
			
		||||
contracts/treasury/test/generated-wrappers/
 | 
			
		||||
 | 
			
		||||
# Doc README copy
 | 
			
		||||
packages/*/docs/README.md
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,10 @@ lib
 | 
			
		||||
/contracts/zero-ex/test/generated-wrappers
 | 
			
		||||
/contracts/zero-ex/generated-artifacts
 | 
			
		||||
/contracts/zero-ex/test/generated-artifacts
 | 
			
		||||
/contracts/treasury/generated-wrappers
 | 
			
		||||
/contracts/treasury/test/generated-wrappers
 | 
			
		||||
/contracts/treasury/generated-artifacts
 | 
			
		||||
/contracts/treasury/test/generated-artifacts
 | 
			
		||||
/contracts/staking/build/
 | 
			
		||||
/contracts/coordinator/build/
 | 
			
		||||
/contracts/exchange/build/
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								.readthedocs.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.readthedocs.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# Read the Docs configuration file
 | 
			
		||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
 | 
			
		||||
 | 
			
		||||
# Required
 | 
			
		||||
version: 2
 | 
			
		||||
 | 
			
		||||
# Build documentation in the docs/ directory with Sphinx
 | 
			
		||||
sphinx:
 | 
			
		||||
  configuration: docs/conf.py
 | 
			
		||||
 | 
			
		||||
# Build documentation with MkDocs
 | 
			
		||||
#mkdocs:
 | 
			
		||||
#  configuration: mkdocs.yml
 | 
			
		||||
 | 
			
		||||
# Optionally build your docs in additional formats such as PDF
 | 
			
		||||
#formats:
 | 
			
		||||
#  - pdf
 | 
			
		||||
 | 
			
		||||
# Optionally set the version of Python and requirements required to build your docs
 | 
			
		||||
python:
 | 
			
		||||
  version: 3.7
 | 
			
		||||
  install:
 | 
			
		||||
    - requirements: docs/requirements.txt
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
        "quotes": ["error", "double"],
 | 
			
		||||
        "separate-by-one-line-in-contract": "error",
 | 
			
		||||
        "space-after-comma": "error",
 | 
			
		||||
        "statement-indent": "error"
 | 
			
		||||
        "statement-indent": "error",
 | 
			
		||||
        "no-empty-blocks": false
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,131 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "3.7.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "3.7.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "3.7.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "3.7.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "3.7.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "3.7.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.7.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.7.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "3.7.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Fix Bancor support of ETH",
 | 
			
		||||
                "pr": 88
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1608105788
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.6.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.6.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.6.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.6.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.6.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.6.4",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.7.8 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.7 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.6 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.5 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.4 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.3 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.2 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.1 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.0 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Fix Bancor support of ETH (#88)
 | 
			
		||||
 | 
			
		||||
## v3.6.9 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.8 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.7 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.6 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.5 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.4 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ pragma solidity ^0.5.9;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol";
 | 
			
		||||
@@ -36,6 +37,20 @@ contract BancorBridge is
 | 
			
		||||
    struct TransferState {
 | 
			
		||||
        address bancorNetworkAddress;
 | 
			
		||||
        address[] path;
 | 
			
		||||
        IEtherToken weth;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Bancor ETH pseudo-address.
 | 
			
		||||
    address constant public BANCOR_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
 | 
			
		||||
 | 
			
		||||
    // solhint-disable no-empty-blocks
 | 
			
		||||
    /// @dev Payable fallback to receive ETH from Bancor/WETH.
 | 
			
		||||
    function ()
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
    {
 | 
			
		||||
        // Poor man's receive in 0.5.9
 | 
			
		||||
        require(msg.data.length == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of
 | 
			
		||||
@@ -60,7 +75,6 @@ contract BancorBridge is
 | 
			
		||||
    {
 | 
			
		||||
        // hold variables to get around stack depth limitations
 | 
			
		||||
        TransferState memory state;
 | 
			
		||||
 | 
			
		||||
        // Decode the bridge data.
 | 
			
		||||
        (
 | 
			
		||||
            state.path,
 | 
			
		||||
@@ -68,34 +82,42 @@ contract BancorBridge is
 | 
			
		||||
        // solhint-disable indent
 | 
			
		||||
        ) = abi.decode(bridgeData, (address[], address));
 | 
			
		||||
        // solhint-enable indent
 | 
			
		||||
        state.weth = IEtherToken(_getWethAddress());
 | 
			
		||||
 | 
			
		||||
        require(state.path.length > 0, "BancorBridge/PATH_MUST_EXIST");
 | 
			
		||||
        // Just transfer the tokens if they're the same.
 | 
			
		||||
        if (state.path[0] == toTokenAddress) {
 | 
			
		||||
            LibERC20Token.transfer(state.path[0], to, amount);
 | 
			
		||||
            return BRIDGE_SUCCESS;
 | 
			
		||||
        require(state.path.length >= 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO");
 | 
			
		||||
 | 
			
		||||
        // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token.
 | 
			
		||||
        uint256 fromTokenBalance;
 | 
			
		||||
        uint256 payableAmount = 0;
 | 
			
		||||
        // If it's ETH in the path then withdraw from WETH
 | 
			
		||||
        // The Bancor path will have ETH as the 0xeee address
 | 
			
		||||
        // Bancor expects to be paid in ETH not WETH
 | 
			
		||||
        if (state.path[0] == BANCOR_ETH_ADDRESS) {
 | 
			
		||||
            fromTokenBalance = state.weth.balanceOf(address(this));
 | 
			
		||||
            state.weth.withdraw(fromTokenBalance);
 | 
			
		||||
            payableAmount = fromTokenBalance;
 | 
			
		||||
        } else {
 | 
			
		||||
            fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
			
		||||
            LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Otherwise use Bancor to convert
 | 
			
		||||
        require(state.path.length > 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO");
 | 
			
		||||
        require(state.path[state.path.length - 1] == toTokenAddress, "BancorBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN");
 | 
			
		||||
        
 | 
			
		||||
        // // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token.
 | 
			
		||||
        uint256 fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
			
		||||
        LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance);
 | 
			
		||||
 | 
			
		||||
        // Convert the tokens
 | 
			
		||||
        uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath(
 | 
			
		||||
        uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath.value(payableAmount)(
 | 
			
		||||
            state.path, // path originating with source token and terminating in destination token
 | 
			
		||||
            fromTokenBalance, // amount of source token to trade
 | 
			
		||||
            amount, // minimum amount of destination token expected to receive
 | 
			
		||||
            to, // beneficiary
 | 
			
		||||
            state.path[state.path.length-1] == BANCOR_ETH_ADDRESS ? address(this) : to, // beneficiary
 | 
			
		||||
            address(0), // affiliateAccount; no fee paid
 | 
			
		||||
            0 // affiliateFee; no fee paid
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if (state.path[state.path.length-1] == BANCOR_ETH_ADDRESS) {
 | 
			
		||||
            state.weth.deposit.value(boughtAmount)();
 | 
			
		||||
            state.weth.transfer(to, boughtAmount);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        emit ERC20BridgeTransfer(
 | 
			
		||||
            state.path[0], // fromTokenAddress
 | 
			
		||||
            state.path[0] == BANCOR_ETH_ADDRESS ? address(state.weth) : state.path[0],
 | 
			
		||||
            toTokenAddress,
 | 
			
		||||
            fromTokenBalance,
 | 
			
		||||
            boughtAmount,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										136
									
								
								contracts/asset-proxy/contracts/src/bridges/CryptoComBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								contracts/asset-proxy/contracts/src/bridges/CryptoComBridge.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  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.5.9;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/LibAddressArray.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol";
 | 
			
		||||
import "../interfaces/IUniswapV2Router01.sol";
 | 
			
		||||
import "../interfaces/IERC20Bridge.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// solhint-disable space-after-comma
 | 
			
		||||
// solhint-disable not-rely-on-time
 | 
			
		||||
contract CryptoComBridge is
 | 
			
		||||
    IERC20Bridge,
 | 
			
		||||
    IWallet,
 | 
			
		||||
    DeploymentConstants
 | 
			
		||||
{
 | 
			
		||||
    struct TransferState {
 | 
			
		||||
        address[] path;
 | 
			
		||||
        address router;
 | 
			
		||||
        uint256 fromTokenBalance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of
 | 
			
		||||
    ///      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress`
 | 
			
		||||
    ///      token encoded in the bridge data.
 | 
			
		||||
    /// @param toTokenAddress The token to buy and transfer to `to`.
 | 
			
		||||
    /// @param from The maker (this contract).
 | 
			
		||||
    /// @param to The recipient of the bought tokens.
 | 
			
		||||
    /// @param amount Minimum amount of `toTokenAddress` tokens to buy.
 | 
			
		||||
    /// @param bridgeData The abi-encoded path of token addresses. Last element must be toTokenAddress
 | 
			
		||||
    /// @return success The magic bytes if successful.
 | 
			
		||||
    function bridgeTransferFrom(
 | 
			
		||||
        address toTokenAddress,
 | 
			
		||||
        address from,
 | 
			
		||||
        address to,
 | 
			
		||||
        uint256 amount,
 | 
			
		||||
        bytes calldata bridgeData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (bytes4 success)
 | 
			
		||||
    {
 | 
			
		||||
        // hold variables to get around stack depth limitations
 | 
			
		||||
        TransferState memory state;
 | 
			
		||||
 | 
			
		||||
        // Decode the bridge data to get the `fromTokenAddress`.
 | 
			
		||||
        // solhint-disable indent
 | 
			
		||||
        (state.path, state.router) = abi.decode(bridgeData, (address[], address));
 | 
			
		||||
        // solhint-enable indent
 | 
			
		||||
 | 
			
		||||
        require(state.path.length >= 2, "CryptoComBridge/PATH_LENGTH_MUST_BE_AT_LEAST_TWO");
 | 
			
		||||
        require(state.path[state.path.length - 1] == toTokenAddress, "CryptoComBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN");
 | 
			
		||||
 | 
			
		||||
        // Just transfer the tokens if they're the same.
 | 
			
		||||
        if (state.path[0] == toTokenAddress) {
 | 
			
		||||
            LibERC20Token.transfer(state.path[0], to, amount);
 | 
			
		||||
            return BRIDGE_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get our balance of `fromTokenAddress` token.
 | 
			
		||||
        state.fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
			
		||||
 | 
			
		||||
        // Grant the SushiSwap router an allowance.
 | 
			
		||||
        LibERC20Token.approveIfBelow(
 | 
			
		||||
            state.path[0],
 | 
			
		||||
            state.router,
 | 
			
		||||
            state.fromTokenBalance
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Buy as much `toTokenAddress` token with `fromTokenAddress` token
 | 
			
		||||
        // and transfer it to `to`.
 | 
			
		||||
        IUniswapV2Router01 router = IUniswapV2Router01(state.router);
 | 
			
		||||
        uint[] memory amounts = router.swapExactTokensForTokens(
 | 
			
		||||
             // Sell all tokens we hold.
 | 
			
		||||
            state.fromTokenBalance,
 | 
			
		||||
             // Minimum buy amount.
 | 
			
		||||
            amount,
 | 
			
		||||
            // Convert `fromTokenAddress` to `toTokenAddress`.
 | 
			
		||||
            state.path,
 | 
			
		||||
            // Recipient is `to`.
 | 
			
		||||
            to,
 | 
			
		||||
            // Expires after this block.
 | 
			
		||||
            block.timestamp
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        emit ERC20BridgeTransfer(
 | 
			
		||||
            // input token
 | 
			
		||||
            state.path[0],
 | 
			
		||||
            // output token
 | 
			
		||||
            toTokenAddress,
 | 
			
		||||
            // input token amount
 | 
			
		||||
            state.fromTokenBalance,
 | 
			
		||||
            // output token amount
 | 
			
		||||
            amounts[amounts.length - 1],
 | 
			
		||||
            from,
 | 
			
		||||
            to
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return BRIDGE_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker
 | 
			
		||||
    ///      and sign for itself in orders. Always succeeds.
 | 
			
		||||
    /// @return magicValue Success bytes, always.
 | 
			
		||||
    function isValidSignature(
 | 
			
		||||
        bytes32,
 | 
			
		||||
        bytes calldata
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (bytes4 magicValue)
 | 
			
		||||
    {
 | 
			
		||||
        return LEGACY_WALLET_MAGIC_VALUE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -56,11 +56,14 @@ contract KyberBridge is
 | 
			
		||||
    uint256 constant private KYBER_RATE_BASE = 10 ** 18;
 | 
			
		||||
 | 
			
		||||
    // solhint-disable no-empty-blocks
 | 
			
		||||
    /// @dev Payable fallback to receive ETH from Kyber.
 | 
			
		||||
    /// @dev Payable fallback to receive ETH from Kyber/WETH.
 | 
			
		||||
    function ()
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
    {}
 | 
			
		||||
    {
 | 
			
		||||
        // Poor man's receive in 0.5.9
 | 
			
		||||
        require(msg.data.length == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of
 | 
			
		||||
    ///      `toTokenAddress` tokens by selling the entirety of the opposing asset
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-asset-proxy",
 | 
			
		||||
    "version": "3.6.4",
 | 
			
		||||
    "version": "3.7.8",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -38,7 +38,7 @@
 | 
			
		||||
        "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|SnowSwapBridge|StaticCallProxy|SushiSwapBridge|SwerveBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CryptoComBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|SnowSwapBridge|StaticCallProxy|SushiSwapBridge|SwerveBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
@@ -51,13 +51,13 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.9.5",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.14.0",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
@@ -79,17 +79,17 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.13",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.13",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.26",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import * as BalancerBridge from '../generated-artifacts/BalancerBridge.json';
 | 
			
		||||
import * as BancorBridge from '../generated-artifacts/BancorBridge.json';
 | 
			
		||||
import * as ChaiBridge from '../generated-artifacts/ChaiBridge.json';
 | 
			
		||||
import * as CreamBridge from '../generated-artifacts/CreamBridge.json';
 | 
			
		||||
import * as CryptoComBridge from '../generated-artifacts/CryptoComBridge.json';
 | 
			
		||||
import * as CurveBridge from '../generated-artifacts/CurveBridge.json';
 | 
			
		||||
import * as DexForwarderBridge from '../generated-artifacts/DexForwarderBridge.json';
 | 
			
		||||
import * as DODOBridge from '../generated-artifacts/DODOBridge.json';
 | 
			
		||||
@@ -77,6 +78,7 @@ export const artifacts = {
 | 
			
		||||
    BancorBridge: BancorBridge as ContractArtifact,
 | 
			
		||||
    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
			
		||||
    CreamBridge: CreamBridge as ContractArtifact,
 | 
			
		||||
    CryptoComBridge: CryptoComBridge as ContractArtifact,
 | 
			
		||||
    CurveBridge: CurveBridge as ContractArtifact,
 | 
			
		||||
    DODOBridge: DODOBridge as ContractArtifact,
 | 
			
		||||
    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ export * from '../generated-wrappers/balancer_bridge';
 | 
			
		||||
export * from '../generated-wrappers/bancor_bridge';
 | 
			
		||||
export * from '../generated-wrappers/chai_bridge';
 | 
			
		||||
export * from '../generated-wrappers/cream_bridge';
 | 
			
		||||
export * from '../generated-wrappers/crypto_com_bridge';
 | 
			
		||||
export * from '../generated-wrappers/curve_bridge';
 | 
			
		||||
export * from '../generated-wrappers/d_o_d_o_bridge';
 | 
			
		||||
export * from '../generated-wrappers/dex_forwarder_bridge';
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import * as BalancerBridge from '../test/generated-artifacts/BalancerBridge.json
 | 
			
		||||
import * as BancorBridge from '../test/generated-artifacts/BancorBridge.json';
 | 
			
		||||
import * as ChaiBridge from '../test/generated-artifacts/ChaiBridge.json';
 | 
			
		||||
import * as CreamBridge from '../test/generated-artifacts/CreamBridge.json';
 | 
			
		||||
import * as CryptoComBridge from '../test/generated-artifacts/CryptoComBridge.json';
 | 
			
		||||
import * as CurveBridge from '../test/generated-artifacts/CurveBridge.json';
 | 
			
		||||
import * as DexForwarderBridge from '../test/generated-artifacts/DexForwarderBridge.json';
 | 
			
		||||
import * as DODOBridge from '../test/generated-artifacts/DODOBridge.json';
 | 
			
		||||
@@ -77,6 +78,7 @@ export const artifacts = {
 | 
			
		||||
    BancorBridge: BancorBridge as ContractArtifact,
 | 
			
		||||
    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
			
		||||
    CreamBridge: CreamBridge as ContractArtifact,
 | 
			
		||||
    CryptoComBridge: CryptoComBridge as ContractArtifact,
 | 
			
		||||
    CurveBridge: CurveBridge as ContractArtifact,
 | 
			
		||||
    DODOBridge: DODOBridge as ContractArtifact,
 | 
			
		||||
    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -12,13 +12,11 @@ import { DecodedLogs } from 'ethereum-types';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from './artifacts';
 | 
			
		||||
 | 
			
		||||
import { TestBancorBridgeContract } from './generated-wrappers/test_bancor_bridge';
 | 
			
		||||
import {
 | 
			
		||||
    TestBancorBridgeConvertByPathInputEventArgs as ConvertByPathArgs,
 | 
			
		||||
    TestBancorBridgeEvents as ContractEvents,
 | 
			
		||||
    TestBancorBridgeTokenApproveEventArgs as TokenApproveArgs,
 | 
			
		||||
    TestBancorBridgeTokenTransferEventArgs as TokenTransferArgs,
 | 
			
		||||
} from './wrappers';
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('Bancor unit tests', env => {
 | 
			
		||||
@@ -128,24 +126,6 @@ blockchainTests.resets('Bancor unit tests', env => {
 | 
			
		||||
            expect(result).to.eq(AssetProxyId.ERC20Bridge);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('performs transfer when both tokens are the same', async () => {
 | 
			
		||||
            const createTokenFn = testContract.createToken(constants.NULL_ADDRESS);
 | 
			
		||||
            const tokenAddress = await createTokenFn.callAsync();
 | 
			
		||||
            await createTokenFn.awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            const { opts, result, logs } = await transferFromAsync({
 | 
			
		||||
                tokenAddressesPath: [tokenAddress, tokenAddress],
 | 
			
		||||
            });
 | 
			
		||||
            expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id');
 | 
			
		||||
            const transfers = filterLogsToArguments<TokenTransferArgs>(logs, ContractEvents.TokenTransfer);
 | 
			
		||||
 | 
			
		||||
            expect(transfers.length).to.eq(1);
 | 
			
		||||
            expect(transfers[0].token).to.eq(tokenAddress, 'input token address');
 | 
			
		||||
            expect(transfers[0].from).to.eq(testContract.address);
 | 
			
		||||
            expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address');
 | 
			
		||||
            expect(transfers[0].amount).to.bignumber.eq(opts.amount, 'amount');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        describe('token -> token', async () => {
 | 
			
		||||
            it('calls BancorNetwork.convertByPath()', async () => {
 | 
			
		||||
                const { opts, result, logs } = await transferFromAsync();
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ export * from '../test/generated-wrappers/balancer_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/bancor_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/chai_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/cream_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/crypto_com_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/curve_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/d_o_d_o_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/dex_forwarder_bridge';
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
        "generated-artifacts/BancorBridge.json",
 | 
			
		||||
        "generated-artifacts/ChaiBridge.json",
 | 
			
		||||
        "generated-artifacts/CreamBridge.json",
 | 
			
		||||
        "generated-artifacts/CryptoComBridge.json",
 | 
			
		||||
        "generated-artifacts/CurveBridge.json",
 | 
			
		||||
        "generated-artifacts/DODOBridge.json",
 | 
			
		||||
        "generated-artifacts/DexForwarderBridge.json",
 | 
			
		||||
@@ -65,6 +66,7 @@
 | 
			
		||||
        "test/generated-artifacts/BancorBridge.json",
 | 
			
		||||
        "test/generated-artifacts/ChaiBridge.json",
 | 
			
		||||
        "test/generated-artifacts/CreamBridge.json",
 | 
			
		||||
        "test/generated-artifacts/CryptoComBridge.json",
 | 
			
		||||
        "test/generated-artifacts/CurveBridge.json",
 | 
			
		||||
        "test/generated-artifacts/DODOBridge.json",
 | 
			
		||||
        "test/generated-artifacts/DexForwarderBridge.json",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "1.1.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "1.1.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "1.1.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "1.1.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "1.1.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "1.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "1.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "1.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "1.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "1.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "1.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "1.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "1.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "1.1.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "1.1.12",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.1.26 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.25 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.24 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.23 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.22 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.21 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.18 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.17 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.16 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.15 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.14 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.13 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-broker",
 | 
			
		||||
    "version": "1.1.12",
 | 
			
		||||
    "version": "1.1.26",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,20 +51,20 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.13",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.13",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.26",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.27",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -84,11 +84,11 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "3.1.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "3.1.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "3.1.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "3.1.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "3.1.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "3.1.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "3.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.1.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.1.27 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.26 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.25 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.24 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.23 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.22 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-coordinator",
 | 
			
		||||
    "version": "3.1.13",
 | 
			
		||||
    "version": "3.1.27",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,17 +52,17 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.11",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.25",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -82,17 +82,17 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/assert": "^3.0.17",
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contract-addresses": "^5.2.0",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/json-schemas": "^5.3.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/assert": "^3.0.21",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contract-addresses": "^5.11.0",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.27",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/json-schemas": "^5.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "http-status-codes": "^1.3.2"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "1.3.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "1.3.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "1.3.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "1.3.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "1.3.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "1.3.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "1.3.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "1.3.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "1.3.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "1.3.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "1.3.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "1.3.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "1.3.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "1.3.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "1.3.11",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.3.25 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.24 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.23 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.22 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.21 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.20 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.19 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.18 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.17 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.16 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.15 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.14 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.13 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.12 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.11 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-dev-utils",
 | 
			
		||||
    "version": "1.3.11",
 | 
			
		||||
    "version": "1.3.25",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -41,18 +41,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/assert": "^3.0.17",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/assert": "^3.0.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethers": "~4.0.4",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
@@ -63,7 +63,7 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@types/node": "12.12.54"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,121 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "2.1.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "2.1.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "2.1.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "2.1.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "2.1.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "2.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "2.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "2.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "2.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "2.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "2.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "2.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "2.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "2.1.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,58 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.1.26 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.25 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.24 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.23 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.22 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.21 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc1155",
 | 
			
		||||
    "version": "2.1.13",
 | 
			
		||||
    "version": "2.1.26",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,15 +52,15 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -68,7 +68,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
@@ -80,10 +80,10 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,126 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "3.3.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "3.3.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "3.3.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "3.3.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "3.3.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "3.3.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add SPDX license identifiers to solidity files",
 | 
			
		||||
                "pr": 105
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Allow for excess return data in `LibERC20TokenV06` compat* functions",
 | 
			
		||||
                "pr": 97
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1609802516
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.2.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.2.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.2.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.2.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.2.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.2.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.2.7",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,59 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.3.5 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.4 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.3 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.2 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.1 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.0 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Add SPDX license identifiers to solidity files (#105)
 | 
			
		||||
    * Allow for excess return data in `LibERC20TokenV06` compat* functions (#97)
 | 
			
		||||
 | 
			
		||||
## v3.2.14 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.13 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.12 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.11 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.10 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.9 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.7 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
@@ -118,7 +119,7 @@ library LibERC20TokenV06 {
 | 
			
		||||
    {
 | 
			
		||||
        tokenDecimals = 18;
 | 
			
		||||
        (bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA);
 | 
			
		||||
        if (didSucceed && resultData.length == 32) {
 | 
			
		||||
        if (didSucceed && resultData.length >= 32) {
 | 
			
		||||
            tokenDecimals = uint8(LibBytesV06.readUint256(resultData, 0));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -141,7 +142,7 @@ library LibERC20TokenV06 {
 | 
			
		||||
                spender
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
        if (didSucceed && resultData.length == 32) {
 | 
			
		||||
        if (didSucceed && resultData.length >= 32) {
 | 
			
		||||
            allowance_ = LibBytesV06.readUint256(resultData, 0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -162,7 +163,7 @@ library LibERC20TokenV06 {
 | 
			
		||||
                owner
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
        if (didSucceed && resultData.length == 32) {
 | 
			
		||||
        if (didSucceed && resultData.length >= 32) {
 | 
			
		||||
            balance = LibBytesV06.readUint256(resultData, 0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -180,7 +181,7 @@ library LibERC20TokenV06 {
 | 
			
		||||
        if (resultData.length == 0) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (resultData.length == 32) {
 | 
			
		||||
        if (resultData.length >= 32) {
 | 
			
		||||
            uint256 result = LibBytesV06.readUint256(resultData, 0);
 | 
			
		||||
            if (result == 1) {
 | 
			
		||||
                return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc20",
 | 
			
		||||
    "version": "3.2.7",
 | 
			
		||||
    "version": "3.3.5",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,18 +51,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -70,7 +70,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -82,7 +82,7 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ export {
 | 
			
		||||
    WETH9Events,
 | 
			
		||||
    WETH9DepositEventArgs,
 | 
			
		||||
    WETH9TransferEventArgs,
 | 
			
		||||
    WETH9WithdrawalEventArgs,
 | 
			
		||||
    ZRXTokenContract,
 | 
			
		||||
    DummyERC20TokenTransferEventArgs,
 | 
			
		||||
    ERC20TokenEventArgs,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,121 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "3.1.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "3.1.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "3.1.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "3.1.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "3.1.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "3.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.1.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,58 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.1.26 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.25 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.24 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.23 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.22 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.21 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc721",
 | 
			
		||||
    "version": "3.1.13",
 | 
			
		||||
    "version": "3.1.26",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,18 +52,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -71,7 +71,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -84,7 +84,7 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "4.2.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "4.2.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "4.2.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "4.2.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "4.2.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "4.2.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.2.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.2.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "4.2.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.2.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.2.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.2.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "4.2.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.2.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.2.27 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.26 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.25 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.24 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.23 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.22 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange-forwarder",
 | 
			
		||||
    "version": "4.2.13",
 | 
			
		||||
    "version": "4.2.27",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,25 +52,25 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.11",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.13",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.13",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.13",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.25",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.26",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.27",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -90,9 +90,9 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,121 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "4.3.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "4.3.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "4.3.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "4.3.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "4.3.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "4.3.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.3.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.3.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.3.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.3.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.3.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "4.3.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.3.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.3.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,58 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.3.26 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.25 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.24 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.23 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.22 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.21 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange-libs",
 | 
			
		||||
    "version": "4.3.13",
 | 
			
		||||
    "version": "4.3.26",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,14 +52,14 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/subproviders": "^6.1.9",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -80,14 +80,14 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "3.2.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "3.2.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "3.2.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "3.2.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "3.2.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "3.2.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.2.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.2.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "3.2.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.2.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.2.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.2.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.2.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.2.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.2.27 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.26 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.25 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.24 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.23 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.22 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange",
 | 
			
		||||
    "version": "3.2.13",
 | 
			
		||||
    "version": "3.2.27",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,21 +52,21 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.13",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.20",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.27",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.34",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -74,7 +74,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "js-combinatorics": "^0.5.3",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
@@ -88,13 +88,13 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.11",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.13",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.13",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.25",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.26",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "6.2.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "6.2.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "6.2.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "6.2.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "6.2.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "6.2.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "6.2.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "6.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "6.2.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "6.2.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "6.2.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "6.2.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "6.2.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "6.2.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "6.2.7",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v6.2.21 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.20 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.19 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.18 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.17 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.16 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.15 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.14 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.13 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.12 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.11 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.10 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.9 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.7 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-extensions",
 | 
			
		||||
    "version": "6.2.7",
 | 
			
		||||
    "version": "6.2.21",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,23 +52,23 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.11",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.13",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.13",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.25",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.26",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.27",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -90,10 +90,10 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,40 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "2.7.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605320370,
 | 
			
		||||
        "version": "2.7.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "2.7.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604620645,
 | 
			
		||||
        "version": "2.7.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "2.7.6",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,22 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.7.10 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.9 - _November 14, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.7 - _November 5, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.6 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/test/TestFixinProtocolFees.sol";
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/src/external/FeeCollectorController.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract TestFixinProtocolFeesIntegration is TestFixinProtocolFees {
 | 
			
		||||
    constructor(
 | 
			
		||||
        IEtherTokenV06 weth,
 | 
			
		||||
        IStaking staking,
 | 
			
		||||
        uint32 protocolFeeMultiplier
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        TestFixinProtocolFees(
 | 
			
		||||
            weth,
 | 
			
		||||
            staking,
 | 
			
		||||
            new FeeCollectorController(weth, staking),
 | 
			
		||||
            protocolFeeMultiplier
 | 
			
		||||
        )
 | 
			
		||||
    {}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										110
									
								
								contracts/integrations/contracts/test/TestStaking.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								contracts/integrations/contracts/test/TestStaking.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2019 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.5.9;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-staking/contracts/src/Staking.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract TestStaking is
 | 
			
		||||
    Staking
 | 
			
		||||
{
 | 
			
		||||
    IEtherToken public testWeth;
 | 
			
		||||
 | 
			
		||||
    struct TestPool {
 | 
			
		||||
        uint96 operatorStake;
 | 
			
		||||
        uint96 membersStake;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mapping(bytes32 => TestPool) private _testPools;
 | 
			
		||||
 | 
			
		||||
    constructor(address exchangeAddress, IEtherToken _testWeth) public {
 | 
			
		||||
        testWeth = _testWeth;
 | 
			
		||||
 | 
			
		||||
        _addAuthorizedAddress(msg.sender);
 | 
			
		||||
        init();
 | 
			
		||||
        validExchanges[exchangeAddress] = true;
 | 
			
		||||
        _removeAuthorizedAddressAtIndex(msg.sender, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function advanceEpoch()
 | 
			
		||||
        external
 | 
			
		||||
    {
 | 
			
		||||
        currentEpoch += 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Create a test pool.
 | 
			
		||||
    function createTestPool(
 | 
			
		||||
        bytes32 poolId,
 | 
			
		||||
        uint96 operatorStake,
 | 
			
		||||
        uint96 membersStake
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
    {
 | 
			
		||||
        TestPool storage pool = _testPools[poolId];
 | 
			
		||||
        pool.operatorStake = operatorStake;
 | 
			
		||||
        pool.membersStake = membersStake;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getAggregatedStatsForCurrentEpoch()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStructs.AggregatedStats memory)
 | 
			
		||||
    {
 | 
			
		||||
        return aggregatedStatsByEpoch[currentEpoch];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Overridden to use test pools.
 | 
			
		||||
    function getTotalStakeDelegatedToPool(bytes32 poolId)
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStructs.StoredBalance memory balance)
 | 
			
		||||
    {
 | 
			
		||||
        TestPool memory pool = _testPools[poolId];
 | 
			
		||||
        uint96 stake = pool.operatorStake + pool.membersStake;
 | 
			
		||||
        return IStructs.StoredBalance({
 | 
			
		||||
            currentEpoch: currentEpoch.downcastToUint64(),
 | 
			
		||||
            currentEpochBalance: stake,
 | 
			
		||||
            nextEpochBalance: stake
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Overridden to use test pools.
 | 
			
		||||
    function getStakeDelegatedToPoolByOwner(address, bytes32 poolId)
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStructs.StoredBalance memory balance)
 | 
			
		||||
    {
 | 
			
		||||
        TestPool memory pool = _testPools[poolId];
 | 
			
		||||
        return IStructs.StoredBalance({
 | 
			
		||||
            currentEpoch: currentEpoch.downcastToUint64(),
 | 
			
		||||
            currentEpochBalance: pool.operatorStake,
 | 
			
		||||
            nextEpochBalance: pool.operatorStake
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getWethContract()
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (IEtherToken wethContract)
 | 
			
		||||
    {
 | 
			
		||||
        return testWeth;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/test/TestWeth.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract TestWethIntegration is TestWeth {}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-integrations",
 | 
			
		||||
    "version": "2.7.6",
 | 
			
		||||
    "version": "2.7.29",
 | 
			
		||||
    "private": true,
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -38,7 +39,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "TestFramework",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ChainlinkStopLimit|IChainlinkAggregator|TestChainlinkAggregator|TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory).json",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ChainlinkStopLimit|IChainlinkAggregator|TestChainlinkAggregator|TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFixinProtocolFeesIntegration|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestStaking|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory|TestWethIntegration).json",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
@@ -51,24 +52,25 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contract-addresses": "^5.2.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.9.5",
 | 
			
		||||
        "@0x/contracts-broker": "^1.1.12",
 | 
			
		||||
        "@0x/contracts-coordinator": "^3.1.13",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.11",
 | 
			
		||||
        "@0x/contracts-exchange-forwarder": "^4.2.13",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/contracts-extensions": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contract-addresses": "^5.11.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.14.0",
 | 
			
		||||
        "@0x/contracts-broker": "^1.1.26",
 | 
			
		||||
        "@0x/contracts-coordinator": "^3.1.27",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.25",
 | 
			
		||||
        "@0x/contracts-exchange-forwarder": "^4.2.27",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/contracts-extensions": "^6.2.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/coordinator-server": "^1.0.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/migrations": "^6.4.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/migrations": "^7.0.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/protocol-utils": "^1.3.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@azure/core-asynciterator-polyfill": "^1.0.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
@@ -91,22 +93,22 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/asset-swapper": "^5.0.2",
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.13",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.13",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.13",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.13",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.20",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-zero-ex": "^0.8.0",
 | 
			
		||||
        "@0x/subproviders": "^6.1.9",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/asset-swapper": "^6.3.0",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.26",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.27",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.27",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.34",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-zero-ex": "^0.20.0",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^6.2.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,239 +0,0 @@
 | 
			
		||||
import { MarketBuySwapQuote, MarketSellSwapQuote, Orderbook, SwapQuoter } from '@0x/asset-swapper';
 | 
			
		||||
import { blockchainTests, expect, Numberish } from '@0x/contracts-test-utils';
 | 
			
		||||
import { assetDataUtils } from '@0x/order-utils';
 | 
			
		||||
import { FillResults, SignedOrder } from '@0x/types';
 | 
			
		||||
import { BigNumber, logUtils } from '@0x/utils';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { TestMainnetAggregatorFillsContract } from '../wrappers';
 | 
			
		||||
 | 
			
		||||
import { tokens } from './tokens';
 | 
			
		||||
 | 
			
		||||
blockchainTests.live('Aggregator Mainnet Tests', env => {
 | 
			
		||||
    // Mainnet address of the `TestMainnetAggregatorFills` contract.
 | 
			
		||||
    const TEST_CONTRACT_ADDRESS = '0x37Ca306F42748b7fe105F89FCBb2CD03D27c8146';
 | 
			
		||||
    const TAKER_ADDRESS = '0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B'; // Vitalik
 | 
			
		||||
    const ORDERBOOK_POLLING_MS = 1000;
 | 
			
		||||
    const GAS_PRICE = new BigNumber(1);
 | 
			
		||||
    const TAKER_ASSET_ETH_VALUE = 500e18;
 | 
			
		||||
    const MIN_BALANCE = 500.1e18;
 | 
			
		||||
    const SYMBOLS = ['ETH', 'DAI', 'USDC', 'FOAM'];
 | 
			
		||||
    const TEST_PAIRS = _.flatten(SYMBOLS.map(m => SYMBOLS.filter(t => t !== m).map(t => [m, t])));
 | 
			
		||||
    const FILL_VALUES = [1, 10, 1e2, 1e3, 1e4, 2.5e4, 5e4];
 | 
			
		||||
 | 
			
		||||
    let testContract: TestMainnetAggregatorFillsContract;
 | 
			
		||||
    let swapQuoter: SwapQuoter;
 | 
			
		||||
    let takerEthBalance: BigNumber;
 | 
			
		||||
    const orderbooks: { [name: string]: Orderbook } = {};
 | 
			
		||||
 | 
			
		||||
    async function getTakerOrdersAsync(takerAssetSymbol: string): Promise<SignedOrder[]> {
 | 
			
		||||
        if (takerAssetSymbol === 'ETH') {
 | 
			
		||||
            return [];
 | 
			
		||||
        }
 | 
			
		||||
        return getOrdersAsync(takerAssetSymbol, 'ETH');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Fetches ETH -> taker asset orders for the forwarder contract.
 | 
			
		||||
    async function getOrdersAsync(makerAssetSymbol: string, takerAssetSymbol: string): Promise<SignedOrder[]> {
 | 
			
		||||
        const takerTokenAddress = tokens[takerAssetSymbol].address;
 | 
			
		||||
        const makerTokenAddress = tokens[makerAssetSymbol].address;
 | 
			
		||||
        const makerAssetData = assetDataUtils.encodeERC20AssetData(makerTokenAddress);
 | 
			
		||||
        const takerAssetData = assetDataUtils.encodeERC20AssetData(takerTokenAddress);
 | 
			
		||||
        const orders = _.flatten(
 | 
			
		||||
            await Promise.all(
 | 
			
		||||
                Object.keys(orderbooks).map(async name =>
 | 
			
		||||
                    getOrdersFromOrderBookAsync(name, makerAssetData, takerAssetData),
 | 
			
		||||
                ),
 | 
			
		||||
            ),
 | 
			
		||||
        );
 | 
			
		||||
        const uniqueOrders: SignedOrder[] = [];
 | 
			
		||||
        for (const order of orders) {
 | 
			
		||||
            if (!order.makerFee.eq(0) || !order.takerFee.eq(0)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (uniqueOrders.findIndex(o => isSameOrder(order, o)) === -1) {
 | 
			
		||||
                uniqueOrders.push(order);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return uniqueOrders;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function getOrdersFromOrderBookAsync(
 | 
			
		||||
        name: string,
 | 
			
		||||
        makerAssetData: string,
 | 
			
		||||
        takerAssetData: string,
 | 
			
		||||
    ): Promise<SignedOrder[]> {
 | 
			
		||||
        try {
 | 
			
		||||
            return (await orderbooks[name].getOrdersAsync(makerAssetData, takerAssetData)).map(r => r.order);
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
            logUtils.warn(`Failed to retrieve orders from orderbook "${name}".`);
 | 
			
		||||
        }
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function isSameOrder(a: SignedOrder, b: SignedOrder): boolean {
 | 
			
		||||
        for (const [k, v] of Object.entries(a)) {
 | 
			
		||||
            if (k in (b as any)) {
 | 
			
		||||
                if (BigNumber.isBigNumber(v) && !v.eq((b as any)[k])) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
                if (v !== (b as any)[k]) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function toTokenUnits(symbol: string, weis: Numberish): BigNumber {
 | 
			
		||||
        return new BigNumber(weis).div(new BigNumber(10).pow(tokens[symbol].decimals));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function fromTokenUnits(symbol: string, units: Numberish): BigNumber {
 | 
			
		||||
        return new BigNumber(units)
 | 
			
		||||
            .times(new BigNumber(10).pow(tokens[symbol].decimals))
 | 
			
		||||
            .integerValue(BigNumber.ROUND_DOWN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface MarketOperationResult {
 | 
			
		||||
        makerAssetBalanceBefore: BigNumber;
 | 
			
		||||
        takerAssetBalanceBefore: BigNumber;
 | 
			
		||||
        makerAssetBalanceAfter: BigNumber;
 | 
			
		||||
        takerAssetBalanceAfter: BigNumber;
 | 
			
		||||
        fillResults: FillResults;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Liquidity is low right now so it's possible we didn't have
 | 
			
		||||
    // enough taker assets to cover the orders, so occasionally we'll get incomplete
 | 
			
		||||
    // fills. This function will catch those cases.
 | 
			
		||||
    // TODO(dorothy-zbornak): Remove this special case when liquidity is up.
 | 
			
		||||
    function checkHadEnoughTakerAsset(
 | 
			
		||||
        quote: MarketBuySwapQuote | MarketSellSwapQuote,
 | 
			
		||||
        result: MarketOperationResult,
 | 
			
		||||
    ): boolean {
 | 
			
		||||
        if (result.takerAssetBalanceBefore.gte(quote.worstCaseQuoteInfo.takerAssetAmount)) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        const takerAssetPct = result.takerAssetBalanceBefore
 | 
			
		||||
            .div(quote.worstCaseQuoteInfo.takerAssetAmount)
 | 
			
		||||
            .times(100)
 | 
			
		||||
            .toNumber()
 | 
			
		||||
            .toFixed(1);
 | 
			
		||||
        logUtils.warn(`Could not acquire enough taker asset to complete the fill: ${takerAssetPct}%`);
 | 
			
		||||
        expect(result.fillResults.makerAssetFilledAmount).to.bignumber.lt(quote.worstCaseQuoteInfo.makerAssetAmount);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        testContract = new TestMainnetAggregatorFillsContract(TEST_CONTRACT_ADDRESS, env.provider, {
 | 
			
		||||
            ...env.txDefaults,
 | 
			
		||||
            gasPrice: GAS_PRICE,
 | 
			
		||||
            gas: 10e6,
 | 
			
		||||
        });
 | 
			
		||||
        swapQuoter = SwapQuoter.getSwapQuoterForStandardRelayerAPIUrl(env.provider, 'https://api.0x.org/sra');
 | 
			
		||||
        // Pool orderbooks because we're desperate for liquidity.
 | 
			
		||||
        orderbooks.swapQuoter = swapQuoter.orderbook;
 | 
			
		||||
        orderbooks.bamboo = Orderbook.getOrderbookForPollingProvider({
 | 
			
		||||
            httpEndpoint: 'https://sra.bamboorelay.com/0x/v3',
 | 
			
		||||
            pollingIntervalMs: ORDERBOOK_POLLING_MS,
 | 
			
		||||
        });
 | 
			
		||||
        // TODO(dorothy-zbornak): Uncomment when radar's SRA is up.
 | 
			
		||||
        // orderbooks.radar = Orderbook.getOrderbookForPollingProvider({
 | 
			
		||||
        //     httpEndpoint: 'https://api-v3.radarrelay.com/v3',
 | 
			
		||||
        //     pollingIntervalMs: ORDERBOOK_POLLING_MS,
 | 
			
		||||
        // });
 | 
			
		||||
        takerEthBalance = await env.web3Wrapper.getBalanceInWeiAsync(TAKER_ADDRESS);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('taker has minimum ETH', async () => {
 | 
			
		||||
        expect(takerEthBalance).to.bignumber.gte(MIN_BALANCE);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('market sells', () => {
 | 
			
		||||
        for (const [makerSymbol, takerSymbol] of TEST_PAIRS) {
 | 
			
		||||
            for (const fillValue of FILL_VALUES) {
 | 
			
		||||
                const fillAmount = fromTokenUnits(takerSymbol, new BigNumber(fillValue).div(tokens[takerSymbol].price));
 | 
			
		||||
                it(`sell ${toTokenUnits(takerSymbol, fillAmount)} ${takerSymbol} for ${makerSymbol}`, async () => {
 | 
			
		||||
                    const [quote, takerOrders] = await Promise.all([
 | 
			
		||||
                        swapQuoter.getMarketSellSwapQuoteAsync(
 | 
			
		||||
                            tokens[makerSymbol].address,
 | 
			
		||||
                            tokens[takerSymbol].address,
 | 
			
		||||
                            fillAmount,
 | 
			
		||||
                            { gasPrice: GAS_PRICE },
 | 
			
		||||
                        ),
 | 
			
		||||
                        getTakerOrdersAsync(takerSymbol),
 | 
			
		||||
                    ]);
 | 
			
		||||
                    // Buy taker assets from `takerOrders` and and perform a
 | 
			
		||||
                    // market sell on the bridge orders.
 | 
			
		||||
                    const fill = await testContract
 | 
			
		||||
                        .marketSell(
 | 
			
		||||
                            tokens[makerSymbol].address,
 | 
			
		||||
                            tokens[takerSymbol].address,
 | 
			
		||||
                            quote.orders,
 | 
			
		||||
                            takerOrders,
 | 
			
		||||
                            quote.orders.map(o => o.signature),
 | 
			
		||||
                            takerOrders.map(o => o.signature),
 | 
			
		||||
                            quote.takerAssetFillAmount,
 | 
			
		||||
                        )
 | 
			
		||||
                        .callAsync({
 | 
			
		||||
                            value: quote.worstCaseQuoteInfo.protocolFeeInWeiAmount.plus(TAKER_ASSET_ETH_VALUE),
 | 
			
		||||
                            from: TAKER_ADDRESS,
 | 
			
		||||
                            gasPrice: quote.gasPrice,
 | 
			
		||||
                        });
 | 
			
		||||
                    if (checkHadEnoughTakerAsset(quote, fill)) {
 | 
			
		||||
                        expect(fill.fillResults.makerAssetFilledAmount, 'makerAssetFilledAmount').to.bignumber.gte(
 | 
			
		||||
                            quote.worstCaseQuoteInfo.makerAssetAmount,
 | 
			
		||||
                        );
 | 
			
		||||
                        expect(fill.fillResults.takerAssetFilledAmount, 'takerAssetFilledAmount').to.bignumber.lte(
 | 
			
		||||
                            quote.takerAssetFillAmount,
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('market buys', () => {
 | 
			
		||||
        for (const [makerSymbol, takerSymbol] of TEST_PAIRS) {
 | 
			
		||||
            for (const fillValue of FILL_VALUES) {
 | 
			
		||||
                const fillAmount = fromTokenUnits(makerSymbol, new BigNumber(fillValue).div(tokens[makerSymbol].price));
 | 
			
		||||
                it(`buy ${toTokenUnits(makerSymbol, fillAmount)} ${makerSymbol} with ${takerSymbol}`, async () => {
 | 
			
		||||
                    const [quote, takerOrders] = await Promise.all([
 | 
			
		||||
                        swapQuoter.getMarketBuySwapQuoteAsync(
 | 
			
		||||
                            tokens[makerSymbol].address,
 | 
			
		||||
                            tokens[takerSymbol].address,
 | 
			
		||||
                            fillAmount,
 | 
			
		||||
                            { gasPrice: GAS_PRICE },
 | 
			
		||||
                        ),
 | 
			
		||||
                        getTakerOrdersAsync(takerSymbol),
 | 
			
		||||
                    ]);
 | 
			
		||||
                    // Buy taker assets from `takerOrders` and and perform a
 | 
			
		||||
                    // market buy on the bridge orders.
 | 
			
		||||
                    const fill = await testContract
 | 
			
		||||
                        .marketBuy(
 | 
			
		||||
                            tokens[makerSymbol].address,
 | 
			
		||||
                            tokens[takerSymbol].address,
 | 
			
		||||
                            quote.orders,
 | 
			
		||||
                            takerOrders,
 | 
			
		||||
                            quote.orders.map(o => o.signature),
 | 
			
		||||
                            takerOrders.map(o => o.signature),
 | 
			
		||||
                            quote.makerAssetFillAmount,
 | 
			
		||||
                        )
 | 
			
		||||
                        .callAsync({
 | 
			
		||||
                            value: quote.worstCaseQuoteInfo.protocolFeeInWeiAmount.plus(TAKER_ASSET_ETH_VALUE),
 | 
			
		||||
                            from: TAKER_ADDRESS,
 | 
			
		||||
                            gasPrice: quote.gasPrice,
 | 
			
		||||
                        });
 | 
			
		||||
                    if (checkHadEnoughTakerAsset(quote, fill)) {
 | 
			
		||||
                        expect(fill.fillResults.takerAssetFilledAmount, 'takerAssetFilledAmount').to.bignumber.lte(
 | 
			
		||||
                            quote.worstCaseQuoteInfo.takerAssetAmount,
 | 
			
		||||
                        );
 | 
			
		||||
                        expect(fill.fillResults.makerAssetFilledAmount, 'makerAssetFilledAmount').to.bignumber.gte(
 | 
			
		||||
                            quote.makerAssetFillAmount,
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,77 +0,0 @@
 | 
			
		||||
export const tokens: { [symbol: string]: { address: string; decimals: number; price: number } } = {
 | 
			
		||||
    ETH: {
 | 
			
		||||
        address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 133,
 | 
			
		||||
    },
 | 
			
		||||
    SAI: {
 | 
			
		||||
        address: '0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 1,
 | 
			
		||||
    },
 | 
			
		||||
    DAI: {
 | 
			
		||||
        address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 1,
 | 
			
		||||
    },
 | 
			
		||||
    USDC: {
 | 
			
		||||
        address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
 | 
			
		||||
        decimals: 6,
 | 
			
		||||
        price: 1,
 | 
			
		||||
    },
 | 
			
		||||
    WBTC: {
 | 
			
		||||
        address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
 | 
			
		||||
        decimals: 8,
 | 
			
		||||
        price: 6900,
 | 
			
		||||
    },
 | 
			
		||||
    MKR: {
 | 
			
		||||
        address: '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 454,
 | 
			
		||||
    },
 | 
			
		||||
    BAT: {
 | 
			
		||||
        address: '0x0D8775F648430679A709E98d2b0Cb6250d2887EF',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 0.17,
 | 
			
		||||
    },
 | 
			
		||||
    OMG: {
 | 
			
		||||
        address: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 0.65,
 | 
			
		||||
    },
 | 
			
		||||
    ZRX: {
 | 
			
		||||
        address: '0xE41d2489571d322189246DaFA5ebDe1F4699F498',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 0.19,
 | 
			
		||||
    },
 | 
			
		||||
    ZIL: {
 | 
			
		||||
        address: '0x05f4a42e251f2d52b8ed15E9FEdAacFcEF1FAD27',
 | 
			
		||||
        decimals: 12,
 | 
			
		||||
        price: 0.004,
 | 
			
		||||
    },
 | 
			
		||||
    FOAM: {
 | 
			
		||||
        address: '0x4946Fcea7C692606e8908002e55A582af44AC121',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 0.004,
 | 
			
		||||
    },
 | 
			
		||||
    USDT: {
 | 
			
		||||
        address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
 | 
			
		||||
        decimals: 6,
 | 
			
		||||
        price: 0.019,
 | 
			
		||||
    },
 | 
			
		||||
    REP: {
 | 
			
		||||
        address: '0x1985365e9f78359a9B6AD760e32412f4a445E862',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 8.9,
 | 
			
		||||
    },
 | 
			
		||||
    MANA: {
 | 
			
		||||
        address: '0x0F5D2fB29fb7d3CFeE444a200298f468908cC942',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 0.025,
 | 
			
		||||
    },
 | 
			
		||||
    LINK: {
 | 
			
		||||
        address: '0x514910771AF9Ca656af840dff83E8264EcF986CA',
 | 
			
		||||
        decimals: 18,
 | 
			
		||||
        price: 1.8,
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
@@ -12,12 +12,15 @@ import * as TestContractWrapper from '../test/generated-artifacts/TestContractWr
 | 
			
		||||
import * as TestDydxUser from '../test/generated-artifacts/TestDydxUser.json';
 | 
			
		||||
import * as TestEth2Dai from '../test/generated-artifacts/TestEth2Dai.json';
 | 
			
		||||
import * as TestEth2DaiBridge from '../test/generated-artifacts/TestEth2DaiBridge.json';
 | 
			
		||||
import * as TestFixinProtocolFeesIntegration from '../test/generated-artifacts/TestFixinProtocolFeesIntegration.json';
 | 
			
		||||
import * as TestFramework from '../test/generated-artifacts/TestFramework.json';
 | 
			
		||||
import * as TestMainnetAggregatorFills from '../test/generated-artifacts/TestMainnetAggregatorFills.json';
 | 
			
		||||
import * as TestSignatureValidationWallet from '../test/generated-artifacts/TestSignatureValidationWallet.json';
 | 
			
		||||
import * as TestStaking from '../test/generated-artifacts/TestStaking.json';
 | 
			
		||||
import * as TestUniswapBridge from '../test/generated-artifacts/TestUniswapBridge.json';
 | 
			
		||||
import * as TestUniswapExchange from '../test/generated-artifacts/TestUniswapExchange.json';
 | 
			
		||||
import * as TestUniswapExchangeFactory from '../test/generated-artifacts/TestUniswapExchangeFactory.json';
 | 
			
		||||
import * as TestWethIntegration from '../test/generated-artifacts/TestWethIntegration.json';
 | 
			
		||||
export const artifacts = {
 | 
			
		||||
    ChainlinkStopLimit: ChainlinkStopLimit as ContractArtifact,
 | 
			
		||||
    IChainlinkAggregator: IChainlinkAggregator as ContractArtifact,
 | 
			
		||||
@@ -26,10 +29,13 @@ export const artifacts = {
 | 
			
		||||
    TestDydxUser: TestDydxUser as ContractArtifact,
 | 
			
		||||
    TestEth2Dai: TestEth2Dai as ContractArtifact,
 | 
			
		||||
    TestEth2DaiBridge: TestEth2DaiBridge as ContractArtifact,
 | 
			
		||||
    TestFixinProtocolFeesIntegration: TestFixinProtocolFeesIntegration as ContractArtifact,
 | 
			
		||||
    TestFramework: TestFramework as ContractArtifact,
 | 
			
		||||
    TestMainnetAggregatorFills: TestMainnetAggregatorFills as ContractArtifact,
 | 
			
		||||
    TestSignatureValidationWallet: TestSignatureValidationWallet as ContractArtifact,
 | 
			
		||||
    TestStaking: TestStaking as ContractArtifact,
 | 
			
		||||
    TestUniswapBridge: TestUniswapBridge as ContractArtifact,
 | 
			
		||||
    TestUniswapExchange: TestUniswapExchange as ContractArtifact,
 | 
			
		||||
    TestUniswapExchangeFactory: TestUniswapExchangeFactory as ContractArtifact,
 | 
			
		||||
    TestWethIntegration: TestWethIntegration as ContractArtifact,
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,426 +0,0 @@
 | 
			
		||||
import { ContractAddresses } from '@0x/contract-addresses';
 | 
			
		||||
import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20';
 | 
			
		||||
import { IExchangeContract } from '@0x/contracts-exchange';
 | 
			
		||||
import { blockchainTests, constants, expect, getRandomPortion, verifyEventsFromLogs } from '@0x/contracts-test-utils';
 | 
			
		||||
import {
 | 
			
		||||
    artifacts as exchangeProxyArtifacts,
 | 
			
		||||
    IZeroExContract,
 | 
			
		||||
    LogMetadataTransformerContract,
 | 
			
		||||
    signCallData,
 | 
			
		||||
} from '@0x/contracts-zero-ex';
 | 
			
		||||
import { migrateOnceAsync } from '@0x/migrations';
 | 
			
		||||
import {
 | 
			
		||||
    assetDataUtils,
 | 
			
		||||
    encodeFillQuoteTransformerData,
 | 
			
		||||
    encodePayTakerTransformerData,
 | 
			
		||||
    ETH_TOKEN_ADDRESS,
 | 
			
		||||
    FillQuoteTransformerSide,
 | 
			
		||||
    findTransformerNonce,
 | 
			
		||||
    signatureUtils,
 | 
			
		||||
    SignedExchangeProxyMetaTransaction,
 | 
			
		||||
} from '@0x/order-utils';
 | 
			
		||||
import { AssetProxyId, Order, SignedOrder } from '@0x/types';
 | 
			
		||||
import { BigNumber, hexUtils, ZeroExRevertErrors } from '@0x/utils';
 | 
			
		||||
import * as ethjs from 'ethereumjs-util';
 | 
			
		||||
 | 
			
		||||
const { MAX_UINT256, NULL_ADDRESS, NULL_BYTES, NULL_BYTES32, ZERO_AMOUNT } = constants;
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
    const quoteSignerKey = hexUtils.random();
 | 
			
		||||
    const quoteSigner = hexUtils.toHex(ethjs.privateToAddress(ethjs.toBuffer(quoteSignerKey)));
 | 
			
		||||
    let owner: string;
 | 
			
		||||
    let relayer: string;
 | 
			
		||||
    let maker: string;
 | 
			
		||||
    let taker: string;
 | 
			
		||||
    let flashWalletAddress: string;
 | 
			
		||||
    let zeroEx: IZeroExContract;
 | 
			
		||||
    let exchange: IExchangeContract;
 | 
			
		||||
    let inputToken: DummyERC20TokenContract;
 | 
			
		||||
    let outputToken: DummyERC20TokenContract;
 | 
			
		||||
    let feeToken: DummyERC20TokenContract;
 | 
			
		||||
    let addresses: ContractAddresses;
 | 
			
		||||
    let protocolFee: BigNumber;
 | 
			
		||||
    let metadataTransformer: LogMetadataTransformerContract;
 | 
			
		||||
    const GAS_PRICE = new BigNumber('1e9');
 | 
			
		||||
    const MAKER_BALANCE = new BigNumber('100e18');
 | 
			
		||||
    const TAKER_BALANCE = new BigNumber('100e18');
 | 
			
		||||
    const TAKER_FEE_BALANCE = new BigNumber('100e18');
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        [, relayer, maker, taker] = await env.getAccountAddressesAsync();
 | 
			
		||||
        addresses = await migrateOnceAsync(env.provider);
 | 
			
		||||
        zeroEx = new IZeroExContract(addresses.exchangeProxy, env.provider, env.txDefaults, {
 | 
			
		||||
            LogMetadataTransformer: LogMetadataTransformerContract.ABI(),
 | 
			
		||||
            DummyERC20Token: DummyERC20TokenContract.ABI(),
 | 
			
		||||
        });
 | 
			
		||||
        exchange = new IExchangeContract(addresses.exchange, env.provider, env.txDefaults);
 | 
			
		||||
        [inputToken, outputToken, feeToken] = await Promise.all(
 | 
			
		||||
            [...new Array(3)].map(i =>
 | 
			
		||||
                DummyERC20TokenContract.deployFrom0xArtifactAsync(
 | 
			
		||||
                    erc20Artifacts.DummyERC20Token,
 | 
			
		||||
                    env.provider,
 | 
			
		||||
                    env.txDefaults,
 | 
			
		||||
                    {},
 | 
			
		||||
                    `DummyToken-${i}`,
 | 
			
		||||
                    `TOK${i}`,
 | 
			
		||||
                    new BigNumber(18),
 | 
			
		||||
                    BigNumber.max(MAKER_BALANCE, TAKER_BALANCE),
 | 
			
		||||
                ),
 | 
			
		||||
            ),
 | 
			
		||||
        );
 | 
			
		||||
        // LogMetadataTransformer is not deployed in migrations.
 | 
			
		||||
        metadataTransformer = await LogMetadataTransformerContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            exchangeProxyArtifacts.LogMetadataTransformer,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            {
 | 
			
		||||
                ...env.txDefaults,
 | 
			
		||||
                from: addresses.exchangeProxyTransformerDeployer,
 | 
			
		||||
            },
 | 
			
		||||
            {},
 | 
			
		||||
        );
 | 
			
		||||
        owner = await zeroEx.owner().callAsync();
 | 
			
		||||
        protocolFee = await exchange.protocolFeeMultiplier().callAsync();
 | 
			
		||||
        flashWalletAddress = await zeroEx.getTransformWallet().callAsync();
 | 
			
		||||
        const erc20Proxy = await exchange.getAssetProxy(AssetProxyId.ERC20).callAsync();
 | 
			
		||||
        const allowanceTarget = await zeroEx.getAllowanceTarget().callAsync();
 | 
			
		||||
        await outputToken.mint(MAKER_BALANCE).awaitTransactionSuccessAsync({ from: maker });
 | 
			
		||||
        await inputToken.mint(TAKER_BALANCE).awaitTransactionSuccessAsync({ from: taker });
 | 
			
		||||
        await feeToken.mint(TAKER_FEE_BALANCE).awaitTransactionSuccessAsync({ from: taker });
 | 
			
		||||
        await outputToken.approve(erc20Proxy, MAX_UINT256).awaitTransactionSuccessAsync({ from: maker });
 | 
			
		||||
        await inputToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker });
 | 
			
		||||
        await feeToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker });
 | 
			
		||||
        await zeroEx.setQuoteSigner(quoteSigner).awaitTransactionSuccessAsync({ from: owner });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    interface Transformation {
 | 
			
		||||
        deploymentNonce: number;
 | 
			
		||||
        data: string;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface SwapInfo {
 | 
			
		||||
        inputTokenAddress: string;
 | 
			
		||||
        outputTokenAddress: string;
 | 
			
		||||
        inputTokenAmount: BigNumber;
 | 
			
		||||
        minOutputTokenAmount: BigNumber;
 | 
			
		||||
        transformations: Transformation[];
 | 
			
		||||
        orders: SignedOrder[];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function generateSwapAsync(orderFields: Partial<Order> = {}, isRfqt: boolean = false): Promise<SwapInfo> {
 | 
			
		||||
        const order = await signatureUtils.ecSignTypedDataOrderAsync(
 | 
			
		||||
            env.provider,
 | 
			
		||||
            {
 | 
			
		||||
                chainId: 1337,
 | 
			
		||||
                exchangeAddress: exchange.address,
 | 
			
		||||
                expirationTimeSeconds: new BigNumber(Date.now()),
 | 
			
		||||
                salt: new BigNumber(hexUtils.random()),
 | 
			
		||||
                feeRecipientAddress: NULL_ADDRESS,
 | 
			
		||||
                senderAddress: NULL_ADDRESS,
 | 
			
		||||
                takerAddress: isRfqt ? flashWalletAddress : NULL_ADDRESS,
 | 
			
		||||
                makerAddress: maker,
 | 
			
		||||
                makerAssetData: assetDataUtils.encodeERC20AssetData(outputToken.address),
 | 
			
		||||
                takerAssetData: assetDataUtils.encodeERC20AssetData(inputToken.address),
 | 
			
		||||
                makerFeeAssetData: NULL_BYTES,
 | 
			
		||||
                takerFeeAssetData: NULL_BYTES,
 | 
			
		||||
                takerAssetAmount: getRandomPortion(TAKER_BALANCE),
 | 
			
		||||
                makerAssetAmount: getRandomPortion(MAKER_BALANCE),
 | 
			
		||||
                makerFee: ZERO_AMOUNT,
 | 
			
		||||
                takerFee: ZERO_AMOUNT,
 | 
			
		||||
                ...orderFields,
 | 
			
		||||
            },
 | 
			
		||||
            maker,
 | 
			
		||||
        );
 | 
			
		||||
        const transformations = [
 | 
			
		||||
            {
 | 
			
		||||
                deploymentNonce: findTransformerNonce(
 | 
			
		||||
                    addresses.transformers.fillQuoteTransformer,
 | 
			
		||||
                    addresses.exchangeProxyTransformerDeployer,
 | 
			
		||||
                ),
 | 
			
		||||
                data: encodeFillQuoteTransformerData({
 | 
			
		||||
                    orders: [order],
 | 
			
		||||
                    signatures: [order.signature],
 | 
			
		||||
                    buyToken: outputToken.address,
 | 
			
		||||
                    sellToken: inputToken.address,
 | 
			
		||||
                    fillAmount: order.takerAssetAmount,
 | 
			
		||||
                    maxOrderFillAmounts: [],
 | 
			
		||||
                    refundReceiver: hexUtils.leftPad(2, 20), // Send refund to sender.
 | 
			
		||||
                    rfqtTakerAddress: isRfqt ? taker : NULL_ADDRESS,
 | 
			
		||||
                    side: FillQuoteTransformerSide.Sell,
 | 
			
		||||
                }),
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                deploymentNonce: findTransformerNonce(
 | 
			
		||||
                    addresses.transformers.payTakerTransformer,
 | 
			
		||||
                    addresses.exchangeProxyTransformerDeployer,
 | 
			
		||||
                ),
 | 
			
		||||
                data: encodePayTakerTransformerData({
 | 
			
		||||
                    tokens: [inputToken.address, outputToken.address, ETH_TOKEN_ADDRESS],
 | 
			
		||||
                    amounts: [MAX_UINT256, MAX_UINT256, MAX_UINT256],
 | 
			
		||||
                }),
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                deploymentNonce: findTransformerNonce(
 | 
			
		||||
                    metadataTransformer.address,
 | 
			
		||||
                    addresses.exchangeProxyTransformerDeployer,
 | 
			
		||||
                ),
 | 
			
		||||
                data: NULL_BYTES,
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
        return {
 | 
			
		||||
            transformations,
 | 
			
		||||
            orders: [order],
 | 
			
		||||
            inputTokenAddress: inputToken.address,
 | 
			
		||||
            outputTokenAddress: outputToken.address,
 | 
			
		||||
            inputTokenAmount: order.takerAssetAmount,
 | 
			
		||||
            minOutputTokenAmount: order.makerAssetAmount,
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getSwapData(swap: SwapInfo): string {
 | 
			
		||||
        return zeroEx
 | 
			
		||||
            .transformERC20(
 | 
			
		||||
                swap.inputTokenAddress,
 | 
			
		||||
                swap.outputTokenAddress,
 | 
			
		||||
                swap.inputTokenAmount,
 | 
			
		||||
                swap.minOutputTokenAmount,
 | 
			
		||||
                swap.transformations,
 | 
			
		||||
            )
 | 
			
		||||
            .getABIEncodedTransactionData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getSignedSwapData(swap: SwapInfo, signerKey?: string): string {
 | 
			
		||||
        return signCallData(
 | 
			
		||||
            zeroEx
 | 
			
		||||
                .transformERC20(
 | 
			
		||||
                    swap.inputTokenAddress,
 | 
			
		||||
                    swap.outputTokenAddress,
 | 
			
		||||
                    swap.inputTokenAmount,
 | 
			
		||||
                    swap.minOutputTokenAmount,
 | 
			
		||||
                    swap.transformations,
 | 
			
		||||
                )
 | 
			
		||||
                .getABIEncodedTransactionData(),
 | 
			
		||||
            signerKey ? signerKey : quoteSignerKey,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function createMetaTransactionAsync(
 | 
			
		||||
        data: string,
 | 
			
		||||
        value: BigNumber,
 | 
			
		||||
        fee?: BigNumber | number,
 | 
			
		||||
    ): Promise<SignedExchangeProxyMetaTransaction> {
 | 
			
		||||
        return signatureUtils.ecSignTypedDataExchangeProxyMetaTransactionAsync(
 | 
			
		||||
            env.provider,
 | 
			
		||||
            {
 | 
			
		||||
                value,
 | 
			
		||||
                signer: taker,
 | 
			
		||||
                sender: relayer,
 | 
			
		||||
                minGasPrice: GAS_PRICE,
 | 
			
		||||
                maxGasPrice: GAS_PRICE,
 | 
			
		||||
                expirationTimeSeconds: new BigNumber(Math.floor(Date.now() / 1000) + 60),
 | 
			
		||||
                salt: new BigNumber(hexUtils.random()),
 | 
			
		||||
                callData: data,
 | 
			
		||||
                feeToken: feeToken.address,
 | 
			
		||||
                feeAmount: fee !== undefined ? new BigNumber(fee) : getRandomPortion(TAKER_FEE_BALANCE),
 | 
			
		||||
                domain: {
 | 
			
		||||
                    chainId: 1,
 | 
			
		||||
                    name: 'ZeroEx',
 | 
			
		||||
                    version: '1.0.0',
 | 
			
		||||
                    verifyingContract: zeroEx.address,
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            taker,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    it('can call `transformERC20()` with signed calldata and no relayer fee', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync();
 | 
			
		||||
        const callDataHash = hexUtils.hash(getSwapData(swap));
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee, 0);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
            .minus(GAS_PRICE.times(receipt.gasUsed));
 | 
			
		||||
        // Ensure the relayer got back the unused protocol fees.
 | 
			
		||||
        expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE));
 | 
			
		||||
        // Ensure the relayer got paid no mtx fees.
 | 
			
		||||
        expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0);
 | 
			
		||||
        // Ensure the taker got output tokens.
 | 
			
		||||
        expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount);
 | 
			
		||||
        // Ensure the maker got input tokens.
 | 
			
		||||
        expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount);
 | 
			
		||||
        // Check events.
 | 
			
		||||
        verifyEventsFromLogs(
 | 
			
		||||
            receipt.logs,
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can call `transformERC20()` with signed calldata and a relayer fee', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync();
 | 
			
		||||
        const callDataHash = hexUtils.hash(getSwapData(swap));
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
            .minus(GAS_PRICE.times(receipt.gasUsed));
 | 
			
		||||
        // Ensure the relayer got back the unused protocol fees.
 | 
			
		||||
        expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE));
 | 
			
		||||
        // Ensure the relayer got paid mtx fees.
 | 
			
		||||
        expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(mtx.feeAmount);
 | 
			
		||||
        // Ensure the taker got output tokens.
 | 
			
		||||
        expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount);
 | 
			
		||||
        // Ensure the maker got input tokens.
 | 
			
		||||
        expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount);
 | 
			
		||||
        // Check events.
 | 
			
		||||
        verifyEventsFromLogs(
 | 
			
		||||
            receipt.logs,
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can call `transformERC20()` with wrongly signed calldata and a relayer fee', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync();
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap, hexUtils.random());
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
            .minus(GAS_PRICE.times(receipt.gasUsed));
 | 
			
		||||
        // Ensure the relayer got back the unused protocol fees.
 | 
			
		||||
        expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE));
 | 
			
		||||
        // Ensure the relayer got paid mtx fees.
 | 
			
		||||
        expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(mtx.feeAmount);
 | 
			
		||||
        // Ensure the taker got output tokens.
 | 
			
		||||
        expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount);
 | 
			
		||||
        // Ensure the maker got input tokens.
 | 
			
		||||
        expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount);
 | 
			
		||||
        // Check events.
 | 
			
		||||
        verifyEventsFromLogs(
 | 
			
		||||
            receipt.logs,
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    // Only signed calldata should have a nonzero hash.
 | 
			
		||||
                    callDataHash: NULL_BYTES32,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('`transformERC20()` can fill RFQT order if calldata is signed', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync({}, true);
 | 
			
		||||
        const callDataHash = hexUtils.hash(getSwapData(swap));
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee, 0);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
            .minus(GAS_PRICE.times(receipt.gasUsed));
 | 
			
		||||
        // Ensure the relayer got back the unused protocol fees.
 | 
			
		||||
        expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE));
 | 
			
		||||
        // Ensure the relayer got paid no mtx fees.
 | 
			
		||||
        expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0);
 | 
			
		||||
        // Ensure the taker got output tokens.
 | 
			
		||||
        expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount);
 | 
			
		||||
        // Ensure the maker got input tokens.
 | 
			
		||||
        expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount);
 | 
			
		||||
        // Check events.
 | 
			
		||||
        verifyEventsFromLogs(
 | 
			
		||||
            receipt.logs,
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('`transformERC20()` can fill RFQT order if calldata is not signed but no quote signer configured', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync({}, true);
 | 
			
		||||
        const callData = getSwapData(swap);
 | 
			
		||||
        const callDataHash = hexUtils.hash(callData);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(callData, _protocolFee, 0);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        await zeroEx.setQuoteSigner(NULL_ADDRESS).awaitTransactionSuccessAsync({ from: owner });
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
            .minus(GAS_PRICE.times(receipt.gasUsed));
 | 
			
		||||
        // Ensure the relayer got back the unused protocol fees.
 | 
			
		||||
        expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE));
 | 
			
		||||
        // Ensure the relayer got paid no mtx fees.
 | 
			
		||||
        expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0);
 | 
			
		||||
        // Ensure the taker got output tokens.
 | 
			
		||||
        expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount);
 | 
			
		||||
        // Ensure the maker got input tokens.
 | 
			
		||||
        expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount);
 | 
			
		||||
        // Check events.
 | 
			
		||||
        verifyEventsFromLogs(
 | 
			
		||||
            receipt.logs,
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('`transformERC20()` cannot fill RFQT order if calldata is not signed', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync({}, true);
 | 
			
		||||
        const callData = getSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(callData, _protocolFee, 0);
 | 
			
		||||
        const tx = zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        return expect(tx).to.revertWith(new ZeroExRevertErrors.MetaTransactions.MetaTransactionCallFailedError());
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -10,9 +10,12 @@ export * from '../test/generated-wrappers/test_contract_wrapper';
 | 
			
		||||
export * from '../test/generated-wrappers/test_dydx_user';
 | 
			
		||||
export * from '../test/generated-wrappers/test_eth2_dai';
 | 
			
		||||
export * from '../test/generated-wrappers/test_eth2_dai_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/test_fixin_protocol_fees_integration';
 | 
			
		||||
export * from '../test/generated-wrappers/test_framework';
 | 
			
		||||
export * from '../test/generated-wrappers/test_mainnet_aggregator_fills';
 | 
			
		||||
export * from '../test/generated-wrappers/test_signature_validation_wallet';
 | 
			
		||||
export * from '../test/generated-wrappers/test_staking';
 | 
			
		||||
export * from '../test/generated-wrappers/test_uniswap_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/test_uniswap_exchange';
 | 
			
		||||
export * from '../test/generated-wrappers/test_uniswap_exchange_factory';
 | 
			
		||||
export * from '../test/generated-wrappers/test_weth_integration';
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,85 @@
 | 
			
		||||
import { blockchainTests, constants, expect } from '@0x/contracts-test-utils';
 | 
			
		||||
import { BigNumber, hexUtils } from '@0x/utils';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from '../artifacts';
 | 
			
		||||
import {
 | 
			
		||||
    TestFixinProtocolFeesIntegrationContract,
 | 
			
		||||
    TestStakingContract,
 | 
			
		||||
    TestWethIntegrationContract,
 | 
			
		||||
} from '../wrappers';
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('ProtocolFeeIntegration', env => {
 | 
			
		||||
    const FEE_MULTIPLIER = 70e3;
 | 
			
		||||
    let owner: string;
 | 
			
		||||
    let taker: string;
 | 
			
		||||
    let protocolFees: TestFixinProtocolFeesIntegrationContract;
 | 
			
		||||
    let staking: TestStakingContract;
 | 
			
		||||
    let weth: TestWethIntegrationContract;
 | 
			
		||||
    let singleFeeAmount: BigNumber;
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        [owner, taker] = await env.getAccountAddressesAsync();
 | 
			
		||||
        weth = await TestWethIntegrationContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.TestWethIntegration,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            artifacts,
 | 
			
		||||
        );
 | 
			
		||||
        staking = await TestStakingContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.TestStaking,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            artifacts,
 | 
			
		||||
            constants.NULL_ADDRESS, // exchange address, which we don't know yet
 | 
			
		||||
            weth.address,
 | 
			
		||||
        );
 | 
			
		||||
        protocolFees = await TestFixinProtocolFeesIntegrationContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.TestFixinProtocolFeesIntegration,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            { ...env.txDefaults, from: taker },
 | 
			
		||||
            artifacts,
 | 
			
		||||
            weth.address,
 | 
			
		||||
            staking.address,
 | 
			
		||||
            FEE_MULTIPLIER,
 | 
			
		||||
        );
 | 
			
		||||
        await staking.addAuthorizedAddress(owner).awaitTransactionSuccessAsync();
 | 
			
		||||
        await staking.addExchangeAddress(protocolFees.address).awaitTransactionSuccessAsync({ from: owner });
 | 
			
		||||
        await weth.mint(taker, constants.ONE_ETHER).awaitTransactionSuccessAsync();
 | 
			
		||||
        await weth.approve(protocolFees.address, constants.ONE_ETHER).awaitTransactionSuccessAsync({ from: taker });
 | 
			
		||||
 | 
			
		||||
        singleFeeAmount = await protocolFees.getSingleProtocolFee().callAsync();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('fee collection integration', () => {
 | 
			
		||||
        const pool0 = constants.NULL_BYTES32;
 | 
			
		||||
        const poolId = hexUtils.random();
 | 
			
		||||
 | 
			
		||||
        it('should collect fees for pool 0', async () => {
 | 
			
		||||
            await protocolFees.collectProtocolFee(pool0).awaitTransactionSuccessAsync({ value: singleFeeAmount });
 | 
			
		||||
            await protocolFees.transferFeesForPool(pool0).awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            // Fees in the pool bytes32(0) don't get attributed to a pool.
 | 
			
		||||
            await expect(
 | 
			
		||||
                (await staking.getStakingPoolStatsThisEpoch(pool0).callAsync()).feesCollected,
 | 
			
		||||
            ).to.bignumber.equal(constants.ZERO_AMOUNT);
 | 
			
		||||
 | 
			
		||||
            // Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings.
 | 
			
		||||
            return expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(
 | 
			
		||||
                singleFeeAmount.minus(1),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should collect fees for non-zero pool', async () => {
 | 
			
		||||
            const eth100 = constants.ONE_ETHER.multipliedBy(100);
 | 
			
		||||
            await staking.createTestPool(poolId, eth100, eth100).awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            await protocolFees.collectProtocolFee(poolId).awaitTransactionSuccessAsync({ value: singleFeeAmount });
 | 
			
		||||
            await protocolFees.transferFeesForPool(poolId).awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            // Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings.
 | 
			
		||||
            return expect(
 | 
			
		||||
                (await staking.getStakingPoolStatsThisEpoch(poolId).callAsync()).feesCollected,
 | 
			
		||||
            ).to.bignumber.equal(singleFeeAmount.minus(1));
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -11,11 +11,14 @@
 | 
			
		||||
        "test/generated-artifacts/TestDydxUser.json",
 | 
			
		||||
        "test/generated-artifacts/TestEth2Dai.json",
 | 
			
		||||
        "test/generated-artifacts/TestEth2DaiBridge.json",
 | 
			
		||||
        "test/generated-artifacts/TestFixinProtocolFeesIntegration.json",
 | 
			
		||||
        "test/generated-artifacts/TestFramework.json",
 | 
			
		||||
        "test/generated-artifacts/TestMainnetAggregatorFills.json",
 | 
			
		||||
        "test/generated-artifacts/TestSignatureValidationWallet.json",
 | 
			
		||||
        "test/generated-artifacts/TestStaking.json",
 | 
			
		||||
        "test/generated-artifacts/TestUniswapBridge.json",
 | 
			
		||||
        "test/generated-artifacts/TestUniswapExchange.json",
 | 
			
		||||
        "test/generated-artifacts/TestUniswapExchangeFactory.json"
 | 
			
		||||
        "test/generated-artifacts/TestUniswapExchangeFactory.json",
 | 
			
		||||
        "test/generated-artifacts/TestWethIntegration.json"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "4.1.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "4.1.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "4.1.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "4.1.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "4.1.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "4.1.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "4.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "4.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.1.13",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.1.27 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.26 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.25 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.24 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.23 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.22 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-multisig",
 | 
			
		||||
    "version": "4.1.13",
 | 
			
		||||
    "version": "4.1.27",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -49,18 +49,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -78,9 +78,9 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,130 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "2.0.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "2.0.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "2.0.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "2.0.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "2.0.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "2.0.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "2.0.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "2.0.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "2.0.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "2.0.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "2.0.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "2.0.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "2.0.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "2.0.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "2.0.20",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.0.34 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.33 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.32 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.31 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.30 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.29 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.28 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.27 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.26 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.25 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.24 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.23 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.22 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.21 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.20 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
    "artifactsDir": "./test/generated-artifacts",
 | 
			
		||||
    "contractsDir": "./contracts",
 | 
			
		||||
    "useDockerisedSolc": false,
 | 
			
		||||
    "isOfflineMode": true,
 | 
			
		||||
    "isOfflineMode": false,
 | 
			
		||||
    "shouldSaveStandardInput": true,
 | 
			
		||||
    "compilerSettings": {
 | 
			
		||||
        "evmVersion": "istanbul",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-staking",
 | 
			
		||||
    "version": "2.0.20",
 | 
			
		||||
    "version": "2.0.34",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -53,20 +53,20 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.4",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.11",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.7",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.18",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.7",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.25",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.26",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
        "chai": "^4.0.1",
 | 
			
		||||
@@ -87,11 +87,11 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.10",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,121 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "5.3.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "5.3.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "5.3.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "5.3.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "5.3.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1609802516,
 | 
			
		||||
        "version": "5.3.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "5.3.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "5.3.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "5.3.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "5.3.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "5.3.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "5.3.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "5.3.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "5.3.10",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,58 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v5.3.23 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.22 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.21 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.20 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.19 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.18 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.17 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.16 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.15 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.14 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.13 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.12 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.11 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.10 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-test-utils",
 | 
			
		||||
    "version": "5.3.10",
 | 
			
		||||
    "version": "5.3.23",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -34,7 +34,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
@@ -42,20 +42,20 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/assert": "^3.0.17",
 | 
			
		||||
        "@0x/base-contract": "^6.2.11",
 | 
			
		||||
        "@0x/contract-addresses": "^5.2.0",
 | 
			
		||||
        "@0x/dev-utils": "^4.0.1",
 | 
			
		||||
        "@0x/json-schemas": "^5.3.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.5",
 | 
			
		||||
        "@0x/sol-coverage": "^4.0.18",
 | 
			
		||||
        "@0x/sol-profiler": "^4.1.8",
 | 
			
		||||
        "@0x/sol-trace": "^3.0.18",
 | 
			
		||||
        "@0x/subproviders": "^6.1.9",
 | 
			
		||||
        "@0x/types": "^3.3.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^6.1.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.8",
 | 
			
		||||
        "@0x/assert": "^3.0.21",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contract-addresses": "^5.11.0",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/json-schemas": "^5.4.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.18",
 | 
			
		||||
        "@0x/sol-coverage": "^4.0.31",
 | 
			
		||||
        "@0x/sol-profiler": "^4.1.21",
 | 
			
		||||
        "@0x/sol-trace": "^3.0.31",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@types/bn.js": "^4.11.0",
 | 
			
		||||
        "@types/js-combinatorics": "^0.5.29",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
@@ -67,7 +67,7 @@
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "decimal.js": "^10.2.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethers": "~4.0.4",
 | 
			
		||||
        "js-combinatorics": "^0.5.3",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								contracts/treasury/.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								contracts/treasury/.npmignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
# Blacklist all files
 | 
			
		||||
.*
 | 
			
		||||
*
 | 
			
		||||
# Whitelist lib
 | 
			
		||||
!lib/**/*
 | 
			
		||||
# Whitelist Solidity contracts
 | 
			
		||||
!contracts/src/**/*
 | 
			
		||||
# Blacklist tests in lib
 | 
			
		||||
/lib/test/*
 | 
			
		||||
# Package specific ignore
 | 
			
		||||
							
								
								
									
										40
									
								
								contracts/treasury/CHANGELOG.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								contracts/treasury/CHANGELOG.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "version": "1.1.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Make the proposal/quorum thresholds updatable",
 | 
			
		||||
                "pr": 165
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1616005394
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "1.0.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "1.0.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "1.0.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Create this package",
 | 
			
		||||
                "pr": 120
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1611869778
 | 
			
		||||
    }
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										22
									
								
								contracts/treasury/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								contracts/treasury/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
<!--
 | 
			
		||||
changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
 | 
			
		||||
Edit the package's CHANGELOG.json file only.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.1.0 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Make the proposal/quorum thresholds updatable (#165)
 | 
			
		||||
 | 
			
		||||
## v1.0.2 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.0.1 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.0.0 - _January 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Create this package (#120)
 | 
			
		||||
							
								
								
									
										1
									
								
								contracts/treasury/DEPLOYS.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contracts/treasury/DEPLOYS.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
[]
 | 
			
		||||
							
								
								
									
										65
									
								
								contracts/treasury/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								contracts/treasury/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
## Governance
 | 
			
		||||
 | 
			
		||||
This package contains contracts for the governance of the 0x ZRX treasury.
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
**Install**
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm install @0x/contracts-treasury --save
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Contributing
 | 
			
		||||
 | 
			
		||||
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
 | 
			
		||||
 | 
			
		||||
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
 | 
			
		||||
 | 
			
		||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
 | 
			
		||||
 | 
			
		||||
### Install Dependencies
 | 
			
		||||
 | 
			
		||||
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
yarn config set workspaces-experimental true
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Then install dependencies
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
yarn install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Build
 | 
			
		||||
 | 
			
		||||
To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
PKG=@0x/contracts-treasury yarn build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Or continuously rebuild on change:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
PKG=@0x/contracts-treasury yarn watch
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Clean
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
yarn clean
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Lint
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
yarn lint
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Run Tests
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
yarn test
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										29
									
								
								contracts/treasury/compiler.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								contracts/treasury/compiler.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
{
 | 
			
		||||
    "artifactsDir": "./test/generated-artifacts",
 | 
			
		||||
    "contractsDir": "./contracts",
 | 
			
		||||
    "useDockerisedSolc": false,
 | 
			
		||||
    "isOfflineMode": false,
 | 
			
		||||
    "shouldSaveStandardInput": true,
 | 
			
		||||
    "shouldCompileIndependently": true,
 | 
			
		||||
    "compilerSettings": {
 | 
			
		||||
        "evmVersion": "istanbul",
 | 
			
		||||
        "optimizer": {
 | 
			
		||||
            "enabled": true,
 | 
			
		||||
            "runs": 1000000,
 | 
			
		||||
            "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true }
 | 
			
		||||
        },
 | 
			
		||||
        "outputSelection": {
 | 
			
		||||
            "*": {
 | 
			
		||||
                "*": [
 | 
			
		||||
                    "abi",
 | 
			
		||||
                    "devdoc",
 | 
			
		||||
                    "evm.bytecode.object",
 | 
			
		||||
                    "evm.bytecode.sourceMap",
 | 
			
		||||
                    "evm.deployedBytecode.object",
 | 
			
		||||
                    "evm.deployedBytecode.sourceMap",
 | 
			
		||||
                    "evm.methodIdentifiers"
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								contracts/treasury/contracts/src/DefaultPoolOperator.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								contracts/treasury/contracts/src/DefaultPoolOperator.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
// 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.12;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol";
 | 
			
		||||
import "./IStaking.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract DefaultPoolOperator {
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
 | 
			
		||||
    // Immutables
 | 
			
		||||
    IStaking public immutable stakingProxy;
 | 
			
		||||
    IERC20TokenV06 public immutable weth;
 | 
			
		||||
    bytes32 public immutable poolId;
 | 
			
		||||
 | 
			
		||||
    /// @dev Initializes this contract and creates a staking pool.
 | 
			
		||||
    /// @param stakingProxy_ The 0x staking proxy contract.
 | 
			
		||||
    /// @param weth_ The WETH token contract.
 | 
			
		||||
    constructor(
 | 
			
		||||
        IStaking stakingProxy_,
 | 
			
		||||
        IERC20TokenV06 weth_
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
    {
 | 
			
		||||
        stakingProxy = stakingProxy_;
 | 
			
		||||
        weth = weth_;
 | 
			
		||||
        // operator share = 100%
 | 
			
		||||
        poolId = stakingProxy_.createStakingPool(10 ** 6, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Sends this contract's entire WETH balance to the
 | 
			
		||||
    ///      staking proxy contract. This function exists in case
 | 
			
		||||
    ///      someone joins the default staking pool and starts
 | 
			
		||||
    ///      market making for some reason, thus earning this contract
 | 
			
		||||
    ///      some staking rewards. Note that anyone can call this
 | 
			
		||||
    ///      function at any time.
 | 
			
		||||
    function returnStakingRewards()
 | 
			
		||||
        external
 | 
			
		||||
    {
 | 
			
		||||
        uint256 wethBalance = weth.compatBalanceOf(address(this));
 | 
			
		||||
        weth.compatTransfer(address(stakingProxy), wethBalance);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										127
									
								
								contracts/treasury/contracts/src/IStaking.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								contracts/treasury/contracts/src/IStaking.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,127 @@
 | 
			
		||||
// 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.12;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
interface IStaking {
 | 
			
		||||
    /// @dev Statuses that stake can exist in.
 | 
			
		||||
    ///      Any stake can be (re)delegated effective at the next epoch
 | 
			
		||||
    ///      Undelegated stake can be withdrawn if it is available in both the current and next epoch
 | 
			
		||||
    enum StakeStatus {
 | 
			
		||||
        UNDELEGATED,
 | 
			
		||||
        DELEGATED
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Encapsulates a balance for the current and next epochs.
 | 
			
		||||
    /// Note that these balances may be stale if the current epoch
 | 
			
		||||
    /// is greater than `currentEpoch`.
 | 
			
		||||
    /// @param currentEpoch The current epoch
 | 
			
		||||
    /// @param currentEpochBalance Balance in the current epoch.
 | 
			
		||||
    /// @param nextEpochBalance Balance in `currentEpoch+1`.
 | 
			
		||||
    struct StoredBalance {
 | 
			
		||||
        uint64 currentEpoch;
 | 
			
		||||
        uint96 currentEpochBalance;
 | 
			
		||||
        uint96 nextEpochBalance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Holds the metadata for a staking pool.
 | 
			
		||||
    /// @param operator Operator of the pool.
 | 
			
		||||
    /// @param operatorShare Fraction of the total balance owned by the operator, in ppm.
 | 
			
		||||
    struct Pool {
 | 
			
		||||
        address operator;
 | 
			
		||||
        uint32 operatorShare;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Create a new staking pool. The sender will be the operator of this pool.
 | 
			
		||||
    /// Note that an operator must be payable.
 | 
			
		||||
    /// @param operatorShare Portion of rewards owned by the operator, in ppm.
 | 
			
		||||
    /// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.
 | 
			
		||||
    /// @return poolId The unique pool id generated for this pool.
 | 
			
		||||
    function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker)
 | 
			
		||||
        external
 | 
			
		||||
        returns (bytes32 poolId);
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the current staking epoch number.
 | 
			
		||||
    /// @return epoch The current epoch.
 | 
			
		||||
    function currentEpoch()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 epoch);
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the time (in seconds) at which the current staking epoch started.
 | 
			
		||||
    /// @return startTime The start time of the current epoch, in seconds.
 | 
			
		||||
    function currentEpochStartTimeInSeconds()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 startTime);
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the duration of an epoch in seconds. This value can be updated.
 | 
			
		||||
    /// @return duration The duration of an epoch, in seconds.
 | 
			
		||||
    function epochDurationInSeconds()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 duration);
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns a staking pool
 | 
			
		||||
    /// @param poolId Unique id of pool.
 | 
			
		||||
    function getStakingPool(bytes32 poolId)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (Pool memory);
 | 
			
		||||
 | 
			
		||||
    /// @dev Gets global stake for a given status.
 | 
			
		||||
    /// @param stakeStatus UNDELEGATED or DELEGATED
 | 
			
		||||
    /// @return balance Global stake for given status.
 | 
			
		||||
    function getGlobalStakeByStatus(StakeStatus stakeStatus)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (StoredBalance memory balance);
 | 
			
		||||
 | 
			
		||||
    /// @dev Gets an owner's stake balances by status.
 | 
			
		||||
    /// @param staker Owner of stake.
 | 
			
		||||
    /// @param stakeStatus UNDELEGATED or DELEGATED
 | 
			
		||||
    /// @return balance Owner's stake balances for given status.
 | 
			
		||||
    function getOwnerStakeByStatus(
 | 
			
		||||
        address staker,
 | 
			
		||||
        StakeStatus stakeStatus
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (StoredBalance memory balance);
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the total stake delegated to a specific staking pool,
 | 
			
		||||
    ///      across all members.
 | 
			
		||||
    /// @param poolId Unique Id of pool.
 | 
			
		||||
    /// @return balance Total stake delegated to pool.
 | 
			
		||||
    function getTotalStakeDelegatedToPool(bytes32 poolId)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (StoredBalance memory balance);
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the stake delegated to a specific staking pool, by a given staker.
 | 
			
		||||
    /// @param staker of stake.
 | 
			
		||||
    /// @param poolId Unique Id of pool.
 | 
			
		||||
    /// @return balance Stake delegated to pool by staker.
 | 
			
		||||
    function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (StoredBalance memory balance);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										181
									
								
								contracts/treasury/contracts/src/IZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								contracts/treasury/contracts/src/IZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,181 @@
 | 
			
		||||
// 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.12;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "./DefaultPoolOperator.sol";
 | 
			
		||||
import "./IStaking.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
interface IZrxTreasury {
 | 
			
		||||
 | 
			
		||||
    struct TreasuryParameters {
 | 
			
		||||
        uint256 votingPeriod;
 | 
			
		||||
        uint256 proposalThreshold;
 | 
			
		||||
        uint256 quorumThreshold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    struct ProposedAction {
 | 
			
		||||
        address target;
 | 
			
		||||
        bytes data;
 | 
			
		||||
        uint256 value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    struct Proposal {
 | 
			
		||||
        bytes32 actionsHash;
 | 
			
		||||
        uint256 executionEpoch;
 | 
			
		||||
        uint256 voteEpoch;
 | 
			
		||||
        uint256 votesFor;
 | 
			
		||||
        uint256 votesAgainst;
 | 
			
		||||
        bool executed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    event ProposalCreated(
 | 
			
		||||
        address proposer,
 | 
			
		||||
        bytes32[] operatedPoolIds,
 | 
			
		||||
        uint256 proposalId,
 | 
			
		||||
        ProposedAction[] actions,
 | 
			
		||||
        uint256 executionEpoch,
 | 
			
		||||
        string description
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    event VoteCast(
 | 
			
		||||
        address voter,
 | 
			
		||||
        bytes32[] operatedPoolIds,
 | 
			
		||||
        uint256 proposalId,
 | 
			
		||||
        bool support,
 | 
			
		||||
        uint256 votingPower
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    event ProposalExecuted(uint256 proposalId);
 | 
			
		||||
 | 
			
		||||
    function stakingProxy()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStaking);
 | 
			
		||||
 | 
			
		||||
    function defaultPoolOperator()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (DefaultPoolOperator);
 | 
			
		||||
 | 
			
		||||
    function defaultPoolId()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (bytes32);
 | 
			
		||||
 | 
			
		||||
    function votingPeriod()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256);
 | 
			
		||||
 | 
			
		||||
    function proposalThreshold()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256);
 | 
			
		||||
 | 
			
		||||
    function quorumThreshold()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256);
 | 
			
		||||
 | 
			
		||||
    /// @dev Updates the proposal and quorum thresholds to the given
 | 
			
		||||
    ///      values. Note that this function is only callable by the
 | 
			
		||||
    ///      treasury contract itself, so the threshold can only be
 | 
			
		||||
    ///      updated via a successful treasury proposal.
 | 
			
		||||
    /// @param newProposalThreshold The new value for the proposal threshold.
 | 
			
		||||
    /// @param newQuorumThreshold The new value for the quorum threshold.
 | 
			
		||||
    function updateThresholds(
 | 
			
		||||
        uint256 newProposalThreshold,
 | 
			
		||||
        uint256 newQuorumThreshold
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Creates a proposal to send ZRX from this treasury on the
 | 
			
		||||
    ///      the given actions. Must have at least `proposalThreshold`
 | 
			
		||||
    ///      of voting power to call this function. See `getVotingPower`
 | 
			
		||||
    ///      for how voting power is computed. If a proposal is successfully
 | 
			
		||||
    ///      created, voting starts at the epoch after next (currentEpoch + 2).
 | 
			
		||||
    ///      If the vote passes, the proposal is executable during the
 | 
			
		||||
    ///      `executionEpoch`. See `hasProposalPassed` for the passing criteria.
 | 
			
		||||
    /// @param actions The proposed ZRX actions. An action specifies a
 | 
			
		||||
    ///        contract call.
 | 
			
		||||
    /// @param executionEpoch The epoch during which the proposal is to
 | 
			
		||||
    ///        be executed if it passes. Must be at least two epochs
 | 
			
		||||
    ///        from the current epoch.
 | 
			
		||||
    /// @param description A text description for the proposal.
 | 
			
		||||
    /// @param operatedPoolIds The pools operated by `msg.sender`. The
 | 
			
		||||
    ///        ZRX currently delegated to those pools will be accounted
 | 
			
		||||
    ///        for in the voting power.
 | 
			
		||||
    /// @return proposalId The ID of the newly created proposal.
 | 
			
		||||
    function propose(
 | 
			
		||||
        ProposedAction[] calldata actions,
 | 
			
		||||
        uint256 executionEpoch,
 | 
			
		||||
        string calldata description,
 | 
			
		||||
        bytes32[] calldata operatedPoolIds
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (uint256 proposalId);
 | 
			
		||||
 | 
			
		||||
    /// @dev Casts a vote for the given proposal. Only callable
 | 
			
		||||
    ///      during the voting period for that proposal. See
 | 
			
		||||
    ///      `getVotingPower` for how voting power is computed.
 | 
			
		||||
    /// @param proposalId The ID of the proposal to vote on.
 | 
			
		||||
    /// @param support Whether to support the proposal or not.
 | 
			
		||||
    /// @param operatedPoolIds The pools operated by `msg.sender`. The
 | 
			
		||||
    ///        ZRX currently delegated to those pools will be accounted
 | 
			
		||||
    ///        for in the voting power.
 | 
			
		||||
    function castVote(
 | 
			
		||||
        uint256 proposalId,
 | 
			
		||||
        bool support,
 | 
			
		||||
        bytes32[] calldata operatedPoolIds
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Executes a proposal that has passed and is
 | 
			
		||||
    ///      currently executable.
 | 
			
		||||
    /// @param proposalId The ID of the proposal to execute.
 | 
			
		||||
    /// @param actions Actions associated with the proposal to execute.
 | 
			
		||||
    function execute(uint256 proposalId, ProposedAction[] memory actions)
 | 
			
		||||
        external
 | 
			
		||||
        payable;
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the total number of proposals.
 | 
			
		||||
    /// @return count The number of proposals.
 | 
			
		||||
    function proposalCount()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 count);
 | 
			
		||||
 | 
			
		||||
    /// @dev Computes the current voting power of the given account.
 | 
			
		||||
    ///      Voting power is equal to:
 | 
			
		||||
    ///      (ZRX delegated to the default pool) +
 | 
			
		||||
    ///      0.5 * (ZRX delegated to other pools) +
 | 
			
		||||
    ///      0.5 * (ZRX delegated to pools operated by account)
 | 
			
		||||
    /// @param account The address of the account.
 | 
			
		||||
    /// @param operatedPoolIds The pools operated by `account`. The
 | 
			
		||||
    ///        ZRX currently delegated to those pools will be accounted
 | 
			
		||||
    ///        for in the voting power.
 | 
			
		||||
    /// @return votingPower The current voting power of the given account.
 | 
			
		||||
    function getVotingPower(address account, bytes32[] calldata operatedPoolIds)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 votingPower);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										378
									
								
								contracts/treasury/contracts/src/ZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										378
									
								
								contracts/treasury/contracts/src/ZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,378 @@
 | 
			
		||||
// 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.12;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/src/features/libs/LibSignature.sol";
 | 
			
		||||
import "./IZrxTreasury.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract ZrxTreasury is
 | 
			
		||||
    IZrxTreasury
 | 
			
		||||
{
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
    using LibSafeMathV06 for uint256;
 | 
			
		||||
    using LibRichErrorsV06 for bytes;
 | 
			
		||||
    using LibBytesV06 for bytes;
 | 
			
		||||
 | 
			
		||||
    // Immutables
 | 
			
		||||
    IStaking public immutable override stakingProxy;
 | 
			
		||||
    DefaultPoolOperator public immutable override defaultPoolOperator;
 | 
			
		||||
    bytes32 public immutable override defaultPoolId;
 | 
			
		||||
    uint256 public immutable override votingPeriod;
 | 
			
		||||
    uint256 public override proposalThreshold;
 | 
			
		||||
    uint256 public override quorumThreshold;
 | 
			
		||||
 | 
			
		||||
    // Storage
 | 
			
		||||
    Proposal[] public proposals;
 | 
			
		||||
    mapping (uint256 => mapping (address => bool)) public hasVoted;
 | 
			
		||||
 | 
			
		||||
    /// @dev Initializes the ZRX treasury and creates the default
 | 
			
		||||
    ///      staking pool.
 | 
			
		||||
    /// @param stakingProxy_ The 0x staking proxy contract.
 | 
			
		||||
    /// @param weth_ The WETH token contract.
 | 
			
		||||
    /// @param params Immutable treasury parameters.
 | 
			
		||||
    constructor(
 | 
			
		||||
        IStaking stakingProxy_,
 | 
			
		||||
        IERC20TokenV06 weth_,
 | 
			
		||||
        TreasuryParameters memory params
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
    {
 | 
			
		||||
        require(
 | 
			
		||||
            params.votingPeriod < stakingProxy_.epochDurationInSeconds(),
 | 
			
		||||
            "VOTING_PERIOD_TOO_LONG"
 | 
			
		||||
        );
 | 
			
		||||
        stakingProxy = stakingProxy_;
 | 
			
		||||
        DefaultPoolOperator defaultPoolOperator_ = new DefaultPoolOperator(
 | 
			
		||||
            stakingProxy_,
 | 
			
		||||
            weth_
 | 
			
		||||
        );
 | 
			
		||||
        defaultPoolOperator = defaultPoolOperator_;
 | 
			
		||||
        defaultPoolId = defaultPoolOperator_.poolId();
 | 
			
		||||
        votingPeriod = params.votingPeriod;
 | 
			
		||||
        proposalThreshold = params.proposalThreshold;
 | 
			
		||||
        quorumThreshold = params.quorumThreshold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // solhint-disable
 | 
			
		||||
    /// @dev Allows this contract to receive ether.
 | 
			
		||||
    receive() external payable {}
 | 
			
		||||
    // solhint-enable
 | 
			
		||||
 | 
			
		||||
    /// @dev Updates the proposal and quorum thresholds to the given
 | 
			
		||||
    ///      values. Note that this function is only callable by the
 | 
			
		||||
    ///      treasury contract itself, so the threshold can only be
 | 
			
		||||
    ///      updated via a successful treasury proposal.
 | 
			
		||||
    /// @param newProposalThreshold The new value for the proposal threshold.
 | 
			
		||||
    /// @param newQuorumThreshold The new value for the quorum threshold.
 | 
			
		||||
    function updateThresholds(
 | 
			
		||||
        uint256 newProposalThreshold,
 | 
			
		||||
        uint256 newQuorumThreshold
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        override
 | 
			
		||||
    {
 | 
			
		||||
        require(msg.sender == address(this), "updateThresholds/ONLY_SELF");
 | 
			
		||||
        proposalThreshold = newProposalThreshold;
 | 
			
		||||
        quorumThreshold = newQuorumThreshold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Creates a proposal to send ZRX from this treasury on the
 | 
			
		||||
    ///      the given actions. Must have at least `proposalThreshold`
 | 
			
		||||
    ///      of voting power to call this function. See `getVotingPower`
 | 
			
		||||
    ///      for how voting power is computed. If a proposal is successfully
 | 
			
		||||
    ///      created, voting starts at the epoch after next (currentEpoch + 2).
 | 
			
		||||
    ///      If the vote passes, the proposal is executable during the
 | 
			
		||||
    ///      `executionEpoch`. See `hasProposalPassed` for the passing criteria.
 | 
			
		||||
    /// @param actions The proposed ZRX actions. An action specifies a
 | 
			
		||||
    ///        contract call.
 | 
			
		||||
    /// @param executionEpoch The epoch during which the proposal is to
 | 
			
		||||
    ///        be executed if it passes. Must be at least two epochs
 | 
			
		||||
    ///        from the current epoch.
 | 
			
		||||
    /// @param description A text description for the proposal.
 | 
			
		||||
    /// @param operatedPoolIds The pools operated by `msg.sender`. The
 | 
			
		||||
    ///        ZRX currently delegated to those pools will be accounted
 | 
			
		||||
    ///        for in the voting power.
 | 
			
		||||
    /// @return proposalId The ID of the newly created proposal.
 | 
			
		||||
    function propose(
 | 
			
		||||
        ProposedAction[] memory actions,
 | 
			
		||||
        uint256 executionEpoch,
 | 
			
		||||
        string memory description,
 | 
			
		||||
        bytes32[] memory operatedPoolIds
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        override
 | 
			
		||||
        returns (uint256 proposalId)
 | 
			
		||||
    {
 | 
			
		||||
        require(
 | 
			
		||||
            getVotingPower(msg.sender, operatedPoolIds) >= proposalThreshold,
 | 
			
		||||
            "propose/INSUFFICIENT_VOTING_POWER"
 | 
			
		||||
        );
 | 
			
		||||
        require(
 | 
			
		||||
            actions.length > 0,
 | 
			
		||||
            "propose/NO_ACTIONS_PROPOSED"
 | 
			
		||||
        );
 | 
			
		||||
        uint256 currentEpoch = stakingProxy.currentEpoch();
 | 
			
		||||
        require(
 | 
			
		||||
            executionEpoch >= currentEpoch + 2,
 | 
			
		||||
            "propose/INVALID_EXECUTION_EPOCH"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        proposalId = proposalCount();
 | 
			
		||||
        Proposal storage newProposal = proposals.push();
 | 
			
		||||
        newProposal.actionsHash = keccak256(abi.encode(actions));
 | 
			
		||||
        newProposal.executionEpoch = executionEpoch;
 | 
			
		||||
        newProposal.voteEpoch = currentEpoch + 2;
 | 
			
		||||
 | 
			
		||||
        emit ProposalCreated(
 | 
			
		||||
            msg.sender,
 | 
			
		||||
            operatedPoolIds,
 | 
			
		||||
            proposalId,
 | 
			
		||||
            actions,
 | 
			
		||||
            executionEpoch,
 | 
			
		||||
            description
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Casts a vote for the given proposal. Only callable
 | 
			
		||||
    ///      during the voting period for that proposal. See
 | 
			
		||||
    ///      `getVotingPower` for how voting power is computed.
 | 
			
		||||
    /// @param proposalId The ID of the proposal to vote on.
 | 
			
		||||
    /// @param support Whether to support the proposal or not.
 | 
			
		||||
    /// @param operatedPoolIds The pools operated by `msg.sender`. The
 | 
			
		||||
    ///        ZRX currently delegated to those pools will be accounted
 | 
			
		||||
    ///        for in the voting power.
 | 
			
		||||
    function castVote(
 | 
			
		||||
        uint256 proposalId,
 | 
			
		||||
        bool support,
 | 
			
		||||
        bytes32[] memory operatedPoolIds
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        override
 | 
			
		||||
    {
 | 
			
		||||
        if (proposalId >= proposalCount()) {
 | 
			
		||||
            revert("castVote/INVALID_PROPOSAL_ID");
 | 
			
		||||
        }
 | 
			
		||||
        if (hasVoted[proposalId][msg.sender]) {
 | 
			
		||||
            revert("castVote/ALREADY_VOTED");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Proposal memory proposal = proposals[proposalId];
 | 
			
		||||
        if (
 | 
			
		||||
            proposal.voteEpoch != stakingProxy.currentEpoch() ||
 | 
			
		||||
            _hasVoteEnded(proposal.voteEpoch)
 | 
			
		||||
        ) {
 | 
			
		||||
            revert("castVote/VOTING_IS_CLOSED");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        uint256 votingPower = getVotingPower(msg.sender, operatedPoolIds);
 | 
			
		||||
        if (votingPower == 0) {
 | 
			
		||||
            revert("castVote/NO_VOTING_POWER");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (support) {
 | 
			
		||||
            proposals[proposalId].votesFor = proposals[proposalId].votesFor
 | 
			
		||||
                .safeAdd(votingPower);
 | 
			
		||||
            hasVoted[proposalId][msg.sender] = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            proposals[proposalId].votesAgainst = proposals[proposalId].votesAgainst
 | 
			
		||||
                .safeAdd(votingPower);
 | 
			
		||||
            hasVoted[proposalId][msg.sender] = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        emit VoteCast(
 | 
			
		||||
            msg.sender,
 | 
			
		||||
            operatedPoolIds,
 | 
			
		||||
            proposalId,
 | 
			
		||||
            support,
 | 
			
		||||
            votingPower
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Executes a proposal that has passed and is
 | 
			
		||||
    ///      currently executable.
 | 
			
		||||
    /// @param proposalId The ID of the proposal to execute.
 | 
			
		||||
    /// @param actions Actions associated with the proposal to execute.
 | 
			
		||||
    function execute(uint256 proposalId, ProposedAction[] memory actions)
 | 
			
		||||
        public
 | 
			
		||||
        payable
 | 
			
		||||
        override
 | 
			
		||||
    {
 | 
			
		||||
        if (proposalId >= proposalCount()) {
 | 
			
		||||
            revert("execute/INVALID_PROPOSAL_ID");
 | 
			
		||||
        }
 | 
			
		||||
        Proposal memory proposal = proposals[proposalId];
 | 
			
		||||
        _assertProposalExecutable(proposal, actions);
 | 
			
		||||
 | 
			
		||||
        proposals[proposalId].executed = true;
 | 
			
		||||
 | 
			
		||||
        for (uint256 i = 0; i != actions.length; i++) {
 | 
			
		||||
            ProposedAction memory action = actions[i];
 | 
			
		||||
            (bool didSucceed, ) = action.target.call{value: action.value}(action.data);
 | 
			
		||||
            require(
 | 
			
		||||
                didSucceed,
 | 
			
		||||
                "execute/ACTION_EXECUTION_FAILED"
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        emit ProposalExecuted(proposalId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the total number of proposals.
 | 
			
		||||
    /// @return count The number of proposals.
 | 
			
		||||
    function proposalCount()
 | 
			
		||||
        public
 | 
			
		||||
        override
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 count)
 | 
			
		||||
    {
 | 
			
		||||
        return proposals.length;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Computes the current voting power of the given account.
 | 
			
		||||
    ///      Voting power is equal to:
 | 
			
		||||
    ///      (ZRX delegated to the default pool) +
 | 
			
		||||
    ///      0.5 * (ZRX delegated to other pools) +
 | 
			
		||||
    ///      0.5 * (ZRX delegated to pools operated by account)
 | 
			
		||||
    /// @param account The address of the account.
 | 
			
		||||
    /// @param operatedPoolIds The pools operated by `account`. The
 | 
			
		||||
    ///        ZRX currently delegated to those pools will be accounted
 | 
			
		||||
    ///        for in the voting power.
 | 
			
		||||
    /// @return votingPower The current voting power of the given account.
 | 
			
		||||
    function getVotingPower(address account, bytes32[] memory operatedPoolIds)
 | 
			
		||||
        public
 | 
			
		||||
        override
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 votingPower)
 | 
			
		||||
    {
 | 
			
		||||
        uint256 delegatedBalance = stakingProxy.getOwnerStakeByStatus(
 | 
			
		||||
            account,
 | 
			
		||||
            IStaking.StakeStatus.DELEGATED
 | 
			
		||||
        ).currentEpochBalance;
 | 
			
		||||
        uint256 balanceDelegatedToDefaultPool = stakingProxy.getStakeDelegatedToPoolByOwner(
 | 
			
		||||
            account,
 | 
			
		||||
            defaultPoolId
 | 
			
		||||
        ).currentEpochBalance;
 | 
			
		||||
 | 
			
		||||
        // Voting power for ZRX delegated to the default pool is not diluted,
 | 
			
		||||
        // so we double-count the balance delegated to the default pool before
 | 
			
		||||
        // dividing by 2.
 | 
			
		||||
        votingPower = delegatedBalance
 | 
			
		||||
            .safeAdd(balanceDelegatedToDefaultPool)
 | 
			
		||||
            .safeDiv(2);
 | 
			
		||||
 | 
			
		||||
        // Add voting power for operated staking pools.
 | 
			
		||||
        for (uint256 i = 0; i != operatedPoolIds.length; i++) {
 | 
			
		||||
            IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]);
 | 
			
		||||
            require(
 | 
			
		||||
                pool.operator == account,
 | 
			
		||||
                "getVotingPower/POOL_NOT_OPERATED_BY_ACCOUNT"
 | 
			
		||||
            );
 | 
			
		||||
            uint96 stakeDelegatedToPool = stakingProxy
 | 
			
		||||
                .getTotalStakeDelegatedToPool(operatedPoolIds[i])
 | 
			
		||||
                .currentEpochBalance;
 | 
			
		||||
            uint256 poolVotingPower = uint256(stakeDelegatedToPool).safeDiv(2);
 | 
			
		||||
            votingPower = votingPower.safeAdd(poolVotingPower);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return votingPower;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Checks whether the given proposal is executable.
 | 
			
		||||
    ///      Reverts if not.
 | 
			
		||||
    /// @param proposal The proposal to check.
 | 
			
		||||
    function _assertProposalExecutable(
 | 
			
		||||
        Proposal memory proposal,
 | 
			
		||||
        ProposedAction[] memory actions
 | 
			
		||||
    )
 | 
			
		||||
        private
 | 
			
		||||
        view
 | 
			
		||||
    {
 | 
			
		||||
        require(
 | 
			
		||||
            keccak256(abi.encode(actions)) == proposal.actionsHash,
 | 
			
		||||
            "_assertProposalExecutable/INVALID_ACTIONS"
 | 
			
		||||
        );
 | 
			
		||||
        require(
 | 
			
		||||
            _hasProposalPassed(proposal),
 | 
			
		||||
            "_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED"
 | 
			
		||||
        );
 | 
			
		||||
        require(
 | 
			
		||||
            !proposal.executed,
 | 
			
		||||
            "_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED"
 | 
			
		||||
        );
 | 
			
		||||
        require(
 | 
			
		||||
            stakingProxy.currentEpoch() == proposal.executionEpoch,
 | 
			
		||||
            "_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH"
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Checks whether the given proposal has passed or not.
 | 
			
		||||
    /// @param proposal The proposal to check.
 | 
			
		||||
    /// @return hasPassed Whether the proposal has passed.
 | 
			
		||||
    function _hasProposalPassed(Proposal memory proposal)
 | 
			
		||||
        private
 | 
			
		||||
        view
 | 
			
		||||
        returns (bool hasPassed)
 | 
			
		||||
    {
 | 
			
		||||
        // Proposal is not passed until the vote is over.
 | 
			
		||||
        if (!_hasVoteEnded(proposal.voteEpoch)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        // Must have >50% support.
 | 
			
		||||
        if (proposal.votesFor <= proposal.votesAgainst) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        // Must reach quorum threshold.
 | 
			
		||||
        if (proposal.votesFor < quorumThreshold) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Checks whether a vote starting at the given
 | 
			
		||||
    ///      epoch has ended or not.
 | 
			
		||||
    /// @param voteEpoch The epoch at which the vote started.
 | 
			
		||||
    /// @return hasEnded Whether the vote has ended.
 | 
			
		||||
    function _hasVoteEnded(uint256 voteEpoch)
 | 
			
		||||
        private
 | 
			
		||||
        view
 | 
			
		||||
        returns (bool hasEnded)
 | 
			
		||||
    {
 | 
			
		||||
        uint256 currentEpoch = stakingProxy.currentEpoch();
 | 
			
		||||
        if (currentEpoch < voteEpoch) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if (currentEpoch > voteEpoch) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        // voteEpoch == currentEpoch
 | 
			
		||||
        // Vote ends at currentEpochStartTime + votingPeriod
 | 
			
		||||
        uint256 voteEndTime = stakingProxy
 | 
			
		||||
            .currentEpochStartTimeInSeconds()
 | 
			
		||||
            .safeAdd(votingPeriod);
 | 
			
		||||
        return block.timestamp > voteEndTime;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										88
									
								
								contracts/treasury/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								contracts/treasury/package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-treasury",
 | 
			
		||||
    "version": "1.1.0",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
    "description": "Smart contracts for governing the 0x ZRX treasury",
 | 
			
		||||
    "main": "lib/src/index.js",
 | 
			
		||||
    "directories": {
 | 
			
		||||
        "test": "test"
 | 
			
		||||
    },
 | 
			
		||||
    "scripts": {
 | 
			
		||||
        "build": "yarn pre_build && yarn build:ts",
 | 
			
		||||
        "build:ci": "yarn build",
 | 
			
		||||
        "build:ts": "tsc -b",
 | 
			
		||||
        "pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy",
 | 
			
		||||
        "test": "yarn run_mocha",
 | 
			
		||||
        "rebuild_and_test": "run-s build test",
 | 
			
		||||
        "run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit",
 | 
			
		||||
        "compile": "sol-compiler",
 | 
			
		||||
        "watch": "sol-compiler -w",
 | 
			
		||||
        "clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers",
 | 
			
		||||
        "generate_contract_wrappers": "abi-gen --debug --abis  ${npm_package_config_abis} --output test/generated-wrappers --backend ethers",
 | 
			
		||||
        "lint": "tslint --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./test/generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts",
 | 
			
		||||
        "fix": "tslint --fix --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-wrappers/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts",
 | 
			
		||||
        "test:circleci": "yarn test",
 | 
			
		||||
        "contracts:gen": "contracts-gen generate",
 | 
			
		||||
        "contracts:copy": "contracts-gen copy",
 | 
			
		||||
        "lint-contracts": "#solhint -c ../.solhint.json contracts/**/**/**/**/*.sol",
 | 
			
		||||
        "docs:md": "ts-doc-gen --sourceDir='$PROJECT_FILES' --output=$MD_FILE_DIR --fileExtension=mdx --tsconfig=./typedoc-tsconfig.json",
 | 
			
		||||
        "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES",
 | 
			
		||||
        "publish:private": "yarn build && gitpkg publish"
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "ZrxTreasury,DefaultPoolOperator",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(DefaultPoolOperator|IStaking|IZrxTreasury|ZrxTreasury).json"
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
        "url": "https://github.com/0xProject/protocol.git"
 | 
			
		||||
    },
 | 
			
		||||
    "license": "Apache-2.0",
 | 
			
		||||
    "bugs": {
 | 
			
		||||
        "url": "https://github.com/0xProject/protocol/issues"
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contract-addresses": "^5.11.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.8",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.5",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.34",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.23",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@types/isomorphic-fetch": "^0.0.35",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/prompts": "^2.0.9",
 | 
			
		||||
        "isomorphic-fetch": "^3.0.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "prompts": "^2.4.0",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
        "solhint": "^1.4.1",
 | 
			
		||||
        "tslint": "5.11.0",
 | 
			
		||||
        "typedoc": "~0.16.11",
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/protocol-utils": "^1.3.1",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								contracts/treasury/src/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contracts/treasury/src/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 * Warning: This file is auto-generated by contracts-gen. Don't edit manually.
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
import { ContractArtifact } from 'ethereum-types';
 | 
			
		||||
 | 
			
		||||
import * as DefaultPoolOperator from '../generated-artifacts/DefaultPoolOperator.json';
 | 
			
		||||
import * as ZrxTreasury from '../generated-artifacts/ZrxTreasury.json';
 | 
			
		||||
export const artifacts = {
 | 
			
		||||
    ZrxTreasury: ZrxTreasury as ContractArtifact,
 | 
			
		||||
    DefaultPoolOperator: DefaultPoolOperator as ContractArtifact,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										2
									
								
								contracts/treasury/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contracts/treasury/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
export { artifacts } from './artifacts';
 | 
			
		||||
export { DefaultPoolOperatorContract, ZrxTreasuryContract } from './wrappers';
 | 
			
		||||
							
								
								
									
										7
									
								
								contracts/treasury/src/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								contracts/treasury/src/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 * Warning: This file is auto-generated by contracts-gen. Don't edit manually.
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
export * from '../generated-wrappers/default_pool_operator';
 | 
			
		||||
export * from '../generated-wrappers/zrx_treasury';
 | 
			
		||||
							
								
								
									
										17
									
								
								contracts/treasury/test/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								contracts/treasury/test/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 * Warning: This file is auto-generated by contracts-gen. Don't edit manually.
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
import { ContractArtifact } from 'ethereum-types';
 | 
			
		||||
 | 
			
		||||
import * as DefaultPoolOperator from '../test/generated-artifacts/DefaultPoolOperator.json';
 | 
			
		||||
import * as IStaking from '../test/generated-artifacts/IStaking.json';
 | 
			
		||||
import * as IZrxTreasury from '../test/generated-artifacts/IZrxTreasury.json';
 | 
			
		||||
import * as ZrxTreasury from '../test/generated-artifacts/ZrxTreasury.json';
 | 
			
		||||
export const artifacts = {
 | 
			
		||||
    DefaultPoolOperator: DefaultPoolOperator as ContractArtifact,
 | 
			
		||||
    IStaking: IStaking as ContractArtifact,
 | 
			
		||||
    IZrxTreasury: IZrxTreasury as ContractArtifact,
 | 
			
		||||
    ZrxTreasury: ZrxTreasury as ContractArtifact,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										626
									
								
								contracts/treasury/test/treasury_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										626
									
								
								contracts/treasury/test/treasury_test.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,626 @@
 | 
			
		||||
import { artifacts as assetProxyArtifacts, ERC20ProxyContract } from '@0x/contracts-asset-proxy';
 | 
			
		||||
import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20';
 | 
			
		||||
import {
 | 
			
		||||
    artifacts as stakingArtifacts,
 | 
			
		||||
    constants as stakingConstants,
 | 
			
		||||
    StakeInfo,
 | 
			
		||||
    StakeStatus,
 | 
			
		||||
    StakingProxyContract,
 | 
			
		||||
    TestStakingContract,
 | 
			
		||||
    ZrxVaultContract,
 | 
			
		||||
} from '@0x/contracts-staking';
 | 
			
		||||
import {
 | 
			
		||||
    blockchainTests,
 | 
			
		||||
    constants,
 | 
			
		||||
    expect,
 | 
			
		||||
    getRandomInteger,
 | 
			
		||||
    randomAddress,
 | 
			
		||||
    verifyEventsFromLogs,
 | 
			
		||||
} from '@0x/contracts-test-utils';
 | 
			
		||||
import { BigNumber } from '@0x/utils';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from './artifacts';
 | 
			
		||||
import { DefaultPoolOperatorContract, ZrxTreasuryContract, ZrxTreasuryEvents } from './wrappers';
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('Treasury governance', env => {
 | 
			
		||||
    const TREASURY_PARAMS = {
 | 
			
		||||
        votingPeriod: new BigNumber(3).times(stakingConstants.ONE_DAY_IN_SECONDS),
 | 
			
		||||
        proposalThreshold: new BigNumber(100),
 | 
			
		||||
        quorumThreshold: new BigNumber(1000),
 | 
			
		||||
    };
 | 
			
		||||
    const PROPOSAL_DESCRIPTION = 'A very compelling proposal!';
 | 
			
		||||
    const TREASURY_BALANCE = constants.INITIAL_ERC20_BALANCE;
 | 
			
		||||
    const INVALID_PROPOSAL_ID = new BigNumber(999);
 | 
			
		||||
    const GRANT_PROPOSALS = [
 | 
			
		||||
        { recipient: randomAddress(), amount: getRandomInteger(1, TREASURY_BALANCE.dividedToIntegerBy(2)) },
 | 
			
		||||
        { recipient: randomAddress(), amount: getRandomInteger(1, TREASURY_BALANCE.dividedToIntegerBy(2)) },
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    interface ProposedAction {
 | 
			
		||||
        target: string;
 | 
			
		||||
        data: string;
 | 
			
		||||
        value: BigNumber;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let zrx: DummyERC20TokenContract;
 | 
			
		||||
    let weth: DummyERC20TokenContract;
 | 
			
		||||
    let erc20ProxyContract: ERC20ProxyContract;
 | 
			
		||||
    let staking: TestStakingContract;
 | 
			
		||||
    let treasury: ZrxTreasuryContract;
 | 
			
		||||
    let defaultPoolId: string;
 | 
			
		||||
    let defaultPoolOperator: DefaultPoolOperatorContract;
 | 
			
		||||
    let admin: string;
 | 
			
		||||
    let nonDefaultPoolId: string;
 | 
			
		||||
    let poolOperator: string;
 | 
			
		||||
    let delegator: string;
 | 
			
		||||
    let actions: ProposedAction[];
 | 
			
		||||
 | 
			
		||||
    async function deployStakingAsync(): Promise<void> {
 | 
			
		||||
        erc20ProxyContract = await ERC20ProxyContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            assetProxyArtifacts.ERC20Proxy,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            assetProxyArtifacts,
 | 
			
		||||
        );
 | 
			
		||||
        const zrxVaultContract = await ZrxVaultContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            stakingArtifacts.ZrxVault,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            stakingArtifacts,
 | 
			
		||||
            erc20ProxyContract.address,
 | 
			
		||||
            zrx.address,
 | 
			
		||||
        );
 | 
			
		||||
        await erc20ProxyContract.addAuthorizedAddress(zrxVaultContract.address).awaitTransactionSuccessAsync();
 | 
			
		||||
        await zrxVaultContract.addAuthorizedAddress(admin).awaitTransactionSuccessAsync();
 | 
			
		||||
        const stakingLogic = await TestStakingContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            stakingArtifacts.TestStaking,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            artifacts,
 | 
			
		||||
            weth.address,
 | 
			
		||||
            zrxVaultContract.address,
 | 
			
		||||
        );
 | 
			
		||||
        const stakingProxyContract = await StakingProxyContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            stakingArtifacts.StakingProxy,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            artifacts,
 | 
			
		||||
            stakingLogic.address,
 | 
			
		||||
        );
 | 
			
		||||
        await stakingProxyContract.addAuthorizedAddress(admin).awaitTransactionSuccessAsync();
 | 
			
		||||
        await zrxVaultContract.setStakingProxy(stakingProxyContract.address).awaitTransactionSuccessAsync();
 | 
			
		||||
        staking = new TestStakingContract(stakingProxyContract.address, env.provider, env.txDefaults);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function fastForwardToNextEpochAsync(): Promise<void> {
 | 
			
		||||
        const epochEndTime = await staking.getCurrentEpochEarliestEndTimeInSeconds().callAsync();
 | 
			
		||||
        const lastBlockTime = await env.web3Wrapper.getBlockTimestampAsync('latest');
 | 
			
		||||
        const dt = Math.max(0, epochEndTime.minus(lastBlockTime).toNumber());
 | 
			
		||||
        await env.web3Wrapper.increaseTimeAsync(dt);
 | 
			
		||||
        // mine next block
 | 
			
		||||
        await env.web3Wrapper.mineBlockAsync();
 | 
			
		||||
        await staking.endEpoch().awaitTransactionSuccessAsync();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        [admin, poolOperator, delegator] = await env.getAccountAddressesAsync();
 | 
			
		||||
        zrx = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            erc20Artifacts.DummyERC20Token,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            erc20Artifacts,
 | 
			
		||||
            constants.DUMMY_TOKEN_NAME,
 | 
			
		||||
            constants.DUMMY_TOKEN_SYMBOL,
 | 
			
		||||
            constants.DUMMY_TOKEN_DECIMALS,
 | 
			
		||||
            constants.DUMMY_TOKEN_TOTAL_SUPPLY,
 | 
			
		||||
        );
 | 
			
		||||
        weth = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            erc20Artifacts.DummyERC20Token,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            erc20Artifacts,
 | 
			
		||||
            constants.DUMMY_TOKEN_NAME,
 | 
			
		||||
            constants.DUMMY_TOKEN_SYMBOL,
 | 
			
		||||
            constants.DUMMY_TOKEN_DECIMALS,
 | 
			
		||||
            constants.DUMMY_TOKEN_TOTAL_SUPPLY,
 | 
			
		||||
        );
 | 
			
		||||
        await deployStakingAsync();
 | 
			
		||||
        await zrx.mint(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
        await zrx.mint(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
        await zrx
 | 
			
		||||
            .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
        await zrx
 | 
			
		||||
            .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
 | 
			
		||||
        const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false);
 | 
			
		||||
        nonDefaultPoolId = await createStakingPoolTx.callAsync({ from: poolOperator });
 | 
			
		||||
        await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
 | 
			
		||||
        treasury = await ZrxTreasuryContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.ZrxTreasury,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            { ...artifacts, ...erc20Artifacts },
 | 
			
		||||
            staking.address,
 | 
			
		||||
            weth.address,
 | 
			
		||||
            TREASURY_PARAMS,
 | 
			
		||||
        );
 | 
			
		||||
        await zrx.mint(TREASURY_BALANCE).awaitTransactionSuccessAsync();
 | 
			
		||||
        await zrx.transfer(treasury.address, TREASURY_BALANCE).awaitTransactionSuccessAsync();
 | 
			
		||||
        actions = [
 | 
			
		||||
            {
 | 
			
		||||
                target: zrx.address,
 | 
			
		||||
                data: zrx
 | 
			
		||||
                    .transfer(GRANT_PROPOSALS[0].recipient, GRANT_PROPOSALS[0].amount)
 | 
			
		||||
                    .getABIEncodedTransactionData(),
 | 
			
		||||
                value: constants.ZERO_AMOUNT,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                target: zrx.address,
 | 
			
		||||
                data: zrx
 | 
			
		||||
                    .transfer(GRANT_PROPOSALS[1].recipient, GRANT_PROPOSALS[1].amount)
 | 
			
		||||
                    .getABIEncodedTransactionData(),
 | 
			
		||||
                value: constants.ZERO_AMOUNT,
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        defaultPoolId = await treasury.defaultPoolId().callAsync();
 | 
			
		||||
        const defaultPoolOperatorAddress = await treasury.defaultPoolOperator().callAsync();
 | 
			
		||||
        defaultPoolOperator = new DefaultPoolOperatorContract(defaultPoolOperatorAddress, env.provider, env.txDefaults);
 | 
			
		||||
    });
 | 
			
		||||
    describe('getVotingPower()', () => {
 | 
			
		||||
        it('Unstaked ZRX has no voting power', async () => {
 | 
			
		||||
            const votingPower = await treasury.getVotingPower(delegator, []).callAsync();
 | 
			
		||||
            expect(votingPower).to.bignumber.equal(0);
 | 
			
		||||
        });
 | 
			
		||||
        it('Staked but undelegated ZRX has no voting power', async () => {
 | 
			
		||||
            await staking.stake(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            const votingPower = await treasury.getVotingPower(delegator, []).callAsync();
 | 
			
		||||
            expect(votingPower).to.bignumber.equal(0);
 | 
			
		||||
        });
 | 
			
		||||
        it('ZRX delegated during epoch N has no voting power during Epoch N', async () => {
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            const votingPower = await treasury.getVotingPower(delegator, []).callAsync();
 | 
			
		||||
            expect(votingPower).to.bignumber.equal(0);
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
        });
 | 
			
		||||
        it('ZRX delegated to the default pool retains full voting power', async () => {
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const votingPower = await treasury.getVotingPower(delegator, []).callAsync();
 | 
			
		||||
            expect(votingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold);
 | 
			
		||||
        });
 | 
			
		||||
        it('ZRX delegated to a non-default pool splits voting power between delegator and pool operator', async () => {
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const delegatorVotingPower = await treasury.getVotingPower(delegator, []).callAsync();
 | 
			
		||||
            expect(delegatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2));
 | 
			
		||||
            const operatorVotingPower = await treasury.getVotingPower(poolOperator, [nonDefaultPoolId]).callAsync();
 | 
			
		||||
            expect(operatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2));
 | 
			
		||||
        });
 | 
			
		||||
        it('Correctly sums voting power delegated to multiple pools', async () => {
 | 
			
		||||
            await staking
 | 
			
		||||
                .stake(TREASURY_PARAMS.proposalThreshold.times(2))
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            // Delegate half of total stake to the default pool.
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            // Delegate the other half to a non-default pool.
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const delegatorVotingPower = await treasury.getVotingPower(delegator, []).callAsync();
 | 
			
		||||
            expect(delegatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.times(1.5));
 | 
			
		||||
        });
 | 
			
		||||
        it('Correctly sums voting power for operator with multiple pools', async () => {
 | 
			
		||||
            const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false);
 | 
			
		||||
            const firstPool = nonDefaultPoolId;
 | 
			
		||||
            const secondPool = await createStakingPoolTx.callAsync({ from: poolOperator });
 | 
			
		||||
            await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
 | 
			
		||||
            const amountDelegatedToDefaultPool = new BigNumber(1337);
 | 
			
		||||
            const amountSelfDelegatedToFirstPool = new BigNumber(420);
 | 
			
		||||
            const amountExternallyDelegatedToSecondPool = new BigNumber(2020);
 | 
			
		||||
 | 
			
		||||
            await staking
 | 
			
		||||
                .stake(amountDelegatedToDefaultPool.plus(amountSelfDelegatedToFirstPool))
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    amountDelegatedToDefaultPool,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, firstPool),
 | 
			
		||||
                    amountSelfDelegatedToFirstPool,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .stake(amountExternallyDelegatedToSecondPool)
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, secondPool),
 | 
			
		||||
                    amountExternallyDelegatedToSecondPool,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const votingPower = await treasury.getVotingPower(poolOperator, [firstPool, secondPool]).callAsync();
 | 
			
		||||
            expect(votingPower).to.bignumber.equal(
 | 
			
		||||
                amountDelegatedToDefaultPool
 | 
			
		||||
                    .plus(amountSelfDelegatedToFirstPool)
 | 
			
		||||
                    .plus(amountExternallyDelegatedToSecondPool.dividedToIntegerBy(2)),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('propose()', () => {
 | 
			
		||||
        it('Cannot create proposal without sufficient voting power', async () => {
 | 
			
		||||
            const votingPower = TREASURY_PARAMS.proposalThreshold.minus(1);
 | 
			
		||||
            await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    votingPower,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            const tx = treasury
 | 
			
		||||
                .propose(actions, currentEpoch.plus(2), PROPOSAL_DESCRIPTION, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('propose/INSUFFICIENT_VOTING_POWER');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot create proposal with no actions', async () => {
 | 
			
		||||
            const votingPower = TREASURY_PARAMS.proposalThreshold;
 | 
			
		||||
            await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    votingPower,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            const tx = treasury
 | 
			
		||||
                .propose([], currentEpoch.plus(2), PROPOSAL_DESCRIPTION, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('propose/NO_ACTIONS_PROPOSED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot create proposal with an invalid execution epoch', async () => {
 | 
			
		||||
            const votingPower = TREASURY_PARAMS.proposalThreshold;
 | 
			
		||||
            await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    votingPower,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            const tx = treasury
 | 
			
		||||
                .propose(actions, currentEpoch.plus(1), PROPOSAL_DESCRIPTION, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('propose/INVALID_EXECUTION_EPOCH');
 | 
			
		||||
        });
 | 
			
		||||
        it('Can create a valid proposal', async () => {
 | 
			
		||||
            const votingPower = TREASURY_PARAMS.proposalThreshold;
 | 
			
		||||
            await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    votingPower,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            const executionEpoch = currentEpoch.plus(2);
 | 
			
		||||
            const tx = await treasury
 | 
			
		||||
                .propose(actions, executionEpoch, PROPOSAL_DESCRIPTION, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            const proposalId = new BigNumber(0);
 | 
			
		||||
            verifyEventsFromLogs(
 | 
			
		||||
                tx.logs,
 | 
			
		||||
                [
 | 
			
		||||
                    {
 | 
			
		||||
                        proposer: delegator,
 | 
			
		||||
                        operatedPoolIds: [],
 | 
			
		||||
                        proposalId,
 | 
			
		||||
                        actions,
 | 
			
		||||
                        executionEpoch,
 | 
			
		||||
                        description: PROPOSAL_DESCRIPTION,
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                ZrxTreasuryEvents.ProposalCreated,
 | 
			
		||||
            );
 | 
			
		||||
            expect(await treasury.proposalCount().callAsync()).to.bignumber.equal(1);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('castVote()', () => {
 | 
			
		||||
        const VOTE_PROPOSAL_ID = new BigNumber(0);
 | 
			
		||||
        const DELEGATOR_VOTING_POWER = new BigNumber(420);
 | 
			
		||||
 | 
			
		||||
        before(async () => {
 | 
			
		||||
            await staking.stake(DELEGATOR_VOTING_POWER).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    DELEGATOR_VOTING_POWER,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            await treasury
 | 
			
		||||
                .propose(actions, currentEpoch.plus(2), PROPOSAL_DESCRIPTION, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot vote on invalid proposalId', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const tx = treasury
 | 
			
		||||
                .castVote(INVALID_PROPOSAL_ID, true, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('castVote/INVALID_PROPOSAL_ID');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot vote before voting period starts', async () => {
 | 
			
		||||
            const tx = treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('castVote/VOTING_IS_CLOSED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot vote after voting period ends', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await env.web3Wrapper.increaseTimeAsync(TREASURY_PARAMS.votingPeriod.plus(1).toNumber());
 | 
			
		||||
            await env.web3Wrapper.mineBlockAsync();
 | 
			
		||||
            const tx = treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('castVote/VOTING_IS_CLOSED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot vote twice on same proposal', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            const tx = treasury.castVote(VOTE_PROPOSAL_ID, false, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            return expect(tx).to.revertWith('castVote/ALREADY_VOTED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Can cast a valid vote', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const tx = await treasury
 | 
			
		||||
                .castVote(VOTE_PROPOSAL_ID, true, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            verifyEventsFromLogs(
 | 
			
		||||
                tx.logs,
 | 
			
		||||
                [
 | 
			
		||||
                    {
 | 
			
		||||
                        voter: delegator,
 | 
			
		||||
                        operatedPoolIds: [],
 | 
			
		||||
                        proposalId: VOTE_PROPOSAL_ID,
 | 
			
		||||
                        support: true,
 | 
			
		||||
                        votingPower: DELEGATOR_VOTING_POWER,
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                ZrxTreasuryEvents.VoteCast,
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('execute()', () => {
 | 
			
		||||
        let passedProposalId: BigNumber;
 | 
			
		||||
        let failedProposalId: BigNumber;
 | 
			
		||||
        let defeatedProposalId: BigNumber;
 | 
			
		||||
        let ongoingVoteProposalId: BigNumber;
 | 
			
		||||
 | 
			
		||||
        before(async () => {
 | 
			
		||||
            // OPerator has enough ZRX to create and pass a proposal
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.quorumThreshold).awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.quorumThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            // Delegator only has enough ZRX to create a proposal
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            // Proposal 0
 | 
			
		||||
            let tx = treasury.propose(actions, currentEpoch.plus(4), PROPOSAL_DESCRIPTION, []);
 | 
			
		||||
            passedProposalId = await tx.callAsync({ from: delegator });
 | 
			
		||||
            await tx.awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            // Proposal 1
 | 
			
		||||
            tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []);
 | 
			
		||||
            failedProposalId = await tx.callAsync({ from: delegator });
 | 
			
		||||
            await tx.awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            // Proposal 2
 | 
			
		||||
            tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []);
 | 
			
		||||
            defeatedProposalId = await tx.callAsync({ from: delegator });
 | 
			
		||||
            await tx.awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            // Proposal 3
 | 
			
		||||
            tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []);
 | 
			
		||||
            ongoingVoteProposalId = await tx.callAsync({ from: delegator });
 | 
			
		||||
            await tx.awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            /********** Start Vote Epoch for Proposals 0, 1, 2 **********/
 | 
			
		||||
            // Proposal 0 passes
 | 
			
		||||
            await treasury.castVote(passedProposalId, true, []).awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            // Proposal 1 fails to reach quorum
 | 
			
		||||
            await treasury.castVote(failedProposalId, true, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            // Proposal 2 is voted down
 | 
			
		||||
            await treasury.castVote(defeatedProposalId, true, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await treasury.castVote(defeatedProposalId, false, []).awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
            /********** End Vote Epoch for Proposals 0, 1, 2 **********/
 | 
			
		||||
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            /********** Start Execution Epoch for Proposals 1, 2, 3 **********/
 | 
			
		||||
            /********** Start Vote Epoch for Proposal 3 **********************/
 | 
			
		||||
            // Proposal 3 has enough votes to pass, but the vote is ongoing
 | 
			
		||||
            await treasury
 | 
			
		||||
                .castVote(ongoingVoteProposalId, true, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute an invalid proposalId', async () => {
 | 
			
		||||
            const tx = treasury.execute(INVALID_PROPOSAL_ID, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('execute/INVALID_PROPOSAL_ID');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute a proposal whose vote is ongoing', async () => {
 | 
			
		||||
            const tx = treasury.execute(ongoingVoteProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute a proposal that failed to reach quorum', async () => {
 | 
			
		||||
            const tx = treasury.execute(failedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute a proposal that was defeated in its vote', async () => {
 | 
			
		||||
            const tx = treasury.execute(defeatedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute before or after the execution epoch', async () => {
 | 
			
		||||
            const tooEarly = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            expect(tooEarly).to.revertWith('_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH');
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            // Proposal 0 is executable here
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const tooLate = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tooLate).to.revertWith('_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute the same proposal twice', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            const tx = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED');
 | 
			
		||||
        });
 | 
			
		||||
        it('Cannot execute actions that do not match the proposal `actionsHash`', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const tx = treasury
 | 
			
		||||
                .execute(passedProposalId, [
 | 
			
		||||
                    {
 | 
			
		||||
                        target: zrx.address,
 | 
			
		||||
                        data: zrx.transfer(randomAddress(), GRANT_PROPOSALS[0].amount).getABIEncodedTransactionData(),
 | 
			
		||||
                        value: constants.ZERO_AMOUNT,
 | 
			
		||||
                    },
 | 
			
		||||
                ])
 | 
			
		||||
                .awaitTransactionSuccessAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('_assertProposalExecutable/INVALID_ACTIONS');
 | 
			
		||||
        });
 | 
			
		||||
        it('Can execute a valid proposal', async () => {
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const tx = await treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            verifyEventsFromLogs(tx.logs, [{ proposalId: passedProposalId }], ZrxTreasuryEvents.ProposalExecuted);
 | 
			
		||||
            expect(await zrx.balanceOf(GRANT_PROPOSALS[0].recipient).callAsync()).to.bignumber.equal(
 | 
			
		||||
                GRANT_PROPOSALS[0].amount,
 | 
			
		||||
            );
 | 
			
		||||
            expect(await zrx.balanceOf(GRANT_PROPOSALS[1].recipient).callAsync()).to.bignumber.equal(
 | 
			
		||||
                GRANT_PROPOSALS[1].amount,
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('Default pool operator contract', () => {
 | 
			
		||||
        it('Returns WETH to the staking proxy', async () => {
 | 
			
		||||
            const wethAmount = new BigNumber(1337);
 | 
			
		||||
            await weth.mint(wethAmount).awaitTransactionSuccessAsync();
 | 
			
		||||
            // Some amount of WETH ends up in the default pool operator
 | 
			
		||||
            // contract, e.g. from errant staking rewards.
 | 
			
		||||
            await weth.transfer(defaultPoolOperator.address, wethAmount).awaitTransactionSuccessAsync();
 | 
			
		||||
            // This function should send all the WETH to the staking proxy.
 | 
			
		||||
            await defaultPoolOperator.returnStakingRewards().awaitTransactionSuccessAsync();
 | 
			
		||||
            expect(await weth.balanceOf(defaultPoolOperator.address).callAsync()).to.bignumber.equal(0);
 | 
			
		||||
            expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(wethAmount);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('Can update thresholds via proposal', () => {
 | 
			
		||||
        it('Updates proposal and quorum thresholds', async () => {
 | 
			
		||||
            // Delegator has enough ZRX to create and pass a proposal
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.quorumThreshold).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, defaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.quorumThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
            const newProposalThreshold = new BigNumber(420);
 | 
			
		||||
            const newQuorumThreshold = new BigNumber(1337);
 | 
			
		||||
            const updateThresholdsAction = {
 | 
			
		||||
                target: treasury.address,
 | 
			
		||||
                data: treasury
 | 
			
		||||
                    .updateThresholds(newProposalThreshold, newQuorumThreshold)
 | 
			
		||||
                    .getABIEncodedTransactionData(),
 | 
			
		||||
                value: constants.ZERO_AMOUNT,
 | 
			
		||||
            };
 | 
			
		||||
            const tx = treasury.propose(
 | 
			
		||||
                [updateThresholdsAction],
 | 
			
		||||
                currentEpoch.plus(3),
 | 
			
		||||
                `Updates proposal threshold to ${newProposalThreshold} and quorum threshold to ${newQuorumThreshold}`,
 | 
			
		||||
                [],
 | 
			
		||||
            );
 | 
			
		||||
            const proposalId = await tx.callAsync({ from: delegator });
 | 
			
		||||
            await tx.awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await treasury.castVote(proposalId, true, []).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await treasury
 | 
			
		||||
                .execute(proposalId, [updateThresholdsAction])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            const proposalThreshold = await treasury.proposalThreshold().callAsync();
 | 
			
		||||
            const quorumThreshold = await treasury.quorumThreshold().callAsync();
 | 
			
		||||
            expect(proposalThreshold).to.bignumber.equal(newProposalThreshold);
 | 
			
		||||
            expect(quorumThreshold).to.bignumber.equal(newQuorumThreshold);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										9
									
								
								contracts/treasury/test/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								contracts/treasury/test/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
/*
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 * Warning: This file is auto-generated by contracts-gen. Don't edit manually.
 | 
			
		||||
 * -----------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
export * from '../test/generated-wrappers/default_pool_operator';
 | 
			
		||||
export * from '../test/generated-wrappers/i_staking';
 | 
			
		||||
export * from '../test/generated-wrappers/i_zrx_treasury';
 | 
			
		||||
export * from '../test/generated-wrappers/zrx_treasury';
 | 
			
		||||
							
								
								
									
										14
									
								
								contracts/treasury/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								contracts/treasury/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
{
 | 
			
		||||
    "extends": "../../tsconfig",
 | 
			
		||||
    "compilerOptions": { "outDir": "lib", "rootDir": ".", "resolveJsonModule": true },
 | 
			
		||||
    "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"],
 | 
			
		||||
    "files": [
 | 
			
		||||
        "generated-artifacts/DefaultPoolOperator.json",
 | 
			
		||||
        "generated-artifacts/ZrxTreasury.json",
 | 
			
		||||
        "test/generated-artifacts/DefaultPoolOperator.json",
 | 
			
		||||
        "test/generated-artifacts/IStaking.json",
 | 
			
		||||
        "test/generated-artifacts/IZrxTreasury.json",
 | 
			
		||||
        "test/generated-artifacts/ZrxTreasury.json"
 | 
			
		||||
    ],
 | 
			
		||||
    "exclude": ["./deploy/solc/solc_bin"]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								contracts/treasury/tslint.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contracts/treasury/tslint.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
{
 | 
			
		||||
    "extends": ["@0x/tslint-config"],
 | 
			
		||||
    "rules": {
 | 
			
		||||
        "custom-no-magic-numbers": false,
 | 
			
		||||
        "max-file-line-count": false,
 | 
			
		||||
        "no-non-null-assertion": false,
 | 
			
		||||
        "no-unnecessary-type-assertion": false,
 | 
			
		||||
        "number-literal-format": false
 | 
			
		||||
    },
 | 
			
		||||
    "linterOptions": {
 | 
			
		||||
        "exclude": ["src/artifacts.ts", "test/artifacts.ts"]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,127 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1616005394,
 | 
			
		||||
        "version": "4.7.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1614141718,
 | 
			
		||||
        "version": "4.7.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1612950500,
 | 
			
		||||
        "version": "4.7.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1611648096,
 | 
			
		||||
        "version": "4.7.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1610510890,
 | 
			
		||||
        "version": "4.7.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "4.7.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add `LibSafeMathV06.safeDowncastToUint128()`",
 | 
			
		||||
                "pr": 97
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add SPDX license identifiers to solidity files",
 | 
			
		||||
                "pr": 105
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1609802516
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.6.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.6.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.6.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.6.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.6.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "4.6.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add `uint128` functions to `LibSafeMathV06`",
 | 
			
		||||
                "pr": 27
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1605763885
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.5.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.5.7",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,59 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.7.5 - _March 17, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.7.4 - _February 24, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.7.3 - _February 10, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.7.2 - _January 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.7.1 - _January 13, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.7.0 - _January 4, 2021_
 | 
			
		||||
 | 
			
		||||
    * Add `LibSafeMathV06.safeDowncastToUint128()` (#97)
 | 
			
		||||
    * Add SPDX license identifiers to solidity files (#105)
 | 
			
		||||
 | 
			
		||||
## v4.6.5 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.4 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.3 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.2 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.1 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.0 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add `uint128` functions to `LibSafeMathV06` (#27)
 | 
			
		||||
 | 
			
		||||
## v4.5.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.5.7 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2019 ZeroEx Intl.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
@@ -105,4 +106,100 @@ library LibSafeMathV06 {
 | 
			
		||||
    {
 | 
			
		||||
        return a < b ? a : b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeMul128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (a == 0) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        uint128 c = a * b;
 | 
			
		||||
        if (c / a != b) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeDiv128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (b == 0) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        uint128 c = a / b;
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeSub128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (b > a) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return a - b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeAdd128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        uint128 c = a + b;
 | 
			
		||||
        if (c < a) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function max128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        return a >= b ? a : b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function min128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        return a < b ? a : b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeDowncastToUint128(uint256 a)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (a > type(uint128).max) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128,
 | 
			
		||||
                a
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return uint128(a);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2019 ZeroEx Intl.
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user