Compare commits
	
		
			178 Commits
		
	
	
		
			feat/PTP
			...
			protocol@5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 5653ee8f86 | ||
|  | d180d5325d | ||
|  | d249042b47 | ||
|  | d3a6f79015 | ||
|  | 8c9dc96e5d | ||
|  | fc0edba46b | ||
|  | 37dc99181e | ||
|  | 6efb9f532b | ||
|  | 9b7d88e136 | ||
|  | e51e1f1674 | ||
|  | 036a263267 | ||
|  | 1fb44a55b4 | ||
|  | d738eede0e | ||
|  | a99c916100 | ||
|  | 2abb00b5e2 | ||
|  | ef723e6f36 | ||
|  | 1fc139886e | ||
|  | 2be10bc72f | ||
|  | abdc02f066 | ||
|  | b7ef5473cd | ||
|  | e43cdda22f | ||
|  | 416f2ec24c | ||
|  | 4f7fe66d74 | ||
|  | eb394383d8 | ||
|  | 92e681f21b | ||
|  | 3f65dd6049 | ||
|  | 4425c316a3 | ||
|  | 9058839645 | ||
|  | 46a7a2e620 | ||
|  | b35dccd43d | ||
|  | 08e0c2ebb9 | ||
|  | 8aa313a437 | ||
|  | 8e9699c340 | ||
|  | 939b708e63 | ||
|  | 1617e3fc44 | ||
|  | e0d705703d | ||
|  | 01a6d933ca | ||
|  | 9b9f0b91d7 | ||
|  | 0d0fef841d | ||
|  | 17adfbea32 | ||
|  | 80594622b2 | ||
|  | 0dba5a5a3a | ||
|  | 4dae8de1b6 | ||
|  | 0046bb26d8 | ||
|  | fe935f787c | ||
|  | 1b527ffcd8 | ||
|  | 9f5324d9c3 | ||
|  | 3647392a04 | ||
|  | 1d49662c58 | ||
|  | 6324b08b4d | ||
|  | fe73b63aaa | ||
|  | 192d0b17d9 | ||
|  | aa74d04083 | ||
|  | d586f5727d | ||
|  | 98fc79a085 | ||
|  | c12a10b96e | ||
|  | d3d4a08f91 | ||
|  | 9ce090c8cd | ||
|  | 980d60deb8 | ||
|  | d6d79e51e7 | ||
|  | 3ef5de93bb | ||
|  | ab7dc33ca4 | ||
|  | 14dcee5bb6 | ||
|  | 9856e78609 | ||
|  | 2801b066b3 | ||
|  | 5bc8b13fc3 | ||
|  | 36dba8f5be | ||
|  | ee2c069889 | ||
|  | 6ca14ed7b2 | ||
|  | a5babb9a34 | ||
|  | 661cc4669d | ||
|  | 553ba5c868 | ||
|  | d03d2f254d | ||
|  | feb91a04b0 | ||
|  | 4d63f33aba | ||
|  | b72b8b5ffd | ||
|  | f7cb7a0f51 | ||
|  | 9fcb28f5d8 | ||
|  | 982173471c | ||
|  | e77958425f | ||
|  | 6af4d71573 | ||
|  | ee985240fb | ||
|  | 2aadbda527 | ||
|  | 297c73abcc | ||
|  | 4c9e1b21ec | ||
|  | 41685d1545 | ||
|  | b9c25112ed | ||
|  | f0738fc122 | ||
|  | 42baf504b7 | ||
|  | 56038d122f | ||
|  | c4446b6c0e | ||
|  | eaed2958c3 | ||
|  | a045a3afb8 | ||
|  | 1cc59ab1ab | ||
|  | 2c6a714b71 | ||
|  | d8c97d6720 | ||
|  | d6bc702550 | ||
|  | 2838cb9420 | ||
|  | b10cfc50d3 | ||
|  | 2e6317b01e | ||
|  | 50e99e6eac | ||
|  | 8f2f4554eb | ||
|  | 67d9678a3a | ||
|  | f70341fb48 | ||
|  | 14cd24ea47 | ||
|  | 78328056d7 | ||
|  | 0045a60b0f | ||
|  | e4e71c76e1 | ||
|  | ca8127545f | ||
|  | 7b709089ce | ||
|  | 190f7e45f2 | ||
|  | 0dcc3a6fc3 | ||
|  | c2e8cae293 | ||
|  | 83da7caab4 | ||
|  | fd69a0c273 | ||
|  | 9b131199ad | ||
|  | f5c486050b | ||
|  | 1f41fe6a20 | ||
|  | 7f4080e0a2 | ||
|  | db76da58d7 | ||
|  | cf8fc0ff8e | ||
|  | 2d16f83e37 | ||
|  | 4057bdab91 | ||
|  | 1cd10f0ac9 | ||
|  | 68f87b2432 | ||
|  | 69bafc3bcd | ||
|  | 2c44b06b7b | ||
|  | 0233f00b4e | ||
|  | fedb53187d | ||
|  | 6774d2f588 | ||
|  | cf740b74f5 | ||
|  | 177c00463a | ||
|  | 49b0e32129 | ||
|  | 938fc94756 | ||
|  | 1561d91c2b | ||
|  | 9a28e51f51 | ||
|  | f55eaa867b | ||
|  | 6b2856424a | ||
|  | da757c4700 | ||
|  | 75e6654884 | ||
|  | 87308e7693 | ||
|  | d5eef93a76 | ||
|  | a7f23a982e | ||
|  | 9eadc5fc28 | ||
|  | 92ad1a612e | ||
|  | 09413c0e12 | ||
|  | 23788b41d5 | ||
|  | ccf999a495 | ||
|  | aa1016ee5f | ||
|  | 423ef57344 | ||
|  | c18149e82f | ||
|  | d14aebf724 | ||
|  | ba719a9631 | ||
|  | d36034d958 | ||
|  | 7750c57620 | ||
|  | 4d027e11d1 | ||
|  | 470e9a4697 | ||
|  | 7c51412e2f | ||
|  | b3d1f3cd10 | ||
|  | 389bb77439 | ||
|  | 4327885a00 | ||
|  | 0aef0afbbb | ||
|  | fa4c3a4f5f | ||
|  | 1d7c527c5c | ||
|  | cbe3135e4b | ||
|  | 955ad49711 | ||
|  | 8d6f6e76e0 | ||
|  | 9337115650 | ||
|  | fa45a44fe4 | ||
|  | c9c7ac8559 | ||
|  | c881723578 | ||
|  | c9c30d3a76 | ||
|  | 73dfdb5b69 | ||
|  | e638268f94 | ||
|  | 0bfd765481 | ||
|  | 1f12893735 | ||
|  | dd3d9337c4 | ||
|  | 904214f4a8 | 
| @@ -1,16 +1,27 @@ | ||||
| version: 2.1 | ||||
|  | ||||
| parameters: | ||||
|     cache_version: | ||||
|         type: string | ||||
|         default: v4 | ||||
|  | ||||
| jobs: | ||||
|     build: | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         environment: | ||||
|             NODE_OPTIONS: '--max-old-space-size=16384' | ||||
|         working_directory: ~/repo | ||||
|             NODE_OPTIONS: "--max-old-space-size=16384" | ||||
|         steps: | ||||
|             - checkout | ||||
|             - run: git submodule update --init --recursive | ||||
|             - run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - run: | ||||
|                   name: install-yarn | ||||
|                   command: npm install --force --global yarn@1.22.0 | ||||
| @@ -18,78 +29,176 @@ jobs: | ||||
|                   name: yarn | ||||
|                   command: yarn --frozen-lockfile --ignore-engines install || yarn --frozen-lockfile --ignore-engines install | ||||
|             - setup_remote_docker | ||||
|             - run: yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci | ||||
|             - run: yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts | ||||
|             - run: yarn build:ci | ||||
|             - save_cache: | ||||
|                   key: repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   key: cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|                   paths: | ||||
|                       - ~/repo | ||||
|                       - ~/project/contracts/erc20/node_modules | ||||
|                       - ~/project/contracts/test-utils/node_modules | ||||
|                       - ~/project/contracts/treasury/node_modules | ||||
|                       - ~/project/contracts/utils/node_modules | ||||
|                       - ~/project/contracts/zero-ex/node_modules | ||||
|                       - ~/project/node_modules | ||||
|                       - ~/project/packages/asset-swapper/node_modules | ||||
|                       - ~/project/packages/contract-addresses/node_modules | ||||
|                       - ~/project/packages/contract-artifacts/node_modules | ||||
|                       - ~/project/packages/contract-wrappers/node_modules | ||||
|                       - ~/project/packages/protocol-utils/node_modules | ||||
|                       - ~/.cache/yarn | ||||
|             - save_cache: | ||||
|                   key: lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|                   paths: | ||||
|                       - ~/project/contracts/erc20/generated-artifacts/ | ||||
|                       - ~/project/contracts/erc20/generated-wrappers/ | ||||
|                       - ~/project/contracts/erc20/lib/ | ||||
|                       - ~/project/contracts/erc20/test/generated-artifacts/ | ||||
|                       - ~/project/contracts/erc20/test/generated-wrappers/ | ||||
|                       - ~/project/contracts/test-utils/lib/ | ||||
|                       - ~/project/contracts/treasury/generated-artifacts/ | ||||
|                       - ~/project/contracts/treasury/generated-wrappers/ | ||||
|                       - ~/project/contracts/treasury/lib/ | ||||
|                       - ~/project/contracts/treasury/test/generated-artifacts/ | ||||
|                       - ~/project/contracts/treasury/test/generated-wrappers/ | ||||
|                       - ~/project/contracts/utils/generated-artifacts/ | ||||
|                       - ~/project/contracts/utils/generated-wrappers/ | ||||
|                       - ~/project/contracts/utils/lib/ | ||||
|                       - ~/project/contracts/utils/test/generated-artifacts/ | ||||
|                       - ~/project/contracts/utils/test/generated-wrappers/ | ||||
|                       - ~/project/contracts/zero-ex/generated-artifacts/ | ||||
|                       - ~/project/contracts/zero-ex/generated-wrappers/ | ||||
|                       - ~/project/contracts/zero-ex/lib/ | ||||
|                       - ~/project/contracts/zero-ex/test/generated-artifacts/ | ||||
|                       - ~/project/contracts/zero-ex/test/generated-wrappers/ | ||||
|                       - ~/project/packages/contract-addresses/lib/ | ||||
|                       - ~/project/packages/contract-artifacts/lib/ | ||||
|                       - ~/project/packages/contract-wrappers/lib/ | ||||
|                       - ~/project/packages/protocol-utils/lib/ | ||||
|             - store_artifacts: | ||||
|                   path: ~/repo/packages/abi-gen/test-cli/output | ||||
|             - store_artifacts: | ||||
|                   path: ~/repo/packages/contract-wrappers/generated_docs | ||||
|     test-exchange-ganache: | ||||
|         resource_class: medium+ | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: yarn wsrun -p @0x/contracts-exchange -m --serial -c test:circleci | ||||
|     test-integrations-ganache: | ||||
|         resource_class: medium+ | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: yarn wsrun -p @0x/contracts-integrations -m --serial -c test:circleci | ||||
|     test-contracts-staking-ganache: | ||||
|         resource_class: medium+ | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: yarn wsrun -p @0x/contracts-staking -m --serial -c test:circleci | ||||
|     test-contracts-extra-ganache: | ||||
|         resource_class: medium+ | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }} | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: yarn wsrun -p @0x/contracts-exchange-forwarder -p @0x/contracts-coordinator -m --serial -c test:circleci | ||||
|     test-contracts-rest-ganache: | ||||
|         resource_class: medium+ | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - run: | | ||||
|                   git diff --name-only development >> changed.txt | ||||
|                   if ! grep -q \.sol changed.txt; then | ||||
|                     circleci-agent step halt | ||||
|                   fi | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-multisig -p @0x/contracts-utils -p @0x/contracts-exchange-libs -p  @0x/contracts-erc20 -p @0x/contracts-erc721 -p @0x/contracts-erc1155 -p @0x/contracts-asset-proxy -p @0x/contracts-broker -p @0x/contracts-zero-ex -m --serial -c test:circleci | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: | | ||||
|                   yarn wsrun \ | ||||
|                     -p @0x/contracts-multisig \ | ||||
|                     -p @0x/contracts-utils \ | ||||
|                     -p @0x/contracts-exchange-libs \ | ||||
|                     -p @0x/contracts-erc20 \ | ||||
|                     -p @0x/contracts-erc721 \ | ||||
|                     -p @0x/contracts-erc1155 \ | ||||
|                     -p @0x/contracts-asset-proxy \ | ||||
|                     -p @0x/contracts-broker \ | ||||
|                     -p @0x/contracts-zero-ex \ | ||||
|                     -m --serial -c test:circleci | ||||
|     test-foundry: | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: ghcr.io/foundry-rs/foundry:latest | ||||
|         steps: | ||||
|             - checkout | ||||
|             - run: | | ||||
|                   git diff --name-only development >> changed.txt | ||||
|                   cat changed.txt | ||||
|                   if ! grep -q \.sol changed.txt; then | ||||
|                     circleci-agent step halt | ||||
|                   fi | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: git submodule update --init --recursive | ||||
|             - run: | ||||
|                 command: forge test | ||||
|                 working_directory: ~/project/contracts/zero-ex | ||||
|     test-publish: | ||||
|         resource_class: large | ||||
|         environment: | ||||
|             NODE_OPTIONS: '--max-old-space-size=6442' | ||||
|             NODE_OPTIONS: "--max-old-space-size=6442" | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|             - image: 0xorg/verdaccio | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - run: | | ||||
|                   git diff --name-only development >> changed.txt | ||||
|                   cat changed.txt | ||||
|                   if ! grep -q packages/ changed.txt; then | ||||
|                     circleci-agent step halt | ||||
|                   fi | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: | ||||
|                   command: yarn test:publish:circleci | ||||
|                   no_output_timeout: 1800 | ||||
| @@ -98,70 +207,84 @@ jobs: | ||||
|     test-doc-generation: | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: | ||||
|                   command: yarn test:generate_docs:circleci | ||||
|                   no_output_timeout: 1200 | ||||
|     test-rest: | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         environment: | ||||
|             RUST_ROUTER: "true" | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-addresses -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-artifacts -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-wrappers-test -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/migrations -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/order-utils -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/asset-swapper -m --serial -c test:circleci | ||||
|             - save_cache: | ||||
|                   key: coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   key: coverage-contract-wrappers-test-{{ checksum "yarn.lock" }} | ||||
|                   paths: | ||||
|                       - ~/repo/packages/contract-wrappers-test/coverage/lcov.info | ||||
|             - save_cache: | ||||
|                   key: coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   key: coverage-order-utils-{{ checksum "yarn.lock" }} | ||||
|                   paths: | ||||
|                       - ~/repo/packages/order-utils/coverage/lcov.info | ||||
|             - save_cache: | ||||
|                   key: coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   key: coverage-web3-wrapper-{{ checksum "yarn.lock" }} | ||||
|                   paths: | ||||
|                       - ~/repo/packages/web3-wrapper/coverage/lcov.info | ||||
|     static-tests: | ||||
|         resource_class: large | ||||
|         working_directory: ~/repo | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         steps: | ||||
|             - checkout | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn lerna run lint | ||||
|             - run: yarn prettier:ci | ||||
|             - run: yarn deps_versions:ci | ||||
|             - run: yarn diff_md_docs:ci | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - run: | ||||
|                   command: yarn lerna run lint | ||||
|             - run: | ||||
|                   command: yarn prettier:ci | ||||
|             - run: | ||||
|                   command: yarn deps_versions:ci | ||||
|             - run: | ||||
|                   command: yarn diff_md_docs:ci | ||||
|     submit-coverage: | ||||
|         docker: | ||||
|             - image: node:16 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >> | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - lib-{{ .Environment.CIRCLE_BRANCH }} | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - coverage-contract-wrappers-test-{{ checksum "yarn.lock" }} | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - coverage-contracts-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                       - coverage-order-utils-{{ checksum "yarn.lock" }} | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - coverage-contracts-{{ checksum "yarn.lock" }} | ||||
|             - run: yarn report_coverage | ||||
| workflows: | ||||
|     version: 2 | ||||
| @@ -181,6 +304,9 @@ workflows: | ||||
|             # - test-contracts-extra-ganache: | ||||
|             #       requires: | ||||
|             #           - build | ||||
|             - test-foundry: | ||||
|                   requires: | ||||
|                       - build | ||||
|             - test-contracts-rest-ganache: | ||||
|                   requires: | ||||
|                       - build | ||||
|   | ||||
							
								
								
									
										1
									
								
								.github/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1,6 @@ | ||||
| python: ['python-packages'] | ||||
| contracts: ['contracts'] | ||||
| @0x/contract-addresses: ['packages/contract-addresses'] | ||||
| @0x/migrations: ['packages/migrations'] | ||||
| @0x/order-utils: ['packages/order-utils'] | ||||
| @0x/contract-artifacts: ['packages/contract-artifacts'] | ||||
| @0x/contract-wrappers: ['packages/contract-wrappers'] | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							| @@ -28,7 +28,7 @@ jobs: | ||||
|                 fetch-depth: 0 | ||||
|             - uses: actions/setup-node@v1 | ||||
|               with: | ||||
|                 node-version: 10 | ||||
|                 node-version: 16 | ||||
|             - uses: actions/setup-python@v2 | ||||
|             - name: 'configure git' | ||||
|               run: | | ||||
|   | ||||
							
								
								
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -173,6 +173,15 @@ contracts/zero-ex/test/generated-wrappers/ | ||||
| contracts/treasury/generated-wrappers/ | ||||
| contracts/treasury/test/generated-wrappers/ | ||||
|  | ||||
| # foundry artifacts | ||||
| contracts/zero-ex/foundry-artifacts/ | ||||
|  | ||||
| # foundry cache  | ||||
| contracts/zero-ex/foundry-cache/ | ||||
|  | ||||
| # typechain wrappers | ||||
| contracts/zero-ex/typechain-wrappers/ | ||||
|  | ||||
| # Doc README copy | ||||
| packages/*/docs/README.md | ||||
|  | ||||
|   | ||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| [submodule "contracts/zero-ex/contracts/deps/forge-std"] | ||||
| 	path = contracts/zero-ex/contracts/deps/forge-std | ||||
| 	url = https://github.com/foundry-rs/forge-std | ||||
							
								
								
									
										18
									
								
								CODEOWNERS
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								CODEOWNERS
									
									
									
									
									
								
							| @@ -1,18 +1,20 @@ | ||||
| # See https://help.github.com/articles/about-codeowners/ | ||||
|  | ||||
| # for more info about CODEOWNERS file | ||||
|  | ||||
| # It uses the same pattern rule for gitignore file | ||||
|  | ||||
| # https://git-scm.com/docs/gitignore#_pattern_format | ||||
|  | ||||
| # Website | ||||
| packages/asset-swapper/  @BMillman19 @fragosti @dave4506 | ||||
| packages/instant/  @BMillman19 @fragosti @dave4506 | ||||
| packages/asset-swapper/ @dekz @dextracker @kyu-c | ||||
|  | ||||
| # Dev tools & setup | ||||
| .circleci/ @dorothy-zbornak | ||||
| packages/contract-addresses/ @abandeali1 | ||||
| packages/contract-artifacts/ @abandeali1 | ||||
| packages/order-utils/ @dorothy-zbornak  | ||||
|  | ||||
| .circleci/ @dekz | ||||
| packages/contract-addresses/ @dekz @dextracker @kyu-c | ||||
| packages/contract-artifacts/ @dekz | ||||
| packages/protocol-utils/ @dekz | ||||
|  | ||||
| # Protocol/smart contracts | ||||
| contracts/ @abandeali1 @hysz @dorothy-zbornak @mzhu25 | ||||
|  | ||||
| contracts/ @dekz @dextracker | ||||
|   | ||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @@ -34,11 +34,9 @@ These packages are all under development. See [/contracts/README.md](/contracts/ | ||||
|  | ||||
| | Package                                                  | Version                                                                                                                 | Description                                                                                    | | ||||
| | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | ||||
| | [`@0x/asset-swapper`](/packages/asset-swapper)           | [](https://www.npmjs.com/package/@0x/asset-swapper)           | Package used to find and create aggregated swaps                                               | | ||||
| | [`@0x/protocol-utils`](/packages/protocol-utils)         | [](https://www.npmjs.com/package/@0x/protocol-utils)         | A set of utilities for generating, parsing, signing and validating 0x orders                   | | ||||
| | [`@0x/contract-addresses`](/packages/contract-addresses) | [](https://www.npmjs.com/package/@0x/contract-addresses) | A tiny utility library for getting known deployed contract addresses for a particular network. | | ||||
| | [`@0x/contract-wrappers`](/packages/contract-wrappers)   | [](https://www.npmjs.com/package/@0x/contract-wrappers)   | JS/TS wrappers for interacting with the 0x smart contracts                                     | | ||||
| | [`@0x/migrations`](/packages/migrations)                 | [](https://www.npmjs.com/package/@0x/migrations)                 | Migration tool for deploying 0x smart contracts on private testnets                            | | ||||
| | [`@0x/contract-artifacts`](/packages/contract-artifacts) | [](https://www.npmjs.com/package/@0x/contract-artifacts) | 0x smart contract compilation artifacts                                                        |  | | ||||
|  | ||||
| ## Usage | ||||
| @@ -83,7 +81,7 @@ yarn build | ||||
| To build a specific package: | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/asset-swapper yarn build | ||||
| PKG=@0x/protocol-utils yarn build | ||||
| ``` | ||||
|  | ||||
| To build all contracts packages: | ||||
| @@ -106,7 +104,7 @@ To watch a specific package and all it's dependent packages: | ||||
| PKG=[NPM_PACKAGE_NAME] yarn watch | ||||
|  | ||||
| e.g | ||||
| PKG=@0x/asset-swapper yarn watch | ||||
| PKG=@0x/protocol-utils yarn watch | ||||
| ``` | ||||
|  | ||||
| ### Clean | ||||
| @@ -120,7 +118,7 @@ yarn clean | ||||
| Clean a specific package | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/asset-swapper yarn clean | ||||
| PKG=@0x/protocol-utils yarn clean | ||||
| ``` | ||||
|  | ||||
| ### Rebuild | ||||
| @@ -134,7 +132,7 @@ yarn rebuild | ||||
| To re-build (clean & build) a specific package & it's deps: | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/asset-swapper yarn rebuild | ||||
| PKG=@0x/protocol-utils yarn rebuild | ||||
| ``` | ||||
|  | ||||
| ### Lint | ||||
| @@ -148,7 +146,7 @@ yarn lint | ||||
| Lint a specific package: | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/asset-swapper yarn lint | ||||
| PKG=@0x/protocol-utils yarn lint | ||||
| ``` | ||||
|  | ||||
| ### Run Tests | ||||
| @@ -162,7 +160,7 @@ yarn test | ||||
| Run a specific package's test: | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/asset-swapper yarn test | ||||
| PKG=@0x/protocol-utils yarn test | ||||
| ``` | ||||
|  | ||||
| Run all contracts packages tests: | ||||
|   | ||||
| @@ -1,4 +1,139 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1662559804, | ||||
|         "version": "3.3.42", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662147076, | ||||
|         "version": "3.3.41", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662046042, | ||||
|         "version": "3.3.40", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661462289, | ||||
|         "version": "3.3.39", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661459661, | ||||
|         "version": "3.3.38", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661145612, | ||||
|         "version": "3.3.37", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660093941, | ||||
|         "version": "3.3.36", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660073235, | ||||
|         "version": "3.3.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1659750766, | ||||
|         "version": "3.3.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1658950329, | ||||
|         "version": "3.3.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1655244958, | ||||
|         "version": "3.3.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1654284040, | ||||
|         "version": "3.3.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1652919697, | ||||
|         "version": "3.3.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1650611093, | ||||
|         "version": "3.3.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1648739346, | ||||
|         "version": "3.3.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1646225739, | ||||
|         "version": "3.3.27", | ||||
|   | ||||
| @@ -5,6 +5,66 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.3.42 - _September 7, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.41 - _September 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.40 - _September 1, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.39 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.38 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.37 - _August 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.36 - _August 10, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.35 - _August 9, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.34 - _August 6, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.33 - _July 27, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.32 - _June 14, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.31 - _June 3, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.30 - _May 19, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.29 - _April 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.28 - _March 31, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.27 - _March 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc20", | ||||
|     "version": "3.3.27", | ||||
|     "version": "3.3.42", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,18 +51,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.7.2", | ||||
|         "@0x/contracts-gen": "^2.0.43", | ||||
|         "@0x/contracts-test-utils": "^5.4.18", | ||||
|         "@0x/contracts-utils": "^4.8.8", | ||||
|         "@0x/dev-utils": "^4.2.11", | ||||
|         "@0x/sol-compiler": "^4.7.8", | ||||
|         "@0x/abi-gen": "^5.8.1", | ||||
|         "@0x/contracts-gen": "^2.0.47", | ||||
|         "@0x/contracts-test-utils": "^5.4.33", | ||||
|         "@0x/contracts-utils": "^4.8.23", | ||||
|         "@0x/dev-utils": "^5.0.0", | ||||
|         "@0x/sol-compiler": "^4.8.2", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@0x/typescript-typings": "^5.2.1", | ||||
|         "@0x/utils": "^6.5.0", | ||||
|         "@0x/web3-wrapper": "^7.6.2", | ||||
|         "@0x/types": "^3.3.6", | ||||
|         "@0x/typescript-typings": "^5.3.1", | ||||
|         "@0x/utils": "^7.0.0", | ||||
|         "@0x/web3-wrapper": "^8.0.0", | ||||
|         "@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.6.0", | ||||
|         "ethereum-types": "^3.7.1", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -79,10 +79,10 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "4.6.3" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.5", | ||||
|         "@0x/base-contract": "^7.0.0", | ||||
|         "ethers": "~4.0.4" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,139 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1662559804, | ||||
|         "version": "5.4.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662147076, | ||||
|         "version": "5.4.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662046042, | ||||
|         "version": "5.4.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661462289, | ||||
|         "version": "5.4.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661459661, | ||||
|         "version": "5.4.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661145612, | ||||
|         "version": "5.4.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660093941, | ||||
|         "version": "5.4.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660073235, | ||||
|         "version": "5.4.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1659750766, | ||||
|         "version": "5.4.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1658950329, | ||||
|         "version": "5.4.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1655244958, | ||||
|         "version": "5.4.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1654284040, | ||||
|         "version": "5.4.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1652919697, | ||||
|         "version": "5.4.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1650611093, | ||||
|         "version": "5.4.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1648739346, | ||||
|         "version": "5.4.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1646225739, | ||||
|         "version": "5.4.18", | ||||
|   | ||||
| @@ -5,6 +5,66 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v5.4.33 - _September 7, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.32 - _September 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.31 - _September 1, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.30 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.29 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.28 - _August 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.27 - _August 10, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.26 - _August 9, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.25 - _August 6, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.24 - _July 27, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.23 - _June 14, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.22 - _June 3, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.21 - _May 19, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.20 - _April 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.19 - _March 31, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.18 - _March 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-test-utils", | ||||
|     "version": "5.4.18", | ||||
|     "version": "5.4.33", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -34,28 +34,28 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/sol-compiler": "^4.7.8", | ||||
|         "@0x/sol-compiler": "^4.8.2", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "4.6.3" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.31", | ||||
|         "@0x/base-contract": "^6.4.5", | ||||
|         "@0x/contract-addresses": "^6.12.0", | ||||
|         "@0x/dev-utils": "^4.2.11", | ||||
|         "@0x/json-schemas": "^6.4.1", | ||||
|         "@0x/assert": "^3.0.35", | ||||
|         "@0x/base-contract": "^7.0.0", | ||||
|         "@0x/contract-addresses": "^6.23.2", | ||||
|         "@0x/dev-utils": "^5.0.0", | ||||
|         "@0x/json-schemas": "^6.4.4", | ||||
|         "@0x/order-utils": "^10.4.28", | ||||
|         "@0x/sol-coverage": "^4.0.42", | ||||
|         "@0x/sol-profiler": "^4.1.32", | ||||
|         "@0x/sol-trace": "^3.0.42", | ||||
|         "@0x/subproviders": "^6.6.2", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@0x/typescript-typings": "^5.2.1", | ||||
|         "@0x/utils": "^6.5.0", | ||||
|         "@0x/web3-wrapper": "^7.6.2", | ||||
|         "@0x/sol-coverage": "^4.0.46", | ||||
|         "@0x/sol-profiler": "^4.1.36", | ||||
|         "@0x/sol-trace": "^3.0.46", | ||||
|         "@0x/subproviders": "^7.0.0", | ||||
|         "@0x/types": "^3.3.6", | ||||
|         "@0x/typescript-typings": "^5.3.1", | ||||
|         "@0x/utils": "^7.0.0", | ||||
|         "@0x/web3-wrapper": "^8.0.0", | ||||
|         "@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.6.0", | ||||
|         "ethereum-types": "^3.7.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethers": "~4.0.4", | ||||
|         "js-combinatorics": "^0.5.3", | ||||
|   | ||||
| @@ -38,7 +38,7 @@ async function _getGanacheOrGethErrorAsync(ganacheError: string, gethError: stri | ||||
| } | ||||
|  | ||||
| async function _getInsufficientFundsErrorMessageAsync(): Promise<string> { | ||||
|     return _getGanacheOrGethErrorAsync("sender doesn't have enough funds", 'insufficient funds'); | ||||
|     return _getGanacheOrGethErrorAsync('insufficient funds for gas * price + value', 'insufficient funds'); | ||||
| } | ||||
|  | ||||
| async function _getTransactionFailedErrorMessageAsync(): Promise<string> { | ||||
|   | ||||
| @@ -1,4 +1,139 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1662559804, | ||||
|         "version": "1.4.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662147076, | ||||
|         "version": "1.4.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662046042, | ||||
|         "version": "1.4.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661462289, | ||||
|         "version": "1.4.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661459661, | ||||
|         "version": "1.4.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661145612, | ||||
|         "version": "1.4.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660093941, | ||||
|         "version": "1.4.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660073235, | ||||
|         "version": "1.4.18", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1659750766, | ||||
|         "version": "1.4.17", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1658950329, | ||||
|         "version": "1.4.16", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1655244958, | ||||
|         "version": "1.4.15", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1654284040, | ||||
|         "version": "1.4.14", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1652919697, | ||||
|         "version": "1.4.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1650611093, | ||||
|         "version": "1.4.12", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1648739346, | ||||
|         "version": "1.4.11", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1646225739, | ||||
|         "version": "1.4.10", | ||||
|   | ||||
| @@ -5,6 +5,66 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.4.25 - _September 7, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.24 - _September 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.23 - _September 1, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.22 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.21 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.20 - _August 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.19 - _August 10, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.18 - _August 9, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.17 - _August 6, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.16 - _July 27, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.15 - _June 14, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.14 - _June 3, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.13 - _May 19, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.12 - _April 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.11 - _March 31, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.4.10 - _March 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-treasury", | ||||
|     "version": "1.4.10", | ||||
|     "version": "1.4.25", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -46,14 +46,14 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.7.2", | ||||
|         "@0x/contract-addresses": "^6.12.0", | ||||
|         "@0x/abi-gen": "^5.8.1", | ||||
|         "@0x/contract-addresses": "^6.23.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.19", | ||||
|         "@0x/contracts-erc20": "^3.3.27", | ||||
|         "@0x/contracts-gen": "^2.0.43", | ||||
|         "@0x/contracts-erc20": "^3.3.42", | ||||
|         "@0x/contracts-gen": "^2.0.47", | ||||
|         "@0x/contracts-staking": "^2.0.45", | ||||
|         "@0x/contracts-test-utils": "^5.4.18", | ||||
|         "@0x/sol-compiler": "^4.7.8", | ||||
|         "@0x/contracts-test-utils": "^5.4.33", | ||||
|         "@0x/sol-compiler": "^4.8.2", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@types/isomorphic-fetch": "^0.0.35", | ||||
| @@ -69,17 +69,17 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "4.6.3" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.5", | ||||
|         "@0x/protocol-utils": "^1.11.1", | ||||
|         "@0x/subproviders": "^6.6.2", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@0x/typescript-typings": "^5.2.1", | ||||
|         "@0x/utils": "^6.5.0", | ||||
|         "@0x/web3-wrapper": "^7.6.2", | ||||
|         "ethereum-types": "^3.6.0", | ||||
|         "@0x/base-contract": "^7.0.0", | ||||
|         "@0x/protocol-utils": "^11.16.9", | ||||
|         "@0x/subproviders": "^7.0.0", | ||||
|         "@0x/types": "^3.3.6", | ||||
|         "@0x/typescript-typings": "^5.3.1", | ||||
|         "@0x/utils": "^7.0.0", | ||||
|         "@0x/web3-wrapper": "^8.0.0", | ||||
|         "ethereum-types": "^3.7.1", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,139 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1662559804, | ||||
|         "version": "4.8.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662147076, | ||||
|         "version": "4.8.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662046042, | ||||
|         "version": "4.8.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661462289, | ||||
|         "version": "4.8.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661459661, | ||||
|         "version": "4.8.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661145612, | ||||
|         "version": "4.8.18", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660093941, | ||||
|         "version": "4.8.17", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660073235, | ||||
|         "version": "4.8.16", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1659750766, | ||||
|         "version": "4.8.15", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1658950329, | ||||
|         "version": "4.8.14", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1655244958, | ||||
|         "version": "4.8.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1654284040, | ||||
|         "version": "4.8.12", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1652919697, | ||||
|         "version": "4.8.11", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1650611093, | ||||
|         "version": "4.8.10", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1648739346, | ||||
|         "version": "4.8.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1646225739, | ||||
|         "version": "4.8.8", | ||||
|   | ||||
| @@ -5,6 +5,66 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.8.23 - _September 7, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.22 - _September 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.21 - _September 1, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.20 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.19 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.18 - _August 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.17 - _August 10, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.16 - _August 9, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.15 - _August 6, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.14 - _July 27, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.13 - _June 14, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.12 - _June 3, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.11 - _May 19, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.10 - _April 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.9 - _March 31, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.8.8 - _March 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-utils", | ||||
|     "version": "4.8.8", | ||||
|     "version": "4.8.23", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -50,15 +50,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.7.2", | ||||
|         "@0x/contracts-gen": "^2.0.43", | ||||
|         "@0x/contracts-test-utils": "^5.4.18", | ||||
|         "@0x/dev-utils": "^4.2.11", | ||||
|         "@0x/abi-gen": "^5.8.1", | ||||
|         "@0x/contracts-gen": "^2.0.47", | ||||
|         "@0x/contracts-test-utils": "^5.4.33", | ||||
|         "@0x/dev-utils": "^5.0.0", | ||||
|         "@0x/order-utils": "^10.4.28", | ||||
|         "@0x/sol-compiler": "^4.7.8", | ||||
|         "@0x/sol-compiler": "^4.8.2", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@0x/web3-wrapper": "^7.6.2", | ||||
|         "@0x/types": "^3.3.6", | ||||
|         "@0x/web3-wrapper": "^8.0.0", | ||||
|         "@types/bn.js": "^4.11.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -76,14 +76,14 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "4.6.3" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.5", | ||||
|         "@0x/typescript-typings": "^5.2.1", | ||||
|         "@0x/utils": "^6.5.0", | ||||
|         "@0x/base-contract": "^7.0.0", | ||||
|         "@0x/typescript-typings": "^5.3.1", | ||||
|         "@0x/utils": "^7.0.0", | ||||
|         "bn.js": "^4.11.8", | ||||
|         "ethereum-types": "^3.6.0" | ||||
|         "ethereum-types": "^3.7.1" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,158 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1662559804, | ||||
|         "version": "0.37.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1662147076, | ||||
|         "version": "0.37.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.37.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add support for OTC orders in the FillQuoteTransformer", | ||||
|                 "pr": "565" | ||||
|             }, | ||||
|             { | ||||
|                 "note": "fix CI", | ||||
|                 "pr": "569" | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1662046042 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661462289, | ||||
|         "version": "0.36.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661459661, | ||||
|         "version": "0.36.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1661145612, | ||||
|         "version": "0.36.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660093941, | ||||
|         "version": "0.36.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.36.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add Foundry support", | ||||
|                 "pr": 534 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1659976271 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1659750766, | ||||
|         "version": "0.36.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.36.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add Synthetix support in Ethereum and Optimism bridge adapters", | ||||
|                 "pr": 518 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1658950329 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.35.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Adds support for Velodrome OptimismBridgeAdapter", | ||||
|                 "pr": 494 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1655244958 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.34.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Splits BridgeAdapter up by chain", | ||||
|                 "pr": 487 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add stETH wrap/unwrap support", | ||||
|                 "pr": 476 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Adds support for BancorV3 to EthereumBridgeAdapter", | ||||
|                 "pr": 492 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1654284040 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.33.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add support for GMX and Platypus to bridge adapter", | ||||
|                 "pr": 478 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1652919697 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.32.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add support for `BalancerV2Batch` fills in FQT", | ||||
|                 "pr": 462 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1650611093 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1648739346, | ||||
|         "version": "0.31.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1646225739, | ||||
|         "version": "0.31.1", | ||||
|   | ||||
| @@ -5,6 +5,69 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v0.37.2 - _September 7, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.37.1 - _September 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.37.0 - _September 1, 2022_ | ||||
|  | ||||
|     * Add support for OTC orders in the FillQuoteTransformer (#565) | ||||
|     * fix CI (#569) | ||||
|  | ||||
| ## v0.36.6 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.36.5 - _August 25, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.36.4 - _August 22, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.36.3 - _August 10, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.36.2 - _August 8, 2022_ | ||||
|  | ||||
|     * Add Foundry support (#534) | ||||
|  | ||||
| ## v0.36.1 - _August 6, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.36.0 - _July 27, 2022_ | ||||
|  | ||||
|     * Add Synthetix support in Ethereum and Optimism bridge adapters (#518) | ||||
|  | ||||
| ## v0.35.0 - _June 14, 2022_ | ||||
|  | ||||
|     * Adds support for Velodrome OptimismBridgeAdapter (#494) | ||||
|  | ||||
| ## v0.34.0 - _June 3, 2022_ | ||||
|  | ||||
|     * Splits BridgeAdapter up by chain (#487) | ||||
|     * Add stETH wrap/unwrap support (#476) | ||||
|     * Adds support for BancorV3 to EthereumBridgeAdapter (#492) | ||||
|  | ||||
| ## v0.33.0 - _May 19, 2022_ | ||||
|  | ||||
|     * Add support for GMX and Platypus to bridge adapter (#478) | ||||
|  | ||||
| ## v0.32.0 - _April 22, 2022_ | ||||
|  | ||||
|     * Add support for `BalancerV2Batch` fills in FQT (#462) | ||||
|  | ||||
| ## v0.31.2 - _March 31, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.31.1 - _March 2, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -2,6 +2,10 @@ | ||||
|  | ||||
| This package contains contracts for the ZeroEx extensible contract architecture. | ||||
|  | ||||
| > **_NOTE:_**  This repo is undergoing a tooling change. If adding a contract, you will need to | ||||
| > add it to `compiler.json`. You can generate the entire list by running the following: | ||||
| > `find . -type f -name "*.sol" | grep -v foundry | grep -v "contracts/dep" | grep -v "node_modules"` | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| **Install** | ||||
|   | ||||
| @@ -1,6 +1,212 @@ | ||||
| { | ||||
|     "artifactsDir": "./test/generated-artifacts", | ||||
|     "contractsDir": "./contracts", | ||||
|     "contracts": [ | ||||
|         "./contracts/src/IZeroEx.sol", | ||||
|         "./contracts/src/ZeroEx.sol", | ||||
|         "./contracts/src/ZeroExOptimized.sol", | ||||
|         "./contracts/src/errors/LibCommonRichErrors.sol", | ||||
|         "./contracts/src/errors/LibLiquidityProviderRichErrors.sol", | ||||
|         "./contracts/src/errors/LibMetaTransactionsRichErrors.sol", | ||||
|         "./contracts/src/errors/LibNFTOrdersRichErrors.sol", | ||||
|         "./contracts/src/errors/LibNativeOrdersRichErrors.sol", | ||||
|         "./contracts/src/errors/LibOwnableRichErrors.sol", | ||||
|         "./contracts/src/errors/LibProxyRichErrors.sol", | ||||
|         "./contracts/src/errors/LibSignatureRichErrors.sol", | ||||
|         "./contracts/src/errors/LibSimpleFunctionRegistryRichErrors.sol", | ||||
|         "./contracts/src/errors/LibTransformERC20RichErrors.sol", | ||||
|         "./contracts/src/errors/LibWalletRichErrors.sol", | ||||
|         "./contracts/src/external/FeeCollector.sol", | ||||
|         "./contracts/src/external/FeeCollectorController.sol", | ||||
|         "./contracts/src/external/FlashWallet.sol", | ||||
|         "./contracts/src/external/IFlashWallet.sol", | ||||
|         "./contracts/src/external/ILiquidityProviderSandbox.sol", | ||||
|         "./contracts/src/external/LibFeeCollector.sol", | ||||
|         "./contracts/src/external/LiquidityProviderSandbox.sol", | ||||
|         "./contracts/src/external/PermissionlessTransformerDeployer.sol", | ||||
|         "./contracts/src/external/TransformerDeployer.sol", | ||||
|         "./contracts/src/features/BatchFillNativeOrdersFeature.sol", | ||||
|         "./contracts/src/features/BootstrapFeature.sol", | ||||
|         "./contracts/src/features/ERC165Feature.sol", | ||||
|         "./contracts/src/features/FundRecoveryFeature.sol", | ||||
|         "./contracts/src/features/LiquidityProviderFeature.sol", | ||||
|         "./contracts/src/features/MetaTransactionsFeature.sol", | ||||
|         "./contracts/src/features/NativeOrdersFeature.sol", | ||||
|         "./contracts/src/features/OtcOrdersFeature.sol", | ||||
|         "./contracts/src/features/OwnableFeature.sol", | ||||
|         "./contracts/src/features/PancakeSwapFeature.sol", | ||||
|         "./contracts/src/features/SimpleFunctionRegistryFeature.sol", | ||||
|         "./contracts/src/features/TransformERC20Feature.sol", | ||||
|         "./contracts/src/features/UniswapFeature.sol", | ||||
|         "./contracts/src/features/UniswapV3Feature.sol", | ||||
|         "./contracts/src/features/interfaces/IBatchFillNativeOrdersFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IBootstrapFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IERC1155OrdersFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IERC165Feature.sol", | ||||
|         "./contracts/src/features/interfaces/IERC721OrdersFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IFundRecoveryFeature.sol", | ||||
|         "./contracts/src/features/interfaces/ILiquidityProviderFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IMetaTransactionsFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IMultiplexFeature.sol", | ||||
|         "./contracts/src/features/interfaces/INativeOrdersEvents.sol", | ||||
|         "./contracts/src/features/interfaces/INativeOrdersFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IOtcOrdersFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IOwnableFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IPancakeSwapFeature.sol", | ||||
|         "./contracts/src/features/interfaces/ISimpleFunctionRegistryFeature.sol", | ||||
|         "./contracts/src/features/interfaces/ITokenSpenderFeature.sol", | ||||
|         "./contracts/src/features/interfaces/ITransformERC20Feature.sol", | ||||
|         "./contracts/src/features/interfaces/IUniswapFeature.sol", | ||||
|         "./contracts/src/features/interfaces/IUniswapV3Feature.sol", | ||||
|         "./contracts/src/features/libs/LibNFTOrder.sol", | ||||
|         "./contracts/src/features/libs/LibNativeOrder.sol", | ||||
|         "./contracts/src/features/libs/LibSignature.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexFeature.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexLiquidityProvider.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexOtc.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexRfq.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexTransformERC20.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexUniswapV2.sol", | ||||
|         "./contracts/src/features/multiplex/MultiplexUniswapV3.sol", | ||||
|         "./contracts/src/features/native_orders/NativeOrdersCancellation.sol", | ||||
|         "./contracts/src/features/native_orders/NativeOrdersInfo.sol", | ||||
|         "./contracts/src/features/native_orders/NativeOrdersProtocolFees.sol", | ||||
|         "./contracts/src/features/native_orders/NativeOrdersSettlement.sol", | ||||
|         "./contracts/src/features/nft_orders/ERC1155OrdersFeature.sol", | ||||
|         "./contracts/src/features/nft_orders/ERC721OrdersFeature.sol", | ||||
|         "./contracts/src/features/nft_orders/NFTOrders.sol", | ||||
|         "./contracts/src/fixins/FixinCommon.sol", | ||||
|         "./contracts/src/fixins/FixinEIP712.sol", | ||||
|         "./contracts/src/fixins/FixinERC1155Spender.sol", | ||||
|         "./contracts/src/fixins/FixinERC721Spender.sol", | ||||
|         "./contracts/src/fixins/FixinProtocolFees.sol", | ||||
|         "./contracts/src/fixins/FixinReentrancyGuard.sol", | ||||
|         "./contracts/src/fixins/FixinTokenSpender.sol", | ||||
|         "./contracts/src/liquidity-providers/CurveLiquidityProvider.sol", | ||||
|         "./contracts/src/liquidity-providers/MooniswapLiquidityProvider.sol", | ||||
|         "./contracts/src/migrations/FullMigration.sol", | ||||
|         "./contracts/src/migrations/InitialMigration.sol", | ||||
|         "./contracts/src/migrations/LibBootstrap.sol", | ||||
|         "./contracts/src/migrations/LibMigrate.sol", | ||||
|         "./contracts/src/storage/LibERC1155OrdersStorage.sol", | ||||
|         "./contracts/src/storage/LibERC721OrdersStorage.sol", | ||||
|         "./contracts/src/storage/LibMetaTransactionsStorage.sol", | ||||
|         "./contracts/src/storage/LibNativeOrdersStorage.sol", | ||||
|         "./contracts/src/storage/LibOtcOrdersStorage.sol", | ||||
|         "./contracts/src/storage/LibOwnableStorage.sol", | ||||
|         "./contracts/src/storage/LibProxyStorage.sol", | ||||
|         "./contracts/src/storage/LibReentrancyGuardStorage.sol", | ||||
|         "./contracts/src/storage/LibSimpleFunctionRegistryStorage.sol", | ||||
|         "./contracts/src/storage/LibStorage.sol", | ||||
|         "./contracts/src/storage/LibTransformERC20Storage.sol", | ||||
|         "./contracts/src/transformers/AffiliateFeeTransformer.sol", | ||||
|         "./contracts/src/transformers/FillQuoteTransformer.sol", | ||||
|         "./contracts/src/transformers/IERC20Transformer.sol", | ||||
|         "./contracts/src/transformers/LibERC20Transformer.sol", | ||||
|         "./contracts/src/transformers/LogMetadataTransformer.sol", | ||||
|         "./contracts/src/transformers/PayTakerTransformer.sol", | ||||
|         "./contracts/src/transformers/PositiveSlippageFeeTransformer.sol", | ||||
|         "./contracts/src/transformers/Transformer.sol", | ||||
|         "./contracts/src/transformers/WethTransformer.sol", | ||||
|         "./contracts/src/transformers/bridges/AbstractBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/AvalancheBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/BSCBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/BridgeProtocols.sol", | ||||
|         "./contracts/src/transformers/bridges/CeloBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/EthereumBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/FantomBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/IBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/OptimismBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/PolygonBridgeAdapter.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinAaveV2.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinBalancer.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinBalancerV2.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinBalancerV2Batch.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinBancor.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinBancorV3.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinCompound.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinCryptoCom.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinCurve.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinCurveV2.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinDodo.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinDodoV2.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinGMX.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinKyberDmm.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinLido.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinMStable.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinMakerPSM.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinMooniswap.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinNerve.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinPlatypus.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinShell.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinSynthetix.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinUniswap.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinUniswapV2.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinUniswapV3.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinVelodrome.sol", | ||||
|         "./contracts/src/transformers/bridges/mixins/MixinZeroExBridge.sol", | ||||
|         "./contracts/src/vendor/IERC1155Token.sol", | ||||
|         "./contracts/src/vendor/IERC721Token.sol", | ||||
|         "./contracts/src/vendor/IFeeRecipient.sol", | ||||
|         "./contracts/src/vendor/ILiquidityProvider.sol", | ||||
|         "./contracts/src/vendor/IMooniswapPool.sol", | ||||
|         "./contracts/src/vendor/IPropertyValidator.sol", | ||||
|         "./contracts/src/vendor/ITakerCallback.sol", | ||||
|         "./contracts/src/vendor/IUniswapV2Pair.sol", | ||||
|         "./contracts/src/vendor/IUniswapV3Pool.sol", | ||||
|         "./contracts/src/vendor/v3/IERC20Bridge.sol", | ||||
|         "./contracts/src/vendor/v3/IStaking.sol", | ||||
|         "./contracts/test/ITestSimpleFunctionRegistryFeature.sol", | ||||
|         "./contracts/test/TestBridge.sol", | ||||
|         "./contracts/test/TestCallTarget.sol", | ||||
|         "./contracts/test/TestDelegateCaller.sol", | ||||
|         "./contracts/test/TestFeeCollectorController.sol", | ||||
|         "./contracts/test/TestFeeRecipient.sol", | ||||
|         "./contracts/test/TestFillQuoteTransformerBridge.sol", | ||||
|         "./contracts/test/TestFillQuoteTransformerExchange.sol", | ||||
|         "./contracts/test/TestFillQuoteTransformerHost.sol", | ||||
|         "./contracts/test/TestFixinProtocolFees.sol", | ||||
|         "./contracts/test/TestFixinTokenSpender.sol", | ||||
|         "./contracts/test/TestFullMigration.sol", | ||||
|         "./contracts/test/TestInitialMigration.sol", | ||||
|         "./contracts/test/TestLibNativeOrder.sol", | ||||
|         "./contracts/test/TestLibSignature.sol", | ||||
|         "./contracts/test/TestMetaTransactionsNativeOrdersFeature.sol", | ||||
|         "./contracts/test/TestMetaTransactionsTransformERC20Feature.sol", | ||||
|         "./contracts/test/TestMigrator.sol", | ||||
|         "./contracts/test/TestMintTokenERC20Transformer.sol", | ||||
|         "./contracts/test/TestNFTOrderPresigner.sol", | ||||
|         "./contracts/test/TestNativeOrdersFeature.sol", | ||||
|         "./contracts/test/TestNoEthRecipient.sol", | ||||
|         "./contracts/test/TestOrderSignerRegistryWithContractWallet.sol", | ||||
|         "./contracts/test/TestPermissionlessTransformerDeployerSuicidal.sol", | ||||
|         "./contracts/test/TestPermissionlessTransformerDeployerTransformer.sol", | ||||
|         "./contracts/test/TestPropertyValidator.sol", | ||||
|         "./contracts/test/TestRfqOriginRegistration.sol", | ||||
|         "./contracts/test/TestSimpleFunctionRegistryFeatureImpl1.sol", | ||||
|         "./contracts/test/TestSimpleFunctionRegistryFeatureImpl2.sol", | ||||
|         "./contracts/test/TestStaking.sol", | ||||
|         "./contracts/test/TestTransformERC20.sol", | ||||
|         "./contracts/test/TestTransformerBase.sol", | ||||
|         "./contracts/test/TestTransformerDeployerTransformer.sol", | ||||
|         "./contracts/test/TestTransformerHost.sol", | ||||
|         "./contracts/test/TestUniswapV3Feature.sol", | ||||
|         "./contracts/test/TestWethTransformerHost.sol", | ||||
|         "./contracts/test/TestZeroExFeature.sol", | ||||
|         "./contracts/test/integration/TestCurve.sol", | ||||
|         "./contracts/test/integration/TestLiquidityProvider.sol", | ||||
|         "./contracts/test/integration/TestMooniswap.sol", | ||||
|         "./contracts/test/integration/TestUniswapV2Factory.sol", | ||||
|         "./contracts/test/integration/TestUniswapV2Pool.sol", | ||||
|         "./contracts/test/integration/TestUniswapV3Factory.sol", | ||||
|         "./contracts/test/integration/TestUniswapV3Pool.sol", | ||||
|         "./contracts/test/tokens/TestMintableERC1155Token.sol", | ||||
|         "./contracts/test/tokens/TestMintableERC20Token.sol", | ||||
|         "./contracts/test/tokens/TestMintableERC721Token.sol", | ||||
|         "./contracts/test/tokens/TestTokenSpenderERC20Token.sol", | ||||
|         "./contracts/test/tokens/TestWeth.sol" | ||||
|     ], | ||||
|     "useDockerisedSolc": false, | ||||
|     "isOfflineMode": false, | ||||
|     "shouldSaveStandardInput": true, | ||||
|   | ||||
							
								
								
									
										1
									
								
								contracts/zero-ex/contracts/deps/forge-std
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								contracts/zero-ex/contracts/deps/forge-std
									
									
									
									
									
										Submodule
									
								
							 Submodule contracts/zero-ex/contracts/deps/forge-std added at 1680d7fb3e
									
								
							| @@ -31,6 +31,7 @@ import "../features/libs/LibNativeOrder.sol"; | ||||
| import "./bridges/IBridgeAdapter.sol"; | ||||
| import "./Transformer.sol"; | ||||
| import "./LibERC20Transformer.sol"; | ||||
| import "../IZeroEx.sol"; | ||||
|  | ||||
| /// @dev A transformer that fills an ERC20 market sell/buy quote. | ||||
| ///      This transformer shortcuts bridge orders and fills them directly | ||||
| @@ -52,7 +53,8 @@ contract FillQuoteTransformer is | ||||
|     enum OrderType { | ||||
|         Bridge, | ||||
|         Limit, | ||||
|         Rfq | ||||
|         Rfq, | ||||
|         Otc | ||||
|     } | ||||
|  | ||||
|     struct LimitOrderInfo { | ||||
| @@ -69,6 +71,13 @@ contract FillQuoteTransformer is | ||||
|         uint256 maxTakerTokenFillAmount; | ||||
|     } | ||||
|  | ||||
|     struct OtcOrderInfo { | ||||
|         LibNativeOrder.OtcOrder order; | ||||
|         LibSignature.Signature signature; | ||||
|         // Maximum taker token amount of this limit order to fill. | ||||
|         uint256 maxTakerTokenFillAmount; | ||||
|     } | ||||
|  | ||||
|     /// @dev Transform data to ABI-encode and pass into `transform()`. | ||||
|     struct TransformData { | ||||
|         // Whether we are performing a market sell or buy. | ||||
| @@ -84,6 +93,8 @@ contract FillQuoteTransformer is | ||||
|         IBridgeAdapter.BridgeOrder[] bridgeOrders; | ||||
|         // Native limit orders. Sorted by fill sequence. | ||||
|         LimitOrderInfo[] limitOrders; | ||||
|         // Otc orders. Sorted by fill sequence. | ||||
|         OtcOrderInfo[] otcOrders; | ||||
|         // Native RFQ orders. Sorted by fill sequence. | ||||
|         RfqOrderInfo[] rfqOrders; | ||||
|  | ||||
| @@ -123,7 +134,7 @@ contract FillQuoteTransformer is | ||||
|         uint256 soldAmount; | ||||
|         uint256 protocolFee; | ||||
|         uint256 takerTokenBalanceRemaining; | ||||
|         uint256[3] currentIndices; | ||||
|         uint256[4] currentIndices; | ||||
|         OrderType currentOrderType; | ||||
|     } | ||||
|  | ||||
| @@ -147,12 +158,12 @@ contract FillQuoteTransformer is | ||||
|     IBridgeAdapter public immutable bridgeAdapter; | ||||
|  | ||||
|     /// @dev The exchange proxy contract. | ||||
|     INativeOrdersFeature public immutable zeroEx; | ||||
|     IZeroEx public immutable zeroEx; | ||||
|  | ||||
|     /// @dev Create this contract. | ||||
|     /// @param bridgeAdapter_ The bridge adapter contract. | ||||
|     /// @param zeroEx_ The Exchange Proxy contract. | ||||
|     constructor(IBridgeAdapter bridgeAdapter_, INativeOrdersFeature zeroEx_) | ||||
|     constructor(IBridgeAdapter bridgeAdapter_, IZeroEx zeroEx_) | ||||
|         public | ||||
|         Transformer() | ||||
|     { | ||||
| @@ -183,7 +194,8 @@ contract FillQuoteTransformer is | ||||
|  | ||||
|         if (data.bridgeOrders.length | ||||
|                 + data.limitOrders.length | ||||
|                 + data.rfqOrders.length != data.fillSequence.length | ||||
|                 + data.rfqOrders.length | ||||
|                 + data.otcOrders.length != data.fillSequence.length | ||||
|         ) { | ||||
|             LibTransformERC20RichErrors.InvalidTransformDataError( | ||||
|                 LibTransformERC20RichErrors.InvalidTransformDataErrorCode.INVALID_ARRAY_LENGTH, | ||||
| @@ -198,7 +210,7 @@ contract FillQuoteTransformer is | ||||
|  | ||||
|         // Approve the exchange proxy to spend our sell tokens if native orders | ||||
|         // are present. | ||||
|         if (data.limitOrders.length + data.rfqOrders.length != 0) { | ||||
|         if (data.limitOrders.length + data.rfqOrders.length + data.otcOrders.length != 0) { | ||||
|             data.sellToken.approveIfBelow(address(zeroEx), data.fillAmount); | ||||
|             // Compute the protocol fee if a limit order is present. | ||||
|             if (data.limitOrders.length != 0) { | ||||
| @@ -230,6 +242,8 @@ contract FillQuoteTransformer is | ||||
|                 results = _fillLimitOrder(data.limitOrders[orderIndex], data, state); | ||||
|             } else if (state.currentOrderType == OrderType.Rfq) { | ||||
|                 results = _fillRfqOrder(data.rfqOrders[orderIndex], data, state); | ||||
|             } else if (state.currentOrderType == OrderType.Otc) { | ||||
|                 results = _fillOtcOrder(data.otcOrders[orderIndex], data, state); | ||||
|             } else { | ||||
|                 revert("INVALID_ORDER_TYPE"); | ||||
|             } | ||||
| @@ -313,7 +327,7 @@ contract FillQuoteTransformer is | ||||
|         if (success) { | ||||
|             results.makerTokenBoughtAmount = abi.decode(resultData, (uint256)); | ||||
|             results.takerTokenSoldAmount = takerTokenFillAmount; | ||||
|         } | ||||
|         }  | ||||
|     } | ||||
|  | ||||
|     // Fill a single limit order. | ||||
| @@ -402,6 +416,42 @@ contract FillQuoteTransformer is | ||||
|         } catch {} | ||||
|     } | ||||
|  | ||||
|     // Fill a single OTC order. | ||||
|     function _fillOtcOrder( | ||||
|         OtcOrderInfo memory orderInfo, | ||||
|         TransformData memory data, | ||||
|         FillState memory state | ||||
|     ) | ||||
|         private | ||||
|         returns (FillOrderResults memory results) | ||||
|     { | ||||
|  | ||||
|         uint256 takerTokenFillAmount = LibSafeMathV06.min256( | ||||
|             _computeTakerTokenFillAmount( | ||||
|                 data, | ||||
|                 state, | ||||
|                 orderInfo.order.takerAmount, | ||||
|                 orderInfo.order.makerAmount, | ||||
|                 0 | ||||
|             ), | ||||
|             orderInfo.maxTakerTokenFillAmount | ||||
|         ); | ||||
|         try | ||||
|             zeroEx.fillOtcOrder | ||||
|                 ( | ||||
|                     orderInfo.order, | ||||
|                     orderInfo.signature, | ||||
|                     takerTokenFillAmount.safeDowncastToUint128() | ||||
|                 ) | ||||
|             returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount) | ||||
|         { | ||||
|             results.takerTokenSoldAmount = takerTokenFilledAmount; | ||||
|             results.makerTokenBoughtAmount = makerTokenFilledAmount; | ||||
|         } catch { | ||||
|             revert("FillQuoteTransformer/OTC_ORDER_FILL_FAILED"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Compute the next taker token fill amount of a generic order. | ||||
|     function _computeTakerTokenFillAmount( | ||||
|         TransformData memory data, | ||||
|   | ||||
| @@ -0,0 +1,88 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 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; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./IBridgeAdapter.sol"; | ||||
|  | ||||
| abstract contract AbstractBridgeAdapter is IBridgeAdapter { | ||||
|  | ||||
|     constructor( | ||||
|         uint256 expectedChainId,  | ||||
|         string memory expectedChainName | ||||
|     ) | ||||
|         public | ||||
|     { | ||||
|         uint256 chainId; | ||||
|         assembly { chainId := chainid() } | ||||
|         // Allow testing on Ganache | ||||
|         if (chainId != expectedChainId && chainId != 1337) { | ||||
|             revert(string(abi.encodePacked(expectedChainName, "BridgeAdapter.constructor: wrong chain ID"))); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function isSupportedSource(bytes32 source) | ||||
|         external | ||||
|         override | ||||
|         returns (bool isSupported) | ||||
|     { | ||||
|         BridgeOrder memory placeholderOrder; | ||||
|         placeholderOrder.source = source; | ||||
|         IERC20TokenV06 placeholderToken = IERC20TokenV06(address(0)); | ||||
|          | ||||
|         (, isSupported) = _trade( | ||||
|             placeholderOrder, | ||||
|             placeholderToken, | ||||
|             placeholderToken, | ||||
|             0, | ||||
|             true | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         (boughtAmount, ) = _trade( | ||||
|             order, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             false | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         virtual | ||||
|         returns (uint256 boughtAmount, bool supportedSource); | ||||
| } | ||||
| @@ -0,0 +1,113 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinBalancerV2.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinDodoV2.sol"; | ||||
| import "./mixins/MixinGMX.sol"; | ||||
| import "./mixins/MixinUniswapV3.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract ArbitrumBridgeAdapter is | ||||
|     AbstractBridgeAdapter(42161, "Arbitrum"), | ||||
|     MixinBalancerV2, | ||||
|     MixinCurve, | ||||
|     MixinDodoV2, | ||||
|     MixinGMX, | ||||
|     MixinUniswapV3, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinCurve(weth) | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.BALANCERV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancerV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODOV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodoV2( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV3) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV3( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.GMX) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeGMX( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); }             | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,151 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinCurveV2.sol"; | ||||
| import "./mixins/MixinGMX.sol"; | ||||
| import "./mixins/MixinKyberDmm.sol"; | ||||
| import "./mixins/MixinAaveV2.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinPlatypus.sol"; | ||||
| import "./mixins/MixinUniswapV2.sol"; | ||||
| import "./mixins/MixinWOOFi.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract AvalancheBridgeAdapter is | ||||
|     AbstractBridgeAdapter(43114, "Avalanche"), | ||||
|     MixinCurve, | ||||
|     MixinCurveV2, | ||||
|     MixinGMX, | ||||
|     MixinKyberDmm, | ||||
|     MixinAaveV2, | ||||
|     MixinNerve, | ||||
|     MixinPlatypus, | ||||
|     MixinUniswapV2, | ||||
|     MixinWOOFi, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinCurve(weth) | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CURVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV2( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.KYBERDMM) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeKyberDmm( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.AAVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeAaveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.GMX) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeGMX( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.PLATYPUS) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradePlatypus( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.WOOFI) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeWOOFi( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); }             | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,142 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinDodo.sol"; | ||||
| import "./mixins/MixinDodoV2.sol"; | ||||
| import "./mixins/MixinKyberDmm.sol"; | ||||
| import "./mixins/MixinMooniswap.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinUniswapV2.sol"; | ||||
| import "./mixins/MixinWOOFi.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract BSCBridgeAdapter is | ||||
|     AbstractBridgeAdapter(56, "BSC"), | ||||
|     MixinCurve, | ||||
|     MixinDodo, | ||||
|     MixinDodoV2, | ||||
|     MixinKyberDmm, | ||||
|     MixinMooniswap, | ||||
|     MixinNerve, | ||||
|     MixinUniswapV2, | ||||
|     MixinWOOFi, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinCurve(weth) | ||||
|         MixinMooniswap(weth) | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV2( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.MOONISWAP) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeMooniswap( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODO) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodo( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODOV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodoV2( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.KYBERDMM) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeKyberDmm( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.WOOFI) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeWOOFi( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -27,29 +27,36 @@ library BridgeProtocols { | ||||
|     // A incrementally increasing, append-only list of protocol IDs. | ||||
|     // We don't use an enum so solidity doesn't throw when we pass in a | ||||
|     // new protocol ID that hasn't been rolled up yet. | ||||
|     uint128 internal constant UNKNOWN     = 0; | ||||
|     uint128 internal constant CURVE       = 1; | ||||
|     uint128 internal constant UNISWAPV2   = 2; | ||||
|     uint128 internal constant UNISWAP     = 3; | ||||
|     uint128 internal constant BALANCER    = 4; | ||||
|     uint128 internal constant KYBER       = 5; | ||||
|     uint128 internal constant MOONISWAP   = 6; | ||||
|     uint128 internal constant MSTABLE     = 7; | ||||
|     uint128 internal constant OASIS       = 8; | ||||
|     uint128 internal constant SHELL       = 9; | ||||
|     uint128 internal constant DODO        = 10; | ||||
|     uint128 internal constant DODOV2      = 11; | ||||
|     uint128 internal constant CRYPTOCOM   = 12; | ||||
|     uint128 internal constant BANCOR      = 13; | ||||
|     uint128 internal constant COFIX       = 14; | ||||
|     uint128 internal constant NERVE       = 15; | ||||
|     uint128 internal constant MAKERPSM    = 16; | ||||
|     uint128 internal constant BALANCERV2  = 17; | ||||
|     uint128 internal constant UNISWAPV3   = 18; | ||||
|     uint128 internal constant KYBERDMM    = 19; | ||||
|     uint128 internal constant CURVEV2     = 20; | ||||
|     uint128 internal constant LIDO        = 21; | ||||
|     uint128 internal constant CLIPPER     = 22; // Not used: Clipper is now using PLP interface | ||||
|     uint128 internal constant AAVEV2      = 23; | ||||
|     uint128 internal constant COMPOUND    = 24; | ||||
|     uint128 internal constant UNKNOWN         = 0; | ||||
|     uint128 internal constant CURVE           = 1; | ||||
|     uint128 internal constant UNISWAPV2       = 2; | ||||
|     uint128 internal constant UNISWAP         = 3; | ||||
|     uint128 internal constant BALANCER        = 4; | ||||
|     uint128 internal constant KYBER           = 5;  // Not used: deprecated. | ||||
|     uint128 internal constant MOONISWAP       = 6; | ||||
|     uint128 internal constant MSTABLE         = 7; | ||||
|     uint128 internal constant OASIS           = 8;  // Not used: deprecated. | ||||
|     uint128 internal constant SHELL           = 9; | ||||
|     uint128 internal constant DODO            = 10; | ||||
|     uint128 internal constant DODOV2          = 11; | ||||
|     uint128 internal constant CRYPTOCOM       = 12; | ||||
|     uint128 internal constant BANCOR          = 13; | ||||
|     uint128 internal constant COFIX           = 14; // Not used: deprecated. | ||||
|     uint128 internal constant NERVE           = 15; | ||||
|     uint128 internal constant MAKERPSM        = 16; | ||||
|     uint128 internal constant BALANCERV2      = 17; | ||||
|     uint128 internal constant UNISWAPV3       = 18; | ||||
|     uint128 internal constant KYBERDMM        = 19; | ||||
|     uint128 internal constant CURVEV2         = 20; | ||||
|     uint128 internal constant LIDO            = 21; | ||||
|     uint128 internal constant CLIPPER         = 22; // Not used: Clipper is now using PLP interface | ||||
|     uint128 internal constant AAVEV2          = 23; | ||||
|     uint128 internal constant COMPOUND        = 24; | ||||
|     uint128 internal constant BALANCERV2BATCH = 25; | ||||
|     uint128 internal constant GMX             = 26; | ||||
|     uint128 internal constant PLATYPUS        = 27; | ||||
|     uint128 internal constant BANCORV3        = 28; | ||||
|     uint128 internal constant VELODROME       = 29; | ||||
|     uint128 internal constant SYNTHETIX       = 30; | ||||
|     uint128 internal constant WOOFI           = 31; | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,84 @@ | ||||
|  | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinUniswapV2.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract CeloBridgeAdapter is | ||||
|     AbstractBridgeAdapter(42220, "Celo"), | ||||
|     MixinNerve, | ||||
|     MixinUniswapV2, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(address _weth) | ||||
|         public | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.UNISWAPV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV2( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); }             | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
| 
 | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
| 
 | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
| @@ -20,55 +20,53 @@ | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
| 
 | ||||
| import "./IBridgeAdapter.sol"; | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinAaveV2.sol"; | ||||
| import "./mixins/MixinBalancer.sol"; | ||||
| import "./mixins/MixinBalancerV2.sol"; | ||||
| import "./mixins/MixinBalancerV2Batch.sol"; | ||||
| import "./mixins/MixinBancor.sol"; | ||||
| import "./mixins/MixinCoFiX.sol"; | ||||
| import "./mixins/MixinBancorV3.sol"; | ||||
| import "./mixins/MixinCompound.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinCurveV2.sol"; | ||||
| import "./mixins/MixinCryptoCom.sol"; | ||||
| import "./mixins/MixinDodo.sol"; | ||||
| import "./mixins/MixinDodoV2.sol"; | ||||
| import "./mixins/MixinKyber.sol"; | ||||
| import "./mixins/MixinKyberDmm.sol"; | ||||
| import "./mixins/MixinLido.sol"; | ||||
| import "./mixins/MixinMakerPSM.sol"; | ||||
| import "./mixins/MixinMooniswap.sol"; | ||||
| import "./mixins/MixinMStable.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinOasis.sol"; | ||||
| import "./mixins/MixinShell.sol"; | ||||
| import "./mixins/MixinSynthetix.sol"; | ||||
| import "./mixins/MixinUniswap.sol"; | ||||
| import "./mixins/MixinUniswapV2.sol"; | ||||
| import "./mixins/MixinUniswapV3.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
| 
 | ||||
| contract BridgeAdapter is | ||||
|     IBridgeAdapter, | ||||
| contract EthereumBridgeAdapter is | ||||
|     AbstractBridgeAdapter(1, "Ethereum"), | ||||
|     MixinAaveV2, | ||||
|     MixinBalancer, | ||||
|     MixinBalancerV2, | ||||
|     MixinBalancerV2Batch, | ||||
|     MixinBancor, | ||||
|     MixinCoFiX, | ||||
|     MixinBancorV3, | ||||
|     MixinCompound, | ||||
|     MixinCurve, | ||||
|     MixinCurveV2, | ||||
|     MixinCryptoCom, | ||||
|     MixinDodo, | ||||
|     MixinDodoV2, | ||||
|     MixinKyber, | ||||
|     MixinKyberDmm, | ||||
|     MixinLido, | ||||
|     MixinMakerPSM, | ||||
|     MixinMooniswap, | ||||
|     MixinMStable, | ||||
|     MixinNerve, | ||||
|     MixinOasis, | ||||
|     MixinShell, | ||||
|     MixinSynthetix, | ||||
|     MixinUniswap, | ||||
|     MixinUniswapV2, | ||||
|     MixinUniswapV3, | ||||
| @@ -76,43 +74,28 @@ contract BridgeAdapter is | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinAaveV2() | ||||
|         MixinBalancer() | ||||
|         MixinBalancerV2() | ||||
|         MixinBancor(weth) | ||||
|         MixinCoFiX() | ||||
|         MixinBancorV3(weth) | ||||
|         MixinCompound(weth) | ||||
|         MixinCurve(weth) | ||||
|         MixinCurveV2() | ||||
|         MixinCryptoCom() | ||||
|         MixinDodo() | ||||
|         MixinDodoV2() | ||||
|         MixinKyber(weth) | ||||
|         MixinLido(weth) | ||||
|         MixinMakerPSM() | ||||
|         MixinMooniswap(weth) | ||||
|         MixinMStable() | ||||
|         MixinNerve() | ||||
|         MixinOasis() | ||||
|         MixinShell() | ||||
|         MixinUniswap(weth) | ||||
|         MixinUniswapV2() | ||||
|         MixinUniswapV3() | ||||
|         MixinZeroExBridge() | ||||
|     {} | ||||
| 
 | ||||
|     function trade( | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         public | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount) | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -120,6 +103,7 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CURVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -127,18 +111,21 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV3) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV3( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV2( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAP) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswap( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -146,6 +133,7 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.BALANCER) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancer( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -153,48 +141,37 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.BALANCERV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancerV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.KYBER) { | ||||
|             boughtAmount = _tradeKyber( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|         } else if (protocolId == BridgeProtocols.BALANCERV2BATCH) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancerV2Batch( | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.MAKERPSM) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeMakerPsm( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.MOONISWAP) { | ||||
|             boughtAmount = _tradeMooniswap( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.MSTABLE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeMStable( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.OASIS) { | ||||
|             boughtAmount = _tradeOasis( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.SHELL) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeShell( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -202,49 +179,49 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODO) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodo( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODOV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodoV2( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CRYPTOCOM) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCryptoCom( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.BANCOR) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBancor( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.COFIX) { | ||||
|             boughtAmount = _tradeCoFiX( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.KYBERDMM) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeKyberDmm( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.LIDO) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeLido( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -252,6 +229,7 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.AAVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeAaveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -259,13 +237,28 @@ contract BridgeAdapter is | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.COMPOUND) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCompound( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else { | ||||
|         } else if (protocolId == BridgeProtocols.BANCORV3) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBancorV3( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.SYNTHETIX) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeSynthetix( | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
| @@ -0,0 +1,134 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinAaveV2.sol"; | ||||
| import "./mixins/MixinBalancerV2.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinCurveV2.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinUniswapV2.sol"; | ||||
| import "./mixins/MixinWOOFi.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract FantomBridgeAdapter is | ||||
|     AbstractBridgeAdapter(250, "Fantom"), | ||||
|     MixinAaveV2, | ||||
|     MixinBalancerV2, | ||||
|     MixinCurve, | ||||
|     MixinCurveV2, | ||||
|     MixinNerve, | ||||
|     MixinUniswapV2, | ||||
|     MixinWOOFi, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinCurve(weth) | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CURVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV2( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.BALANCERV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancerV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.AAVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeAaveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.WOOFI) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeWOOFi( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); }             | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -50,6 +50,10 @@ interface IBridgeAdapter { | ||||
|         uint256 outputTokenAmount | ||||
|     ); | ||||
|  | ||||
|     function isSupportedSource(bytes32 source) | ||||
|         external | ||||
|         returns (bool isSupported); | ||||
|  | ||||
|     function trade( | ||||
|         BridgeOrder calldata order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|   | ||||
| @@ -0,0 +1,122 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinCurveV2.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinSynthetix.sol"; | ||||
| import "./mixins/MixinUniswapV3.sol"; | ||||
| import "./mixins/MixinVelodrome.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract OptimismBridgeAdapter is | ||||
|     AbstractBridgeAdapter(10, "Optimism"), | ||||
|     MixinCurve, | ||||
|     MixinCurveV2, | ||||
|     MixinNerve, | ||||
|     MixinSynthetix, | ||||
|     MixinUniswapV3, | ||||
|     MixinVelodrome, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinCurve(weth) | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CURVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV3) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV3( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.VELODROME) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeVelodrome( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.SYNTHETIX) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeSynthetix( | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); }             | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,188 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./AbstractBridgeAdapter.sol"; | ||||
| import "./BridgeProtocols.sol"; | ||||
| import "./mixins/MixinAaveV2.sol"; | ||||
| import "./mixins/MixinBalancerV2.sol"; | ||||
| import "./mixins/MixinBalancerV2Batch.sol"; | ||||
| import "./mixins/MixinCurve.sol"; | ||||
| import "./mixins/MixinCurveV2.sol"; | ||||
| import "./mixins/MixinDodo.sol"; | ||||
| import "./mixins/MixinDodoV2.sol"; | ||||
| import "./mixins/MixinKyberDmm.sol"; | ||||
| import "./mixins/MixinMStable.sol"; | ||||
| import "./mixins/MixinNerve.sol"; | ||||
| import "./mixins/MixinUniswapV2.sol"; | ||||
| import "./mixins/MixinUniswapV3.sol"; | ||||
| import "./mixins/MixinWOOFi.sol"; | ||||
| import "./mixins/MixinZeroExBridge.sol"; | ||||
|  | ||||
| contract PolygonBridgeAdapter is | ||||
|     AbstractBridgeAdapter(137, "Polygon"), | ||||
|     MixinAaveV2, | ||||
|     MixinBalancerV2, | ||||
|     MixinBalancerV2Batch, | ||||
|     MixinCurve, | ||||
|     MixinCurveV2, | ||||
|     MixinDodo, | ||||
|     MixinDodoV2, | ||||
|     MixinKyberDmm, | ||||
|     MixinMStable, | ||||
|     MixinNerve, | ||||
|     MixinUniswapV2, | ||||
|     MixinUniswapV3, | ||||
|     MixinWOOFi, | ||||
|     MixinZeroExBridge | ||||
| { | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|         MixinCurve(weth) | ||||
|     {} | ||||
|  | ||||
|     function _trade( | ||||
|         BridgeOrder memory order, | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bool dryRun | ||||
|     ) | ||||
|         internal | ||||
|         override | ||||
|         returns (uint256 boughtAmount, bool supportedSource) | ||||
|     { | ||||
|         uint128 protocolId = uint128(uint256(order.source) >> 128); | ||||
|         if (protocolId == BridgeProtocols.CURVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurve( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.CURVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeCurveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV3) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV3( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNISWAPV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeUniswapV2( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.BALANCERV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancerV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.BALANCERV2BATCH) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeBalancerV2Batch( | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.MSTABLE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeMStable( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODO) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodo( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.DODOV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeDodoV2( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.NERVE) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeNerve( | ||||
|                 sellToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.KYBERDMM) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeKyberDmm( | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.AAVEV2) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeAaveV2( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.WOOFI) { | ||||
|             if (dryRun) { return (0, true); } | ||||
|             boughtAmount = _tradeWOOFi( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } else if (protocolId == BridgeProtocols.UNKNOWN) { | ||||
|             if (dryRun) { return (0, true); }             | ||||
|             boughtAmount = _tradeZeroExBridge( | ||||
|                 sellToken, | ||||
|                 buyToken, | ||||
|                 sellAmount, | ||||
|                 order.bridgeData | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit BridgeFill( | ||||
|             order.source, | ||||
|             sellToken, | ||||
|             buyToken, | ||||
|             sellAmount, | ||||
|             boughtAmount | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,107 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
|  | ||||
|  | ||||
| interface IBalancerV2BatchSwapVault { | ||||
|  | ||||
|     enum SwapKind { GIVEN_IN, GIVEN_OUT } | ||||
|  | ||||
|     struct BatchSwapStep { | ||||
|         bytes32 poolId; | ||||
|         uint256 assetInIndex; | ||||
|         uint256 assetOutIndex; | ||||
|         uint256 amount; | ||||
|         bytes userData; | ||||
|     } | ||||
|  | ||||
|     struct FundManagement { | ||||
|         address sender; | ||||
|         bool fromInternalBalance; | ||||
|         address payable recipient; | ||||
|         bool toInternalBalance; | ||||
|     } | ||||
|  | ||||
|     function batchSwap( | ||||
|         SwapKind kind, | ||||
|         BatchSwapStep[] calldata swaps, | ||||
|         IERC20TokenV06[] calldata assets, | ||||
|         FundManagement calldata funds, | ||||
|         int256[] calldata limits, | ||||
|         uint256 deadline | ||||
|     ) external returns (int256[] memory amounts); | ||||
| } | ||||
|  | ||||
| contract MixinBalancerV2Batch { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     struct BalancerV2BatchBridgeData { | ||||
|         IBalancerV2BatchSwapVault vault; | ||||
|         IBalancerV2BatchSwapVault.BatchSwapStep[] swapSteps; | ||||
|         IERC20TokenV06[] assets; | ||||
|     } | ||||
|  | ||||
|     function _tradeBalancerV2Batch( | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         internal | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         // Decode the bridge data. | ||||
|         ( | ||||
|             IBalancerV2BatchSwapVault vault, | ||||
|             IBalancerV2BatchSwapVault.BatchSwapStep[] memory swapSteps, | ||||
|             address[] memory assets_ | ||||
|         ) = abi.decode(bridgeData, (IBalancerV2BatchSwapVault, IBalancerV2BatchSwapVault.BatchSwapStep[], address[])); | ||||
|         IERC20TokenV06[] memory assets; | ||||
|         assembly { assets := assets_ } | ||||
|  | ||||
|         // Grant an allowance to the exchange to spend `fromTokenAddress` token. | ||||
|         assets[0].approveIfBelow(address(vault), sellAmount); | ||||
|  | ||||
|         swapSteps[0].amount = sellAmount; | ||||
|         int256[] memory limits = new int256[](assets.length); | ||||
|         for (uint256 i = 0; i < limits.length; ++i) { | ||||
|             limits[i] = type(int256).max; | ||||
|         } | ||||
|  | ||||
|         int256[] memory amounts = vault.batchSwap( | ||||
|             IBalancerV2BatchSwapVault.SwapKind.GIVEN_IN, | ||||
|             swapSteps, | ||||
|             assets, | ||||
|             IBalancerV2BatchSwapVault.FundManagement({ | ||||
|                 sender: address(this), | ||||
|                 fromInternalBalance: false, | ||||
|                 recipient: payable(address(this)), | ||||
|                 toInternalBalance: false | ||||
|             }), | ||||
|             limits, | ||||
|             block.timestamp + 1 | ||||
|         ); | ||||
|         require(amounts[amounts.length - 1] <= 0, 'Unexpected BalancerV2Batch output'); | ||||
|         return uint256(amounts[amounts.length - 1] * -1); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,128 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
|  | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
|  | ||||
|  | ||||
| /* | ||||
|     BancorV3 | ||||
| */ | ||||
| interface IBancorV3 { | ||||
|     /** | ||||
|      * @dev performs a trade by providing the source amount and returns the target amount and the associated fee | ||||
|      * | ||||
|      * requirements: | ||||
|      * | ||||
|      * - the caller must be the network contract | ||||
|      */ | ||||
|     function tradeBySourceAmount( | ||||
|         address sourceToken, | ||||
|         address targetToken, | ||||
|         uint256 sourceAmount, | ||||
|         uint256 minReturnAmount, | ||||
|         uint256 deadline, | ||||
|         address beneficiary | ||||
|     ) external payable returns (uint256 amount); | ||||
| } | ||||
|  | ||||
| contract MixinBancorV3 { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     IERC20TokenV06 constant public BANCORV3_ETH_ADDRESS = | ||||
|         IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); | ||||
|     IEtherTokenV06 private immutable WETH; | ||||
|  | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|     { | ||||
|         WETH = weth; | ||||
|     } | ||||
|  | ||||
|     function _tradeBancorV3( | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         internal | ||||
|         returns (uint256 amountOut) | ||||
|  | ||||
|     { | ||||
|         IBancorV3 router; | ||||
|         IERC20TokenV06[] memory path; | ||||
|         address[] memory _path; | ||||
|         uint256 payableAmount = 0; | ||||
|  | ||||
|         { | ||||
|             (router, _path) = abi.decode(bridgeData, (IBancorV3, address[])); | ||||
|             // To get around `abi.decode()` not supporting interface array types. | ||||
|             assembly { path := _path } | ||||
|         } | ||||
|  | ||||
|         require(path.length >= 2, "MixinBancorV3/PATH_LENGTH_MUST_BE_AT_LEAST_TWO"); | ||||
|         require( | ||||
|             path[path.length - 1] == buyToken, | ||||
|             "MixinBancorV3/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN" | ||||
|         ); | ||||
|  | ||||
|         //swap WETH->ETH as Bancor only deals in ETH | ||||
|         if(_path[0] == address(WETH)) { | ||||
|             //withdraw the sell amount of WETH for ETH | ||||
|             WETH.withdraw(sellAmount); | ||||
|             payableAmount = sellAmount; | ||||
|             // set _path[0] to the ETH address if WETH is our buy token | ||||
|             _path[0] = address(BANCORV3_ETH_ADDRESS); | ||||
|         } else { | ||||
|             // Grant the BancorV3 router an allowance to sell the first token. | ||||
|             path[0].approveIfBelow(address(router), sellAmount); | ||||
|         } | ||||
|  | ||||
|         // if we are buying WETH we need to swap to ETH and deposit into WETH after the swap | ||||
|         if(_path[1] == address(WETH)){ | ||||
|             _path[1] = address(BANCORV3_ETH_ADDRESS); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         uint256 amountOut = router.tradeBySourceAmount{value: payableAmount}( | ||||
|             _path[0], | ||||
|             _path[1], | ||||
|              // Sell all tokens we hold. | ||||
|             sellAmount, | ||||
|              // Minimum buy amount. | ||||
|             1, | ||||
|             //deadline | ||||
|             block.timestamp + 1, | ||||
|             // address of the mixin | ||||
|             address(this) | ||||
|         ); | ||||
|  | ||||
|         // if we want to return WETH deposit the ETH amount we sold | ||||
|         if(buyToken == WETH){ | ||||
|             WETH.deposit{value: amountOut}(); | ||||
|         } | ||||
|  | ||||
|         return amountOut; | ||||
|     } | ||||
| } | ||||
| @@ -1,92 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
|  | ||||
|  | ||||
| interface ICoFiXRouter { | ||||
|     // msg.value = fee | ||||
|     function swapExactTokensForETH( | ||||
|         address token, | ||||
|         uint amountIn, | ||||
|         uint amountOutMin, | ||||
|         address to, | ||||
|         address rewardTo, | ||||
|         uint deadline | ||||
|     ) external payable returns (uint _amountIn, uint _amountOut); | ||||
|  | ||||
|     // msg.value = amountIn + fee | ||||
|     function swapExactETHForTokens( | ||||
|         address token, | ||||
|         uint amountIn, | ||||
|         uint amountOutMin, | ||||
|         address to, | ||||
|         address rewardTo, | ||||
|         uint deadline | ||||
|     ) external payable returns (uint _amountIn, uint _amountOut); | ||||
| } | ||||
|  | ||||
| interface ICoFiXPair { | ||||
|  | ||||
|     function swapWithExact(address outToken, address to) | ||||
|         external | ||||
|         payable | ||||
|         returns ( | ||||
|             uint amountIn, | ||||
|             uint amountOut, | ||||
|             uint oracleFeeChange, | ||||
|             uint256[4] memory tradeInfo | ||||
|         ); | ||||
| } | ||||
|  | ||||
| contract MixinCoFiX { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     function _tradeCoFiX( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         internal | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         (uint256 fee, ICoFiXPair pool) = abi.decode(bridgeData, (uint256, ICoFiXPair)); | ||||
|         // Transfer tokens into the pool | ||||
|         LibERC20TokenV06.compatTransfer( | ||||
|             sellToken, | ||||
|             address(pool), | ||||
|             sellAmount | ||||
|         ); | ||||
|         // Call the swap exact with the tokens now in the pool | ||||
|         // pay the NEST Oracle fee with ETH | ||||
|         (/* In */, boughtAmount, , ) = pool.swapWithExact{value: fee}( | ||||
|             address(buyToken), | ||||
|             address(this) | ||||
|         ); | ||||
|  | ||||
|         return boughtAmount; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,98 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
|  | ||||
| /* | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
| import "../IBridgeAdapter.sol"; | ||||
|  | ||||
| /* | ||||
|     UniswapV2 | ||||
| */ | ||||
| interface IGmxRouter { | ||||
|  | ||||
|     // /// @dev Swaps an exact amount of input tokens for as many output tokens as possible, along the route determined by the path. | ||||
|     // ///      The first element of path is the input token, the last is the output token, and any intermediate elements represent | ||||
|     // ///      intermediate pairs to trade through (if, for example, a direct pair does not exist). | ||||
|     // /// @param _path An array of token addresses. path.length must be >= 2. Pools for each consecutive pair of addresses must exist and have liquidity. | ||||
|     // /// @param _amountIn The amount of input tokens to send. | ||||
|     // /// @param _minOut The minimum amount of output tokens that must be received for the transaction not to revert. | ||||
|     // /// @param _reciever Recipient of the output tokens. | ||||
|     function swap( | ||||
|        address[] calldata _path, uint256 _amountIn, uint256 _minOut, address _receiver | ||||
|     ) external; | ||||
| } | ||||
|  | ||||
| contract MixinGMX { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|     using LibSafeMathV06 for uint256; | ||||
|  | ||||
|     function _tradeGMX( | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         public | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         address _router; | ||||
|         address reader; | ||||
|         address vault; | ||||
|         address[] memory _path; | ||||
|         IGmxRouter router; | ||||
|         IERC20TokenV06[] memory path; | ||||
|  | ||||
|         { | ||||
|             //decode the bridge data | ||||
|             (_router, reader, vault, _path) = abi.decode(bridgeData, (address, address, address, address[])); | ||||
|             // To get around `abi.decode()` not supporting interface array types. | ||||
|             assembly { path := _path } | ||||
|         } | ||||
|  | ||||
|         require(path.length >= 2, "MixinGMX/PATH_LENGTH_MUST_BE_AT_LEAST_TWO"); | ||||
|         require( | ||||
|             path[path.length - 1] == buyToken, | ||||
|             "MixinGMX/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN" | ||||
|         ); | ||||
|  | ||||
|         //connect to the GMX router | ||||
|         router = IGmxRouter(_router); | ||||
|  | ||||
|         // Grant the GMX router an allowance to sell the first token. | ||||
|         path[0].approveIfBelow(address(router), sellAmount); | ||||
|  | ||||
|         //track the balance to know how much we bought | ||||
|         uint256 beforeBalance = buyToken.balanceOf(address(this)); | ||||
|         router.swap( | ||||
|             // Convert to `buyToken` along this path. | ||||
|             _path, | ||||
|              // Sell all tokens we hold. | ||||
|             sellAmount, | ||||
|              // Minimum buy amount. | ||||
|             0, | ||||
|             // Recipient is `this`. | ||||
|             address(this) | ||||
|         ); | ||||
|  | ||||
|         //calculate the difference in balance from preswap->postswap to find how many tokens out | ||||
|         boughtAmount = buyToken.balanceOf(address(this)).safeSub(beforeBalance); | ||||
|  | ||||
|         return boughtAmount; | ||||
|     } | ||||
| } | ||||
| @@ -1,124 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
| import "../IBridgeAdapter.sol"; | ||||
|  | ||||
| interface IKyberNetworkProxy { | ||||
|  | ||||
|     /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens | ||||
|     /// using a hint for the reserve. | ||||
|     /// @param sellToken Token to sell. | ||||
|     /// @param sellAmount Amount of tokens to sell. | ||||
|     /// @param buyToken Token to buy. | ||||
|     /// @param recipientAddress Address to send bought tokens to. | ||||
|     /// @param maxBuyTokenAmount A limit on the amount of tokens to buy. | ||||
|     /// @param minConversionRate The minimal conversion rate. If actual rate | ||||
|     ///        is lower, trade is canceled. | ||||
|     /// @param walletId The wallet ID to send part of the fees | ||||
|     /// @param hint The hint for the selective inclusion (or exclusion) of reserves | ||||
|     /// @return boughtAmount Amount of tokens bought. | ||||
|     function tradeWithHint( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         uint256 sellAmount, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         address payable recipientAddress, | ||||
|         uint256 maxBuyTokenAmount, | ||||
|         uint256 minConversionRate, | ||||
|         address payable walletId, | ||||
|         bytes calldata hint | ||||
|     ) | ||||
|         external | ||||
|         payable | ||||
|         returns (uint256 boughtAmount); | ||||
| } | ||||
|  | ||||
| contract MixinKyber { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     /// @dev Address indicating the trade is using ETH | ||||
|     IERC20TokenV06 private immutable KYBER_ETH_ADDRESS = | ||||
|         IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); | ||||
|     /// @dev Mainnet address of the WETH contract. | ||||
|     IEtherTokenV06 private immutable WETH; | ||||
|  | ||||
|     constructor(IEtherTokenV06 weth) | ||||
|         public | ||||
|     { | ||||
|         WETH = weth; | ||||
|     } | ||||
|  | ||||
|     function _tradeKyber( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         internal | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         (IKyberNetworkProxy kyber, bytes memory hint) = | ||||
|             abi.decode(bridgeData, (IKyberNetworkProxy, bytes)); | ||||
|  | ||||
|         uint256 payableAmount = 0; | ||||
|         if (sellToken != WETH) { | ||||
|             // If the input token is not WETH, grant an allowance to the exchange | ||||
|             // to spend them. | ||||
|             sellToken.approveIfBelow( | ||||
|                 address(kyber), | ||||
|                 sellAmount | ||||
|             ); | ||||
|         } else { | ||||
|             // If the input token is WETH, unwrap it and attach it to the call. | ||||
|             payableAmount = sellAmount; | ||||
|             WETH.withdraw(payableAmount); | ||||
|         } | ||||
|  | ||||
|         // Try to sell all of this contract's input token balance through | ||||
|         // `KyberNetworkProxy.trade()`. | ||||
|         boughtAmount = kyber.tradeWithHint{ value: payableAmount }( | ||||
|             // Input token. | ||||
|             sellToken == WETH ? KYBER_ETH_ADDRESS : sellToken, | ||||
|             // Sell amount. | ||||
|             sellAmount, | ||||
|             // Output token. | ||||
|             buyToken == WETH ? KYBER_ETH_ADDRESS : buyToken, | ||||
|             // Transfer to this contract | ||||
|             address(uint160(address(this))), | ||||
|             // Buy as much as possible. | ||||
|             uint256(-1), | ||||
|             // Lowest minimum conversion rate | ||||
|             1, | ||||
|             // No affiliate address. | ||||
|             address(0), | ||||
|             hint | ||||
|         ); | ||||
|         // If receving ETH, wrap it to WETH. | ||||
|         if (buyToken == WETH) { | ||||
|             WETH.deposit{ value: boughtAmount }(); | ||||
|         } | ||||
|         return boughtAmount; | ||||
|     } | ||||
| } | ||||
| @@ -26,7 +26,7 @@ import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Minimal interface for minting StETH | ||||
| interface ILido { | ||||
| interface IStETH { | ||||
|     /// @dev Adds eth to the pool | ||||
|     /// @param _referral optional address for referrals | ||||
|     /// @return StETH Amount of shares generated | ||||
| @@ -37,6 +37,33 @@ interface ILido { | ||||
|     function getPooledEthByShares(uint256 _sharesAmount) external view returns (uint256); | ||||
| } | ||||
|  | ||||
| /// @dev Minimal interface for wrapping/unwrapping stETH. | ||||
| interface IWstETH { | ||||
|  | ||||
|     /** | ||||
|      * @notice Exchanges stETH to wstETH | ||||
|      * @param _stETHAmount amount of stETH to wrap in exchange for wstETH | ||||
|      * @dev Requirements: | ||||
|      *  - `_stETHAmount` must be non-zero | ||||
|      *  - msg.sender must approve at least `_stETHAmount` stETH to this | ||||
|      *    contract. | ||||
|      *  - msg.sender must have at least `_stETHAmount` of stETH. | ||||
|      * User should first approve _stETHAmount to the WstETH contract | ||||
|      * @return Amount of wstETH user receives after wrap | ||||
|      */ | ||||
|     function wrap(uint256 _stETHAmount) external returns (uint256); | ||||
|  | ||||
|     /** | ||||
|      * @notice Exchanges wstETH to stETH | ||||
|      * @param _wstETHAmount amount of wstETH to uwrap in exchange for stETH | ||||
|      * @dev Requirements: | ||||
|      *  - `_wstETHAmount` must be non-zero | ||||
|      *  - msg.sender must have at least `_wstETHAmount` wstETH. | ||||
|      * @return Amount of stETH user receives after unwrap | ||||
|      */ | ||||
|     function unwrap(uint256 _wstETHAmount) external returns (uint256); | ||||
| } | ||||
|  | ||||
|  | ||||
| contract MixinLido { | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
| @@ -59,12 +86,43 @@ contract MixinLido { | ||||
|         internal | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         (ILido lido) = abi.decode(bridgeData, (ILido)); | ||||
|         if (address(sellToken) == address(WETH) && address(buyToken) == address(lido)) { | ||||
|         if (address(sellToken) == address(WETH)) { | ||||
|             return _tradeStETH(buyToken, sellAmount, bridgeData); | ||||
|         }  | ||||
|  | ||||
|         return _tradeWstETH(sellToken, buyToken, sellAmount, bridgeData); | ||||
|     } | ||||
|  | ||||
|     function _tradeStETH( | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) private returns (uint256 boughtAmount) { | ||||
|         (IStETH stETH) = abi.decode(bridgeData, (IStETH)); | ||||
|         if (address(buyToken) == address(stETH)) { | ||||
|             WETH.withdraw(sellAmount); | ||||
|             boughtAmount = lido.getPooledEthByShares(lido.submit{ value: sellAmount}(address(0))); | ||||
|         } else { | ||||
|             revert("MixinLido/UNSUPPORTED_TOKEN_PAIR"); | ||||
|             return stETH.getPooledEthByShares(stETH.submit{ value: sellAmount}(address(0))); | ||||
|         } | ||||
|  | ||||
|         revert("MixinLido/UNSUPPORTED_TOKEN_PAIR"); | ||||
|     } | ||||
|  | ||||
|     function _tradeWstETH( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|  | ||||
|     ) private returns(uint256 boughtAmount){ | ||||
|         (IEtherTokenV06 stETH, IWstETH wstETH) = abi.decode(bridgeData, (IEtherTokenV06, IWstETH)); | ||||
|         if (address(sellToken) == address(stETH) && address(buyToken) == address(wstETH) ) { | ||||
|             sellToken.approveIfBelow(address(wstETH), sellAmount); | ||||
|             return wstETH.wrap(sellAmount); | ||||
|         } | ||||
|         if (address(sellToken) == address(wstETH) && address(buyToken) == address(stETH) ) { | ||||
|             return wstETH.unwrap(sellAmount); | ||||
|         } | ||||
|  | ||||
|         revert("MixinLido/UNSUPPORTED_TOKEN_PAIR"); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,76 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "../IBridgeAdapter.sol"; | ||||
|  | ||||
| interface IOasis { | ||||
|  | ||||
|     /// @dev Sell `sellAmount` of `sellToken` token and receive `buyToken` token. | ||||
|     /// @param sellToken The token being sold. | ||||
|     /// @param sellAmount The amount of `sellToken` token being sold. | ||||
|     /// @param buyToken The token being bought. | ||||
|     /// @param minBoughtAmount Minimum amount of `buyToken` token to buy. | ||||
|     /// @return boughtAmount Amount of `buyToken` bought. | ||||
|     function sellAllAmount( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         uint256 sellAmount, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 minBoughtAmount | ||||
|     ) | ||||
|         external | ||||
|         returns (uint256 boughtAmount); | ||||
| } | ||||
|  | ||||
| contract MixinOasis { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     function _tradeOasis( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         internal | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|  | ||||
|         (IOasis oasis) = abi.decode(bridgeData, (IOasis)); | ||||
|  | ||||
|         // Grant an allowance to the exchange to spend `sellToken` token. | ||||
|         sellToken.approveIfBelow( | ||||
|             address(oasis), | ||||
|             sellAmount | ||||
|         ); | ||||
|         // Try to sell all of this contract's `sellToken` token balance. | ||||
|         boughtAmount = oasis.sellAllAmount( | ||||
|             sellToken, | ||||
|             sellAmount, | ||||
|             buyToken, | ||||
|             // min fill amount | ||||
|             1 | ||||
|         ); | ||||
|         return boughtAmount; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,98 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
|  | ||||
|  | ||||
| interface IPlatypusRouter { | ||||
|  | ||||
|     function swapTokensForTokens( | ||||
|         address[] calldata tokenPath, | ||||
|         address[] calldata poolPath, | ||||
|         uint256 fromAmount, | ||||
|         uint256 minimumToAmount, | ||||
|         address to, | ||||
|         uint256 deadline | ||||
|     ) external returns (uint256 amountOut, uint256 haircut); | ||||
| } | ||||
|  | ||||
| contract MixinPlatypus { | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|     using LibSafeMathV06 for uint256; | ||||
|  | ||||
|     function _tradePlatypus( | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         public | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         IPlatypusRouter router; | ||||
|         address _router; | ||||
|         address[] memory _pool; | ||||
|         IERC20TokenV06[] memory path; | ||||
|         address[] memory _path; | ||||
|  | ||||
|         { | ||||
|             (_router, _pool, _path) = abi.decode(bridgeData, (address, address[], address[])); | ||||
|  | ||||
|             // To get around `abi.decode()` not supporting interface array types. | ||||
|             assembly { path := _path } | ||||
|         } | ||||
|  | ||||
|         //connect to the ptp router | ||||
|         router = IPlatypusRouter(_router); | ||||
|  | ||||
|         require(path.length >= 2, "MixinPlatypus/PATH_LENGTH_MUST_BE_AT_LEAST_TWO"); | ||||
|         require( | ||||
|             path[path.length - 1] == buyToken, | ||||
|             "MixinPlatypus/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN" | ||||
|         ); | ||||
|         // Grant the Platypus router an allowance to sell the first token. | ||||
|         path[0].approveIfBelow(address(router), sellAmount); | ||||
|  | ||||
|         //keep track of the previous balance to confirm amount out | ||||
|         uint256 beforeBalance = buyToken.balanceOf(address(this)); | ||||
|  | ||||
|         router.swapTokensForTokens( | ||||
|             // Convert to `buyToken` along this path. | ||||
|             _path, | ||||
|             // pool to swap on | ||||
|             _pool, | ||||
|              // Sell all tokens we hold. | ||||
|             sellAmount, | ||||
|              // Minimum buy amount. | ||||
|             0, | ||||
|             // Recipient is `this`. | ||||
|             address(this), | ||||
|  | ||||
|             block.timestamp + 1 | ||||
|         ); | ||||
|         //calculate the buy amount from the tokens we recieved | ||||
|         boughtAmount = buyToken.balanceOf(address(this)).safeSub(beforeBalance); | ||||
|         return boughtAmount; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,99 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| interface ISynthetix { | ||||
|     // Ethereum Mainnet | ||||
|     function exchangeAtomically( | ||||
|         bytes32 sourceCurrencyKey, | ||||
|         uint256 sourceAmount, | ||||
|         bytes32 destinationCurrencyKey, | ||||
|         bytes32 trackingCode, | ||||
|         uint256 minAmount | ||||
|     ) external returns (uint256 amountReceived); | ||||
|  | ||||
|     // Optimism | ||||
|     function exchangeWithTracking( | ||||
|         bytes32 sourceCurrencyKey, | ||||
|         uint256 sourceAmount, | ||||
|         bytes32 destinationCurrencyKey, | ||||
|         address rewardAddress, | ||||
|         bytes32 trackingCode | ||||
|     ) external returns (uint256 amountReceived); | ||||
| } | ||||
|  | ||||
| contract MixinSynthetix { | ||||
|     address private constant rewardAddress = | ||||
|         0x5C80239D97E1eB216b5c3D8fBa5DE5Be5d38e4C9; | ||||
|     bytes32 constant trackingCode = | ||||
|         0x3058000000000000000000000000000000000000000000000000000000000000; | ||||
|  | ||||
|     function _tradeSynthetix(uint256 sellAmount, bytes memory bridgeData) | ||||
|         public | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         ( | ||||
|             ISynthetix synthetix, | ||||
|             bytes32 sourceCurrencyKey, | ||||
|             bytes32 destinationCurrencyKey | ||||
|         ) = abi.decode( | ||||
|                 bridgeData, | ||||
|                 (ISynthetix, bytes32, bytes32) | ||||
|             ); | ||||
|  | ||||
|         boughtAmount = exchange( | ||||
|             synthetix, | ||||
|             sourceCurrencyKey, | ||||
|             destinationCurrencyKey, | ||||
|             sellAmount | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function exchange( | ||||
|         ISynthetix synthetix, | ||||
|         bytes32 sourceCurrencyKey, | ||||
|         bytes32 destinationCurrencyKey, | ||||
|         uint256 sellAmount | ||||
|     ) internal returns (uint256 boughtAmount) { | ||||
|         uint256 chainId; | ||||
|         assembly { | ||||
|             chainId := chainid() | ||||
|         } | ||||
|  | ||||
|         if (chainId == 1) { | ||||
|             boughtAmount = synthetix.exchangeAtomically( | ||||
|                 sourceCurrencyKey, | ||||
|                 sellAmount, | ||||
|                 destinationCurrencyKey, | ||||
|                 trackingCode, | ||||
|                 0 | ||||
|             ); | ||||
|         } else { | ||||
|             boughtAmount = synthetix.exchangeWithTracking( | ||||
|                 sourceCurrencyKey, | ||||
|                 sellAmount, | ||||
|                 destinationCurrencyKey, | ||||
|                 rewardAddress, | ||||
|                 trackingCode | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,64 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
|  | ||||
| interface IVelodromeRouter { | ||||
|     function swapExactTokensForTokensSimple( | ||||
|         uint256 amountIn, | ||||
|         uint256 amountOutMin, | ||||
|         address tokenFrom, | ||||
|         address tokenTo, | ||||
|         bool stable, | ||||
|         address to, | ||||
|         uint256 deadline | ||||
|     ) external returns (uint256[] memory amounts);  | ||||
| } | ||||
|  | ||||
| contract MixinVelodrome { | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     function _tradeVelodrome( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         internal | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|  | ||||
|         (IVelodromeRouter router, bool stable) = abi.decode(bridgeData, (IVelodromeRouter, bool)); | ||||
|         sellToken.approveIfBelow(address(router), sellAmount); | ||||
|  | ||||
|         boughtAmount = router.swapExactTokensForTokensSimple( | ||||
|             sellAmount, | ||||
|             0,  | ||||
|             address(sellToken), | ||||
|             address(buyToken), | ||||
|             stable, | ||||
|             address(this), | ||||
|             block.timestamp + 1 | ||||
|         )[1]; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,136 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
|  | ||||
| /* | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
| import "../IBridgeAdapter.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
|  | ||||
| /// @dev WooFI pool interface. | ||||
| interface IWooPP { | ||||
|     function quoteToken() external view returns (address); | ||||
|  | ||||
|     function sellBase( | ||||
|         address baseToken, | ||||
|         uint256 baseAmount, | ||||
|         uint256 minQuoteAmount, | ||||
|         address to, | ||||
|         address rebateTo | ||||
|     ) external returns (uint256 quoteAmount); | ||||
|  | ||||
|     function sellQuote( | ||||
|         address baseToken, | ||||
|         uint256 quoteAmount, | ||||
|         uint256 minBaseAmount, | ||||
|         address to, | ||||
|         address rebateTo | ||||
|     ) external returns (uint256 baseAmount); | ||||
|  | ||||
|     /// @dev Query the amount for selling the base token amount. | ||||
|     /// @param baseToken the base token to sell | ||||
|     /// @param baseAmount the amount to sell | ||||
|     /// @return quoteAmount the swapped quote amount | ||||
|     function querySellBase( | ||||
|         address baseToken,  | ||||
|         uint256 baseAmount | ||||
|     ) external view returns (uint256 quoteAmount); | ||||
|  | ||||
| } | ||||
|  | ||||
| contract MixinWOOFi{ | ||||
|  | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|     using LibERC20TokenV06 for IEtherTokenV06; | ||||
|     using LibSafeMathV06 for uint256; | ||||
|  | ||||
|     address constant rebateAddress = 0xBfdcBB4C05843163F491C24f9c0019c510786304; | ||||
|  | ||||
|     // /// @dev Swaps an exact amount of input tokens for as many output tokens as possible. | ||||
|     // /// @param _amountIn Amount of input tokens to send | ||||
|     // /// @param _minAmountOut The minimum amount of output tokens that must be received for the transaction not to revert. | ||||
|     // /// @param _tokenIn Input token | ||||
|     // /// @param _tokenOut Output token | ||||
|     // /// @param _to recipient of tokens | ||||
|     // /// @param pool WOOFi pool where the swap will happen | ||||
|     function _tradeWOOFi( | ||||
|         IERC20TokenV06 sellToken, | ||||
|         IERC20TokenV06 buyToken, | ||||
|         uint256 sellAmount, | ||||
|         bytes memory bridgeData | ||||
|     ) | ||||
|         public | ||||
|         returns (uint256 boughtAmount) | ||||
|     { | ||||
|         (IWooPP _pool) = abi.decode(bridgeData, (IWooPP)); | ||||
|         uint256 beforeBalance = buyToken.balanceOf(address(this)); | ||||
|  | ||||
|         sellToken.approveIfBelow(address(_pool), sellAmount); | ||||
|          | ||||
|         _swap( | ||||
|             sellAmount, | ||||
|             address(sellToken), | ||||
|             address(buyToken), | ||||
|             _pool | ||||
|         ); | ||||
|         boughtAmount = buyToken.balanceOf(address(this)).safeSub(beforeBalance); | ||||
|     } | ||||
|  | ||||
|     function _swap( | ||||
|         uint _amountIn,  | ||||
|         address _tokenIn,  | ||||
|         address _tokenOut,  | ||||
|         IWooPP pool | ||||
|     ) internal { | ||||
|         address quoteToken = pool.quoteToken(); | ||||
|         if (_tokenIn == quoteToken) { | ||||
|             pool.sellQuote( | ||||
|                 _tokenOut, | ||||
|                 _amountIn, | ||||
|                 1, | ||||
|                 address(this), | ||||
|                 rebateAddress | ||||
|             ); | ||||
|         } else if (_tokenOut == quoteToken) { | ||||
|             pool.sellBase( | ||||
|                 _tokenIn,  | ||||
|                 _amountIn,  | ||||
|                 1,  | ||||
|                 address(this),  | ||||
|                 rebateAddress | ||||
|             ); | ||||
|         } else {           | ||||
|             uint256 quoteAmount = pool.sellBase( | ||||
|                 _tokenIn,  | ||||
|                 _amountIn,  | ||||
|                 0,  | ||||
|                 address(this),  | ||||
|                 rebateAddress | ||||
|             ); | ||||
|             IERC20TokenV06(pool.quoteToken()).approveIfBelow(address(pool), quoteAmount); | ||||
|             pool.sellQuote( | ||||
|                 _tokenOut,  | ||||
|                 quoteAmount,  | ||||
|                 1,  | ||||
|                 address(this),  | ||||
|                 rebateAddress | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										30
									
								
								contracts/zero-ex/contracts/test/foundry/ContractTest.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								contracts/zero-ex/contracts/test/foundry/ContractTest.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 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; | ||||
|  | ||||
| import "forge-std/Test.sol"; | ||||
|  | ||||
| contract ContractTest is Test { | ||||
|     function setUp() public {} | ||||
|  | ||||
|     function testExample() public { | ||||
|       assertTrue(true); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										8
									
								
								contracts/zero-ex/foundry.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								contracts/zero-ex/foundry.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| [default] | ||||
| src = 'contracts/src' | ||||
| out = 'foundry-artifacts' | ||||
| test = 'contracts/test/foundry' | ||||
| libs = ["contracts/deps/", "../utils/contracts/src/"] | ||||
| remappings = ['@0x/contracts-utils/=../utils/', '@0x/contracts-erc20/=../erc20/', 'src/=./contracts/src'] | ||||
| cache_path = 'foundry-cache' | ||||
| optimizer_runs = 1000000 | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-zero-ex", | ||||
|     "version": "0.31.1", | ||||
|     "version": "0.37.2", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -38,12 +38,13 @@ | ||||
|         "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", | ||||
|         "rollback": "node ./lib/scripts/rollback.js" | ||||
|         "rollback": "node ./lib/scripts/rollback.js", | ||||
|         "typechain": "typechain --target=ethers-v5 --out-dir='typechain-wrappers'  './foundry-artifacts/**/*.json'" | ||||
|     }, | ||||
|     "config": { | ||||
|         "publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,PositiveSlippageFeeTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,AffiliateFeeTransformer,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature,ILiquidityProviderFeature,NativeOrdersFeature,INativeOrdersFeature,FeeCollectorController,FeeCollector,CurveLiquidityProvider,BatchFillNativeOrdersFeature,IBatchFillNativeOrdersFeature,MultiplexFeature,IMultiplexFeature,OtcOrdersFeature,IOtcOrdersFeature", | ||||
|         "publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,PositiveSlippageFeeTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,AffiliateFeeTransformer,MetaTransactionsFeature,LogMetadataTransformer,LiquidityProviderFeature,ILiquidityProviderFeature,NativeOrdersFeature,INativeOrdersFeature,FeeCollectorController,FeeCollector,CurveLiquidityProvider,BatchFillNativeOrdersFeature,IBatchFillNativeOrdersFeature,MultiplexFeature,IMultiplexFeature,OtcOrdersFeature,IOtcOrdersFeature,AvalancheBridgeAdapter,BSCBridgeAdapter,CeloBridgeAdapter,EthereumBridgeAdapter,FantomBridgeAdapter,OptimismBridgeAdapter,PolygonBridgeAdapter", | ||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", | ||||
|         "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|ERC1155OrdersFeature|ERC165Feature|ERC721OrdersFeature|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinERC1155Spender|FixinERC721Spender|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC1155OrdersFeature|IERC1155Token|IERC165Feature|IERC20Bridge|IERC20Transformer|IERC721OrdersFeature|IERC721Token|IFeature|IFeeRecipient|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|IPropertyValidator|ISimpleFunctionRegistryFeature|IStaking|ITakerCallback|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC1155OrdersStorage|LibERC20Transformer|LibERC721OrdersStorage|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNFTOrder|LibNFTOrdersRichErrors|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinAaveV2|MixinBalancer|MixinBalancerV2|MixinBancor|MixinCoFiX|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NFTOrders|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFeeRecipient|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC1155Token|TestMintableERC20Token|TestMintableERC721Token|TestMooniswap|TestNFTOrderPresigner|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestPropertyValidator|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json" | ||||
|         "abis": "./test/generated-artifacts/@(AbstractBridgeAdapter|AffiliateFeeTransformer|AvalancheBridgeAdapter|BSCBridgeAdapter|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeProtocols|CeloBridgeAdapter|CurveLiquidityProvider|ERC1155OrdersFeature|ERC165Feature|ERC721OrdersFeature|EthereumBridgeAdapter|FantomBridgeAdapter|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinERC1155Spender|FixinERC721Spender|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC1155OrdersFeature|IERC1155Token|IERC165Feature|IERC20Bridge|IERC20Transformer|IERC721OrdersFeature|IERC721Token|IFeature|IFeeRecipient|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|IPropertyValidator|ISimpleFunctionRegistryFeature|IStaking|ITakerCallback|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC1155OrdersStorage|LibERC20Transformer|LibERC721OrdersStorage|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNFTOrder|LibNFTOrdersRichErrors|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinAaveV2|MixinBalancer|MixinBalancerV2|MixinBalancerV2Batch|MixinBancor|MixinBancorV3|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinGMX|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinPlatypus|MixinShell|MixinSynthetix|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinVelodrome|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NFTOrders|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OptimismBridgeAdapter|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PolygonBridgeAdapter|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFeeRecipient|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC1155Token|TestMintableERC20Token|TestMintableERC721Token|TestMooniswap|TestNFTOrderPresigner|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestPropertyValidator|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
| @@ -55,16 +56,17 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/zero-ex", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.7.2", | ||||
|         "@0x/contract-addresses": "^6.12.0", | ||||
|         "@0x/contracts-erc20": "^3.3.27", | ||||
|         "@0x/contracts-gen": "^2.0.43", | ||||
|         "@0x/contracts-test-utils": "^5.4.18", | ||||
|         "@0x/dev-utils": "^4.2.11", | ||||
|         "@0x/abi-gen": "^5.8.1", | ||||
|         "@0x/contract-addresses": "^6.23.2", | ||||
|         "@0x/contracts-erc20": "^3.3.42", | ||||
|         "@0x/contracts-gen": "^2.0.47", | ||||
|         "@0x/contracts-test-utils": "^5.4.33", | ||||
|         "@0x/dev-utils": "^5.0.0", | ||||
|         "@0x/order-utils": "^10.4.28", | ||||
|         "@0x/sol-compiler": "^4.7.8", | ||||
|         "@0x/sol-compiler": "^4.8.2", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@typechain/ethers-v5": "^10.0.0", | ||||
|         "@types/isomorphic-fetch": "^0.0.35", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -78,18 +80,19 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typechain": "^8.0.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "4.6.3" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.5", | ||||
|         "@0x/protocol-utils": "^1.11.1", | ||||
|         "@0x/subproviders": "^6.6.2", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@0x/typescript-typings": "^5.2.1", | ||||
|         "@0x/utils": "^6.5.0", | ||||
|         "@0x/web3-wrapper": "^7.6.2", | ||||
|         "ethereum-types": "^3.6.0", | ||||
|         "@0x/base-contract": "^7.0.0", | ||||
|         "@0x/protocol-utils": "^11.16.9", | ||||
|         "@0x/subproviders": "^7.0.0", | ||||
|         "@0x/types": "^3.3.6", | ||||
|         "@0x/typescript-typings": "^5.3.1", | ||||
|         "@0x/utils": "^7.0.0", | ||||
|         "@0x/web3-wrapper": "^8.0.0", | ||||
|         "ethereum-types": "^3.7.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethers": "~4.0.4" | ||||
|     }, | ||||
|   | ||||
| @@ -6,9 +6,13 @@ | ||||
| import { ContractArtifact } from 'ethereum-types'; | ||||
|  | ||||
| import * as AffiliateFeeTransformer from '../generated-artifacts/AffiliateFeeTransformer.json'; | ||||
| import * as AvalancheBridgeAdapter from '../generated-artifacts/AvalancheBridgeAdapter.json'; | ||||
| import * as BatchFillNativeOrdersFeature from '../generated-artifacts/BatchFillNativeOrdersFeature.json'; | ||||
| import * as BridgeAdapter from '../generated-artifacts/BridgeAdapter.json'; | ||||
| import * as BSCBridgeAdapter from '../generated-artifacts/BSCBridgeAdapter.json'; | ||||
| import * as CeloBridgeAdapter from '../generated-artifacts/CeloBridgeAdapter.json'; | ||||
| import * as CurveLiquidityProvider from '../generated-artifacts/CurveLiquidityProvider.json'; | ||||
| import * as EthereumBridgeAdapter from '../generated-artifacts/EthereumBridgeAdapter.json'; | ||||
| import * as FantomBridgeAdapter from '../generated-artifacts/FantomBridgeAdapter.json'; | ||||
| import * as FeeCollector from '../generated-artifacts/FeeCollector.json'; | ||||
| import * as FeeCollectorController from '../generated-artifacts/FeeCollectorController.json'; | ||||
| import * as FillQuoteTransformer from '../generated-artifacts/FillQuoteTransformer.json'; | ||||
| @@ -30,9 +34,11 @@ import * as LogMetadataTransformer from '../generated-artifacts/LogMetadataTrans | ||||
| import * as MetaTransactionsFeature from '../generated-artifacts/MetaTransactionsFeature.json'; | ||||
| import * as MultiplexFeature from '../generated-artifacts/MultiplexFeature.json'; | ||||
| import * as NativeOrdersFeature from '../generated-artifacts/NativeOrdersFeature.json'; | ||||
| import * as OptimismBridgeAdapter from '../generated-artifacts/OptimismBridgeAdapter.json'; | ||||
| import * as OtcOrdersFeature from '../generated-artifacts/OtcOrdersFeature.json'; | ||||
| import * as OwnableFeature from '../generated-artifacts/OwnableFeature.json'; | ||||
| import * as PayTakerTransformer from '../generated-artifacts/PayTakerTransformer.json'; | ||||
| import * as PolygonBridgeAdapter from '../generated-artifacts/PolygonBridgeAdapter.json'; | ||||
| import * as PositiveSlippageFeeTransformer from '../generated-artifacts/PositiveSlippageFeeTransformer.json'; | ||||
| import * as SimpleFunctionRegistryFeature from '../generated-artifacts/SimpleFunctionRegistryFeature.json'; | ||||
| import * as TransformERC20Feature from '../generated-artifacts/TransformERC20Feature.json'; | ||||
| @@ -58,7 +64,6 @@ export const artifacts = { | ||||
|     AffiliateFeeTransformer: AffiliateFeeTransformer as ContractArtifact, | ||||
|     MetaTransactionsFeature: MetaTransactionsFeature as ContractArtifact, | ||||
|     LogMetadataTransformer: LogMetadataTransformer as ContractArtifact, | ||||
|     BridgeAdapter: BridgeAdapter as ContractArtifact, | ||||
|     LiquidityProviderFeature: LiquidityProviderFeature as ContractArtifact, | ||||
|     ILiquidityProviderFeature: ILiquidityProviderFeature as ContractArtifact, | ||||
|     NativeOrdersFeature: NativeOrdersFeature as ContractArtifact, | ||||
| @@ -72,4 +77,11 @@ export const artifacts = { | ||||
|     IMultiplexFeature: IMultiplexFeature as ContractArtifact, | ||||
|     OtcOrdersFeature: OtcOrdersFeature as ContractArtifact, | ||||
|     IOtcOrdersFeature: IOtcOrdersFeature as ContractArtifact, | ||||
|     AvalancheBridgeAdapter: AvalancheBridgeAdapter as ContractArtifact, | ||||
|     BSCBridgeAdapter: BSCBridgeAdapter as ContractArtifact, | ||||
|     CeloBridgeAdapter: CeloBridgeAdapter as ContractArtifact, | ||||
|     EthereumBridgeAdapter: EthereumBridgeAdapter as ContractArtifact, | ||||
|     FantomBridgeAdapter: FantomBridgeAdapter as ContractArtifact, | ||||
|     OptimismBridgeAdapter: OptimismBridgeAdapter as ContractArtifact, | ||||
|     PolygonBridgeAdapter: PolygonBridgeAdapter as ContractArtifact, | ||||
| }; | ||||
|   | ||||
| @@ -35,7 +35,11 @@ export * from './bloom_filter_utils'; | ||||
| export { GREEDY_TOKENS } from './constants'; | ||||
| export { | ||||
|     AffiliateFeeTransformerContract, | ||||
|     BridgeAdapterContract, | ||||
|     AvalancheBridgeAdapterContract, | ||||
|     BSCBridgeAdapterContract, | ||||
|     CeloBridgeAdapterContract, | ||||
|     EthereumBridgeAdapterContract, | ||||
|     FantomBridgeAdapterContract, | ||||
|     FillQuoteTransformerContract, | ||||
|     IOwnableFeatureContract, | ||||
|     IOwnableFeatureEvents, | ||||
| @@ -45,7 +49,9 @@ export { | ||||
|     IZeroExContract, | ||||
|     LogMetadataTransformerContract, | ||||
|     MultiplexFeatureContract, | ||||
|     OptimismBridgeAdapterContract, | ||||
|     PayTakerTransformerContract, | ||||
|     PolygonBridgeAdapterContract, | ||||
|     PositiveSlippageFeeTransformerContract, | ||||
|     TransformERC20FeatureContract, | ||||
|     WethTransformerContract, | ||||
|   | ||||
| @@ -4,9 +4,13 @@ | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
| export * from '../generated-wrappers/affiliate_fee_transformer'; | ||||
| export * from '../generated-wrappers/avalanche_bridge_adapter'; | ||||
| export * from '../generated-wrappers/b_s_c_bridge_adapter'; | ||||
| export * from '../generated-wrappers/batch_fill_native_orders_feature'; | ||||
| export * from '../generated-wrappers/bridge_adapter'; | ||||
| export * from '../generated-wrappers/celo_bridge_adapter'; | ||||
| export * from '../generated-wrappers/curve_liquidity_provider'; | ||||
| export * from '../generated-wrappers/ethereum_bridge_adapter'; | ||||
| export * from '../generated-wrappers/fantom_bridge_adapter'; | ||||
| export * from '../generated-wrappers/fee_collector'; | ||||
| export * from '../generated-wrappers/fee_collector_controller'; | ||||
| export * from '../generated-wrappers/fill_quote_transformer'; | ||||
| @@ -28,9 +32,11 @@ export * from '../generated-wrappers/log_metadata_transformer'; | ||||
| export * from '../generated-wrappers/meta_transactions_feature'; | ||||
| export * from '../generated-wrappers/multiplex_feature'; | ||||
| export * from '../generated-wrappers/native_orders_feature'; | ||||
| export * from '../generated-wrappers/optimism_bridge_adapter'; | ||||
| export * from '../generated-wrappers/otc_orders_feature'; | ||||
| export * from '../generated-wrappers/ownable_feature'; | ||||
| export * from '../generated-wrappers/pay_taker_transformer'; | ||||
| export * from '../generated-wrappers/polygon_bridge_adapter'; | ||||
| export * from '../generated-wrappers/positive_slippage_fee_transformer'; | ||||
| export * from '../generated-wrappers/simple_function_registry_feature'; | ||||
| export * from '../generated-wrappers/transform_erc20_feature'; | ||||
|   | ||||
| @@ -5,15 +5,20 @@ | ||||
|  */ | ||||
| import { ContractArtifact } from 'ethereum-types'; | ||||
|  | ||||
| import * as AbstractBridgeAdapter from '../test/generated-artifacts/AbstractBridgeAdapter.json'; | ||||
| import * as AffiliateFeeTransformer from '../test/generated-artifacts/AffiliateFeeTransformer.json'; | ||||
| import * as AvalancheBridgeAdapter from '../test/generated-artifacts/AvalancheBridgeAdapter.json'; | ||||
| import * as BatchFillNativeOrdersFeature from '../test/generated-artifacts/BatchFillNativeOrdersFeature.json'; | ||||
| import * as BootstrapFeature from '../test/generated-artifacts/BootstrapFeature.json'; | ||||
| import * as BridgeAdapter from '../test/generated-artifacts/BridgeAdapter.json'; | ||||
| import * as BridgeProtocols from '../test/generated-artifacts/BridgeProtocols.json'; | ||||
| import * as BSCBridgeAdapter from '../test/generated-artifacts/BSCBridgeAdapter.json'; | ||||
| import * as CeloBridgeAdapter from '../test/generated-artifacts/CeloBridgeAdapter.json'; | ||||
| import * as CurveLiquidityProvider from '../test/generated-artifacts/CurveLiquidityProvider.json'; | ||||
| import * as ERC1155OrdersFeature from '../test/generated-artifacts/ERC1155OrdersFeature.json'; | ||||
| import * as ERC165Feature from '../test/generated-artifacts/ERC165Feature.json'; | ||||
| import * as ERC721OrdersFeature from '../test/generated-artifacts/ERC721OrdersFeature.json'; | ||||
| import * as EthereumBridgeAdapter from '../test/generated-artifacts/EthereumBridgeAdapter.json'; | ||||
| import * as FantomBridgeAdapter from '../test/generated-artifacts/FantomBridgeAdapter.json'; | ||||
| import * as FeeCollector from '../test/generated-artifacts/FeeCollector.json'; | ||||
| import * as FeeCollectorController from '../test/generated-artifacts/FeeCollectorController.json'; | ||||
| import * as FillQuoteTransformer from '../test/generated-artifacts/FillQuoteTransformer.json'; | ||||
| @@ -101,26 +106,29 @@ import * as MetaTransactionsFeature from '../test/generated-artifacts/MetaTransa | ||||
| import * as MixinAaveV2 from '../test/generated-artifacts/MixinAaveV2.json'; | ||||
| import * as MixinBalancer from '../test/generated-artifacts/MixinBalancer.json'; | ||||
| import * as MixinBalancerV2 from '../test/generated-artifacts/MixinBalancerV2.json'; | ||||
| import * as MixinBalancerV2Batch from '../test/generated-artifacts/MixinBalancerV2Batch.json'; | ||||
| import * as MixinBancor from '../test/generated-artifacts/MixinBancor.json'; | ||||
| import * as MixinCoFiX from '../test/generated-artifacts/MixinCoFiX.json'; | ||||
| import * as MixinBancorV3 from '../test/generated-artifacts/MixinBancorV3.json'; | ||||
| import * as MixinCompound from '../test/generated-artifacts/MixinCompound.json'; | ||||
| import * as MixinCryptoCom from '../test/generated-artifacts/MixinCryptoCom.json'; | ||||
| import * as MixinCurve from '../test/generated-artifacts/MixinCurve.json'; | ||||
| import * as MixinCurveV2 from '../test/generated-artifacts/MixinCurveV2.json'; | ||||
| import * as MixinDodo from '../test/generated-artifacts/MixinDodo.json'; | ||||
| import * as MixinDodoV2 from '../test/generated-artifacts/MixinDodoV2.json'; | ||||
| import * as MixinKyber from '../test/generated-artifacts/MixinKyber.json'; | ||||
| import * as MixinGMX from '../test/generated-artifacts/MixinGMX.json'; | ||||
| import * as MixinKyberDmm from '../test/generated-artifacts/MixinKyberDmm.json'; | ||||
| import * as MixinLido from '../test/generated-artifacts/MixinLido.json'; | ||||
| import * as MixinMakerPSM from '../test/generated-artifacts/MixinMakerPSM.json'; | ||||
| import * as MixinMooniswap from '../test/generated-artifacts/MixinMooniswap.json'; | ||||
| import * as MixinMStable from '../test/generated-artifacts/MixinMStable.json'; | ||||
| import * as MixinNerve from '../test/generated-artifacts/MixinNerve.json'; | ||||
| import * as MixinOasis from '../test/generated-artifacts/MixinOasis.json'; | ||||
| import * as MixinPlatypus from '../test/generated-artifacts/MixinPlatypus.json'; | ||||
| import * as MixinShell from '../test/generated-artifacts/MixinShell.json'; | ||||
| import * as MixinSynthetix from '../test/generated-artifacts/MixinSynthetix.json'; | ||||
| import * as MixinUniswap from '../test/generated-artifacts/MixinUniswap.json'; | ||||
| import * as MixinUniswapV2 from '../test/generated-artifacts/MixinUniswapV2.json'; | ||||
| import * as MixinUniswapV3 from '../test/generated-artifacts/MixinUniswapV3.json'; | ||||
| import * as MixinVelodrome from '../test/generated-artifacts/MixinVelodrome.json'; | ||||
| import * as MixinZeroExBridge from '../test/generated-artifacts/MixinZeroExBridge.json'; | ||||
| import * as MooniswapLiquidityProvider from '../test/generated-artifacts/MooniswapLiquidityProvider.json'; | ||||
| import * as MultiplexFeature from '../test/generated-artifacts/MultiplexFeature.json'; | ||||
| @@ -136,11 +144,13 @@ import * as NativeOrdersInfo from '../test/generated-artifacts/NativeOrdersInfo. | ||||
| import * as NativeOrdersProtocolFees from '../test/generated-artifacts/NativeOrdersProtocolFees.json'; | ||||
| import * as NativeOrdersSettlement from '../test/generated-artifacts/NativeOrdersSettlement.json'; | ||||
| import * as NFTOrders from '../test/generated-artifacts/NFTOrders.json'; | ||||
| import * as OptimismBridgeAdapter from '../test/generated-artifacts/OptimismBridgeAdapter.json'; | ||||
| import * as OtcOrdersFeature from '../test/generated-artifacts/OtcOrdersFeature.json'; | ||||
| import * as OwnableFeature from '../test/generated-artifacts/OwnableFeature.json'; | ||||
| import * as PancakeSwapFeature from '../test/generated-artifacts/PancakeSwapFeature.json'; | ||||
| import * as PayTakerTransformer from '../test/generated-artifacts/PayTakerTransformer.json'; | ||||
| import * as PermissionlessTransformerDeployer from '../test/generated-artifacts/PermissionlessTransformerDeployer.json'; | ||||
| import * as PolygonBridgeAdapter from '../test/generated-artifacts/PolygonBridgeAdapter.json'; | ||||
| import * as PositiveSlippageFeeTransformer from '../test/generated-artifacts/PositiveSlippageFeeTransformer.json'; | ||||
| import * as SimpleFunctionRegistryFeature from '../test/generated-artifacts/SimpleFunctionRegistryFeature.json'; | ||||
| import * as TestBridge from '../test/generated-artifacts/TestBridge.json'; | ||||
| @@ -307,32 +317,42 @@ export const artifacts = { | ||||
|     PositiveSlippageFeeTransformer: PositiveSlippageFeeTransformer as ContractArtifact, | ||||
|     Transformer: Transformer as ContractArtifact, | ||||
|     WethTransformer: WethTransformer as ContractArtifact, | ||||
|     BridgeAdapter: BridgeAdapter as ContractArtifact, | ||||
|     AbstractBridgeAdapter: AbstractBridgeAdapter as ContractArtifact, | ||||
|     AvalancheBridgeAdapter: AvalancheBridgeAdapter as ContractArtifact, | ||||
|     BSCBridgeAdapter: BSCBridgeAdapter as ContractArtifact, | ||||
|     BridgeProtocols: BridgeProtocols as ContractArtifact, | ||||
|     CeloBridgeAdapter: CeloBridgeAdapter as ContractArtifact, | ||||
|     EthereumBridgeAdapter: EthereumBridgeAdapter as ContractArtifact, | ||||
|     FantomBridgeAdapter: FantomBridgeAdapter as ContractArtifact, | ||||
|     IBridgeAdapter: IBridgeAdapter as ContractArtifact, | ||||
|     OptimismBridgeAdapter: OptimismBridgeAdapter as ContractArtifact, | ||||
|     PolygonBridgeAdapter: PolygonBridgeAdapter as ContractArtifact, | ||||
|     MixinAaveV2: MixinAaveV2 as ContractArtifact, | ||||
|     MixinBalancer: MixinBalancer as ContractArtifact, | ||||
|     MixinBalancerV2: MixinBalancerV2 as ContractArtifact, | ||||
|     MixinBalancerV2Batch: MixinBalancerV2Batch as ContractArtifact, | ||||
|     MixinBancor: MixinBancor as ContractArtifact, | ||||
|     MixinCoFiX: MixinCoFiX as ContractArtifact, | ||||
|     MixinBancorV3: MixinBancorV3 as ContractArtifact, | ||||
|     MixinCompound: MixinCompound as ContractArtifact, | ||||
|     MixinCryptoCom: MixinCryptoCom as ContractArtifact, | ||||
|     MixinCurve: MixinCurve as ContractArtifact, | ||||
|     MixinCurveV2: MixinCurveV2 as ContractArtifact, | ||||
|     MixinDodo: MixinDodo as ContractArtifact, | ||||
|     MixinDodoV2: MixinDodoV2 as ContractArtifact, | ||||
|     MixinKyber: MixinKyber as ContractArtifact, | ||||
|     MixinGMX: MixinGMX as ContractArtifact, | ||||
|     MixinKyberDmm: MixinKyberDmm as ContractArtifact, | ||||
|     MixinLido: MixinLido as ContractArtifact, | ||||
|     MixinMStable: MixinMStable as ContractArtifact, | ||||
|     MixinMakerPSM: MixinMakerPSM as ContractArtifact, | ||||
|     MixinMooniswap: MixinMooniswap as ContractArtifact, | ||||
|     MixinNerve: MixinNerve as ContractArtifact, | ||||
|     MixinOasis: MixinOasis as ContractArtifact, | ||||
|     MixinPlatypus: MixinPlatypus as ContractArtifact, | ||||
|     MixinShell: MixinShell as ContractArtifact, | ||||
|     MixinSynthetix: MixinSynthetix as ContractArtifact, | ||||
|     MixinUniswap: MixinUniswap as ContractArtifact, | ||||
|     MixinUniswapV2: MixinUniswapV2 as ContractArtifact, | ||||
|     MixinUniswapV3: MixinUniswapV3 as ContractArtifact, | ||||
|     MixinVelodrome: MixinVelodrome as ContractArtifact, | ||||
|     MixinZeroExBridge: MixinZeroExBridge as ContractArtifact, | ||||
|     IERC1155Token: IERC1155Token as ContractArtifact, | ||||
|     IERC721Token: IERC721Token as ContractArtifact, | ||||
|   | ||||
| @@ -30,7 +30,7 @@ blockchainTests.resets('MetaTransactions feature', env => { | ||||
|     let maker: string; | ||||
|     let sender: string; | ||||
|     let notSigner: string; | ||||
|     let signers: string[]; | ||||
|     const signers: string[] = []; | ||||
|     let zeroEx: IZeroExContract; | ||||
|     let feature: MetaTransactionsFeatureContract; | ||||
|     let feeToken: TestMintableERC20TokenContract; | ||||
| @@ -45,7 +45,8 @@ blockchainTests.resets('MetaTransactions feature', env => { | ||||
|     const REENTRANCY_FLAG_MTX = 0x1; | ||||
|  | ||||
|     before(async () => { | ||||
|         [owner, maker, sender, notSigner, ...signers] = await env.getAccountAddressesAsync(); | ||||
|         let possibleSigners: string[]; | ||||
|         [owner, maker, sender, notSigner, ...possibleSigners] = await env.getAccountAddressesAsync(); | ||||
|         transformERC20Feature = await TestMetaTransactionsTransformERC20FeatureContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.TestMetaTransactionsTransformERC20Feature, | ||||
|             env.provider, | ||||
| @@ -74,20 +75,26 @@ blockchainTests.resets('MetaTransactions feature', env => { | ||||
|             env.txDefaults, | ||||
|             {}, | ||||
|         ); | ||||
|         // Fund signers with fee tokens. | ||||
|         await Promise.all( | ||||
|             signers.map(async signer => { | ||||
|                 await feeToken.mint(signer, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync(); | ||||
|                 await feeToken.approve(zeroEx.address, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync({ from: signer }); | ||||
|             }), | ||||
|         ); | ||||
|  | ||||
|         // some accounts returned can be unfunded | ||||
|         for (const possibleSigner of possibleSigners) { | ||||
|             const balance = await env.web3Wrapper.getBalanceInWeiAsync(possibleSigner); | ||||
|             if (balance.isGreaterThan(0)) { | ||||
|                 signers.push(possibleSigner); | ||||
|                 await feeToken | ||||
|                     .approve(zeroEx.address, MAX_FEE_AMOUNT) | ||||
|                     .awaitTransactionSuccessAsync({ from: possibleSigner }); | ||||
|                 await feeToken.mint(possibleSigner, MAX_FEE_AMOUNT).awaitTransactionSuccessAsync(); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     function getRandomMetaTransaction(fields: Partial<MetaTransactionFields> = {}): MetaTransaction { | ||||
|         return new MetaTransaction({ | ||||
|             signer: _.sampleSize(signers)[0], | ||||
|             sender, | ||||
|             minGasPrice: getRandomInteger('2', '1e9'), | ||||
|             // TODO: dekz Ganache gasPrice opcode is returning 0, cannot influence it up to test this case | ||||
|             minGasPrice: ZERO_AMOUNT, | ||||
|             maxGasPrice: getRandomInteger('1e9', '100e9'), | ||||
|             expirationTimeSeconds: new BigNumber(Math.floor(_.now() / 1000) + 360), | ||||
|             salt: new BigNumber(hexUtils.random()), | ||||
| @@ -145,6 +152,7 @@ blockchainTests.resets('MetaTransactions feature', env => { | ||||
|                 gasPrice: mtx.minGasPrice, | ||||
|                 value: mtx.value, | ||||
|             }; | ||||
|  | ||||
|             const rawResult = await feature.executeMetaTransaction(mtx, signature).callAsync(callOpts); | ||||
|             expect(rawResult).to.eq(RAW_ORDER_SUCCESS_RESULT); | ||||
|             const receipt = await feature.executeMetaTransaction(mtx, signature).awaitTransactionSuccessAsync(callOpts); | ||||
| @@ -434,7 +442,8 @@ blockchainTests.resets('MetaTransactions feature', env => { | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         it('fails if gas price too low', async () => { | ||||
|         // Ganache gasPrice opcode is returning 0, cannot influence it up to test this case | ||||
|         it.skip('fails if gas price too low', async () => { | ||||
|             const mtx = getRandomMetaTransaction(); | ||||
|             const mtxHash = mtx.getHash(); | ||||
|             const signature = await mtx.getSignatureWithProviderAsync(env.provider); | ||||
| @@ -453,7 +462,8 @@ blockchainTests.resets('MetaTransactions feature', env => { | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         it('fails if gas price too high', async () => { | ||||
|         // Ganache gasPrice opcode is returning 0, cannot influence it up to test this case | ||||
|         it.skip('fails if gas price too high', async () => { | ||||
|             const mtx = getRandomMetaTransaction(); | ||||
|             const mtxHash = mtx.getHash(); | ||||
|             const signature = await mtx.getSignatureWithProviderAsync(env.provider); | ||||
|   | ||||
| @@ -938,7 +938,8 @@ blockchainTests.resets('NativeOrdersFeature', env => { | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         it('fails if no protocol fee attached', async () => { | ||||
|         // TODO: dekz Ganache gasPrice opcode is returning 0, cannot influence it up to test this case | ||||
|         it.skip('fails if no protocol fee attached', async () => { | ||||
|             const order = getTestLimitOrder(); | ||||
|             await testUtils.prepareBalancesForOrdersAsync([order]); | ||||
|             const tx = zeroEx | ||||
|   | ||||
| @@ -10,7 +10,8 @@ import { | ||||
|     TestWethContract, | ||||
| } from './wrappers'; | ||||
|  | ||||
| blockchainTests.resets('ProtocolFees', env => { | ||||
| // TODO: dekz Ganache gasPrice opcode is returning 0, cannot influence it up to test this case | ||||
| blockchainTests.resets.skip('ProtocolFees', env => { | ||||
|     const FEE_MULTIPLIER = 70e3; | ||||
|     let taker: string; | ||||
|     let unauthorized: string; | ||||
| @@ -62,7 +63,7 @@ blockchainTests.resets('ProtocolFees', env => { | ||||
|         it('should disallow unauthorized initialization', async () => { | ||||
|             const pool = hexUtils.random(); | ||||
|  | ||||
|             await protocolFees.collectProtocolFee(pool).awaitTransactionSuccessAsync({ value: singleFeeAmount }); | ||||
|             await protocolFees.collectProtocolFee(pool).awaitTransactionSuccessAsync({ value: 1e9 }); | ||||
|             await protocolFees.transferFeesForPool(pool).awaitTransactionSuccessAsync(); | ||||
|  | ||||
|             const feeCollector = new FeeCollectorContract( | ||||
| @@ -89,6 +90,7 @@ blockchainTests.resets('ProtocolFees', env => { | ||||
|             feeCollector2Address = await protocolFees.getFeeCollector(pool2).callAsync(); | ||||
|         }); | ||||
|  | ||||
|         // Ganache gasPrice opcode is returning 0, cannot influence it up to test this case | ||||
|         it('should revert if insufficient ETH transferred', async () => { | ||||
|             const tooLittle = singleFeeAmount.minus(1); | ||||
|             const tx = protocolFees.collectProtocolFee(pool1).awaitTransactionSuccessAsync({ value: tooLittle }); | ||||
|   | ||||
| @@ -28,7 +28,7 @@ import { artifacts } from '../artifacts'; | ||||
| import { TestFillQuoteTransformerBridgeContract } from '../generated-wrappers/test_fill_quote_transformer_bridge'; | ||||
| import { getRandomLimitOrder, getRandomRfqOrder } from '../utils/orders'; | ||||
| import { | ||||
|     BridgeAdapterContract, | ||||
|     EthereumBridgeAdapterContract, | ||||
|     FillQuoteTransformerContract, | ||||
|     TestFillQuoteTransformerExchangeContract, | ||||
|     TestFillQuoteTransformerHostContract, | ||||
| @@ -52,7 +52,8 @@ blockchainTests.resets('FillQuoteTransformer', env => { | ||||
|     let singleProtocolFee: BigNumber; | ||||
|  | ||||
|     const GAS_PRICE = 1337; | ||||
|     const TEST_BRIDGE_SOURCE = hexUtils.random(32); | ||||
|     // Left half is 0, corresponding to BridgeProtocol.Unknown | ||||
|     const TEST_BRIDGE_SOURCE = hexUtils.leftPad(hexUtils.random(16), 32); | ||||
|     const HIGH_BIT = new BigNumber(2).pow(255); | ||||
|     const REVERT_AMOUNT = new BigNumber('0xdeadbeef'); | ||||
|  | ||||
| @@ -64,8 +65,8 @@ blockchainTests.resets('FillQuoteTransformer', env => { | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|         ); | ||||
|         const bridgeAdapter = await BridgeAdapterContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.BridgeAdapter, | ||||
|         const bridgeAdapter = await EthereumBridgeAdapterContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.EthereumBridgeAdapter, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
| @@ -392,6 +393,7 @@ blockchainTests.resets('FillQuoteTransformer', env => { | ||||
|             buyToken: makerToken.address, | ||||
|             bridgeOrders: [], | ||||
|             limitOrders: [], | ||||
|             otcOrders: [], | ||||
|             rfqOrders: [], | ||||
|             fillSequence: [], | ||||
|             fillAmount: MAX_UINT256, | ||||
|   | ||||
| @@ -3,15 +3,20 @@ | ||||
|  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
| export * from '../test/generated-wrappers/abstract_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/affiliate_fee_transformer'; | ||||
| export * from '../test/generated-wrappers/avalanche_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/b_s_c_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/batch_fill_native_orders_feature'; | ||||
| export * from '../test/generated-wrappers/bootstrap_feature'; | ||||
| export * from '../test/generated-wrappers/bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/bridge_protocols'; | ||||
| export * from '../test/generated-wrappers/celo_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/curve_liquidity_provider'; | ||||
| export * from '../test/generated-wrappers/erc1155_orders_feature'; | ||||
| export * from '../test/generated-wrappers/erc165_feature'; | ||||
| export * from '../test/generated-wrappers/erc721_orders_feature'; | ||||
| export * from '../test/generated-wrappers/ethereum_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/fantom_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/fee_collector'; | ||||
| export * from '../test/generated-wrappers/fee_collector_controller'; | ||||
| export * from '../test/generated-wrappers/fill_quote_transformer'; | ||||
| @@ -99,26 +104,29 @@ export * from '../test/generated-wrappers/meta_transactions_feature'; | ||||
| export * from '../test/generated-wrappers/mixin_aave_v2'; | ||||
| export * from '../test/generated-wrappers/mixin_balancer'; | ||||
| export * from '../test/generated-wrappers/mixin_balancer_v2'; | ||||
| export * from '../test/generated-wrappers/mixin_balancer_v2_batch'; | ||||
| export * from '../test/generated-wrappers/mixin_bancor'; | ||||
| export * from '../test/generated-wrappers/mixin_co_fi_x'; | ||||
| export * from '../test/generated-wrappers/mixin_bancor_v3'; | ||||
| export * from '../test/generated-wrappers/mixin_compound'; | ||||
| export * from '../test/generated-wrappers/mixin_crypto_com'; | ||||
| export * from '../test/generated-wrappers/mixin_curve'; | ||||
| export * from '../test/generated-wrappers/mixin_curve_v2'; | ||||
| export * from '../test/generated-wrappers/mixin_dodo'; | ||||
| export * from '../test/generated-wrappers/mixin_dodo_v2'; | ||||
| export * from '../test/generated-wrappers/mixin_kyber'; | ||||
| export * from '../test/generated-wrappers/mixin_g_m_x'; | ||||
| export * from '../test/generated-wrappers/mixin_kyber_dmm'; | ||||
| export * from '../test/generated-wrappers/mixin_lido'; | ||||
| export * from '../test/generated-wrappers/mixin_m_stable'; | ||||
| export * from '../test/generated-wrappers/mixin_maker_p_s_m'; | ||||
| export * from '../test/generated-wrappers/mixin_mooniswap'; | ||||
| export * from '../test/generated-wrappers/mixin_nerve'; | ||||
| export * from '../test/generated-wrappers/mixin_oasis'; | ||||
| export * from '../test/generated-wrappers/mixin_platypus'; | ||||
| export * from '../test/generated-wrappers/mixin_shell'; | ||||
| export * from '../test/generated-wrappers/mixin_synthetix'; | ||||
| export * from '../test/generated-wrappers/mixin_uniswap'; | ||||
| export * from '../test/generated-wrappers/mixin_uniswap_v2'; | ||||
| export * from '../test/generated-wrappers/mixin_uniswap_v3'; | ||||
| export * from '../test/generated-wrappers/mixin_velodrome'; | ||||
| export * from '../test/generated-wrappers/mixin_zero_ex_bridge'; | ||||
| export * from '../test/generated-wrappers/mooniswap_liquidity_provider'; | ||||
| export * from '../test/generated-wrappers/multiplex_feature'; | ||||
| @@ -134,11 +142,13 @@ export * from '../test/generated-wrappers/native_orders_feature'; | ||||
| export * from '../test/generated-wrappers/native_orders_info'; | ||||
| export * from '../test/generated-wrappers/native_orders_protocol_fees'; | ||||
| export * from '../test/generated-wrappers/native_orders_settlement'; | ||||
| export * from '../test/generated-wrappers/optimism_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/otc_orders_feature'; | ||||
| export * from '../test/generated-wrappers/ownable_feature'; | ||||
| export * from '../test/generated-wrappers/pancake_swap_feature'; | ||||
| export * from '../test/generated-wrappers/pay_taker_transformer'; | ||||
| export * from '../test/generated-wrappers/permissionless_transformer_deployer'; | ||||
| export * from '../test/generated-wrappers/polygon_bridge_adapter'; | ||||
| export * from '../test/generated-wrappers/positive_slippage_fee_transformer'; | ||||
| export * from '../test/generated-wrappers/simple_function_registry_feature'; | ||||
| export * from '../test/generated-wrappers/test_bridge'; | ||||
|   | ||||
| @@ -4,9 +4,13 @@ | ||||
|     "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*", "./scripts/**/*"], | ||||
|     "files": [ | ||||
|         "generated-artifacts/AffiliateFeeTransformer.json", | ||||
|         "generated-artifacts/AvalancheBridgeAdapter.json", | ||||
|         "generated-artifacts/BSCBridgeAdapter.json", | ||||
|         "generated-artifacts/BatchFillNativeOrdersFeature.json", | ||||
|         "generated-artifacts/BridgeAdapter.json", | ||||
|         "generated-artifacts/CeloBridgeAdapter.json", | ||||
|         "generated-artifacts/CurveLiquidityProvider.json", | ||||
|         "generated-artifacts/EthereumBridgeAdapter.json", | ||||
|         "generated-artifacts/FantomBridgeAdapter.json", | ||||
|         "generated-artifacts/FeeCollector.json", | ||||
|         "generated-artifacts/FeeCollectorController.json", | ||||
|         "generated-artifacts/FillQuoteTransformer.json", | ||||
| @@ -28,23 +32,30 @@ | ||||
|         "generated-artifacts/MetaTransactionsFeature.json", | ||||
|         "generated-artifacts/MultiplexFeature.json", | ||||
|         "generated-artifacts/NativeOrdersFeature.json", | ||||
|         "generated-artifacts/OptimismBridgeAdapter.json", | ||||
|         "generated-artifacts/OtcOrdersFeature.json", | ||||
|         "generated-artifacts/OwnableFeature.json", | ||||
|         "generated-artifacts/PayTakerTransformer.json", | ||||
|         "generated-artifacts/PolygonBridgeAdapter.json", | ||||
|         "generated-artifacts/PositiveSlippageFeeTransformer.json", | ||||
|         "generated-artifacts/SimpleFunctionRegistryFeature.json", | ||||
|         "generated-artifacts/TransformERC20Feature.json", | ||||
|         "generated-artifacts/WethTransformer.json", | ||||
|         "generated-artifacts/ZeroEx.json", | ||||
|         "test/generated-artifacts/AbstractBridgeAdapter.json", | ||||
|         "test/generated-artifacts/AffiliateFeeTransformer.json", | ||||
|         "test/generated-artifacts/AvalancheBridgeAdapter.json", | ||||
|         "test/generated-artifacts/BSCBridgeAdapter.json", | ||||
|         "test/generated-artifacts/BatchFillNativeOrdersFeature.json", | ||||
|         "test/generated-artifacts/BootstrapFeature.json", | ||||
|         "test/generated-artifacts/BridgeAdapter.json", | ||||
|         "test/generated-artifacts/BridgeProtocols.json", | ||||
|         "test/generated-artifacts/CeloBridgeAdapter.json", | ||||
|         "test/generated-artifacts/CurveLiquidityProvider.json", | ||||
|         "test/generated-artifacts/ERC1155OrdersFeature.json", | ||||
|         "test/generated-artifacts/ERC165Feature.json", | ||||
|         "test/generated-artifacts/ERC721OrdersFeature.json", | ||||
|         "test/generated-artifacts/EthereumBridgeAdapter.json", | ||||
|         "test/generated-artifacts/FantomBridgeAdapter.json", | ||||
|         "test/generated-artifacts/FeeCollector.json", | ||||
|         "test/generated-artifacts/FeeCollectorController.json", | ||||
|         "test/generated-artifacts/FillQuoteTransformer.json", | ||||
| @@ -132,26 +143,29 @@ | ||||
|         "test/generated-artifacts/MixinAaveV2.json", | ||||
|         "test/generated-artifacts/MixinBalancer.json", | ||||
|         "test/generated-artifacts/MixinBalancerV2.json", | ||||
|         "test/generated-artifacts/MixinBalancerV2Batch.json", | ||||
|         "test/generated-artifacts/MixinBancor.json", | ||||
|         "test/generated-artifacts/MixinCoFiX.json", | ||||
|         "test/generated-artifacts/MixinBancorV3.json", | ||||
|         "test/generated-artifacts/MixinCompound.json", | ||||
|         "test/generated-artifacts/MixinCryptoCom.json", | ||||
|         "test/generated-artifacts/MixinCurve.json", | ||||
|         "test/generated-artifacts/MixinCurveV2.json", | ||||
|         "test/generated-artifacts/MixinDodo.json", | ||||
|         "test/generated-artifacts/MixinDodoV2.json", | ||||
|         "test/generated-artifacts/MixinKyber.json", | ||||
|         "test/generated-artifacts/MixinGMX.json", | ||||
|         "test/generated-artifacts/MixinKyberDmm.json", | ||||
|         "test/generated-artifacts/MixinLido.json", | ||||
|         "test/generated-artifacts/MixinMStable.json", | ||||
|         "test/generated-artifacts/MixinMakerPSM.json", | ||||
|         "test/generated-artifacts/MixinMooniswap.json", | ||||
|         "test/generated-artifacts/MixinNerve.json", | ||||
|         "test/generated-artifacts/MixinOasis.json", | ||||
|         "test/generated-artifacts/MixinPlatypus.json", | ||||
|         "test/generated-artifacts/MixinShell.json", | ||||
|         "test/generated-artifacts/MixinSynthetix.json", | ||||
|         "test/generated-artifacts/MixinUniswap.json", | ||||
|         "test/generated-artifacts/MixinUniswapV2.json", | ||||
|         "test/generated-artifacts/MixinUniswapV3.json", | ||||
|         "test/generated-artifacts/MixinVelodrome.json", | ||||
|         "test/generated-artifacts/MixinZeroExBridge.json", | ||||
|         "test/generated-artifacts/MooniswapLiquidityProvider.json", | ||||
|         "test/generated-artifacts/MultiplexFeature.json", | ||||
| @@ -167,11 +181,13 @@ | ||||
|         "test/generated-artifacts/NativeOrdersInfo.json", | ||||
|         "test/generated-artifacts/NativeOrdersProtocolFees.json", | ||||
|         "test/generated-artifacts/NativeOrdersSettlement.json", | ||||
|         "test/generated-artifacts/OptimismBridgeAdapter.json", | ||||
|         "test/generated-artifacts/OtcOrdersFeature.json", | ||||
|         "test/generated-artifacts/OwnableFeature.json", | ||||
|         "test/generated-artifacts/PancakeSwapFeature.json", | ||||
|         "test/generated-artifacts/PayTakerTransformer.json", | ||||
|         "test/generated-artifacts/PermissionlessTransformerDeployer.json", | ||||
|         "test/generated-artifacts/PolygonBridgeAdapter.json", | ||||
|         "test/generated-artifacts/PositiveSlippageFeeTransformer.json", | ||||
|         "test/generated-artifacts/SimpleFunctionRegistryFeature.json", | ||||
|         "test/generated-artifacts/TestBridge.json", | ||||
|   | ||||
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							| @@ -52,16 +52,16 @@ | ||||
|     }, | ||||
|     "config": { | ||||
|         "contractsPackages": "@0x/contracts-erc20 @0x/contracts-test-utils @0x/contracts-utils @0x/contracts-zero-ex @0x/contracts-treasury", | ||||
|         "nonContractPackages": "@0x/migrations @0x/contract-wrappers @0x/contract-addresses @0x/contract-artifacts @0x/contract-wrappers-test @0x/asset-swapper", | ||||
|         "nonContractPackages": "@0x/contract-wrappers @0x/contract-addresses @0x/contract-artifacts @0x/contract-wrappers-test", | ||||
|         "ignoreTestsForPackages": "", | ||||
|         "mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic", | ||||
|         "packagesWithDocPages": "@0x/contract-wrappers @0x/migrations", | ||||
|         "packagesWithDocPages": "@0x/contract-wrappers", | ||||
|         "ignoreDependencyVersions": "@types/styled-components @types/node", | ||||
|         "ignoreDependencyVersionsForPackage": "contract-wrappers" | ||||
|     }, | ||||
|     "devDependencies": { | ||||
|         "@0x/monorepo-scripts": "^3.2.1", | ||||
|         "@0x-lerna-fork/lerna": "3.16.10", | ||||
|         "@0x/monorepo-scripts": "^3.2.4", | ||||
|         "@0xproject/npm-cli-login": "^0.0.11", | ||||
|         "async-child-process": "^1.1.1", | ||||
|         "coveralls": "^3.0.0", | ||||
| @@ -71,10 +71,10 @@ | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "prettier": "1.19.1", | ||||
|         "source-map-support": "^0.5.6", | ||||
|         "typescript": "4.2.2", | ||||
|         "typescript": "4.6.3", | ||||
|         "wsrun": "^5.2.4" | ||||
|     }, | ||||
|     "resolutions": { | ||||
|         "merkle-patricia-tree": "3.0.0" | ||||
|         "**/bignumber.js": "^9.0.2" | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,4 +1,334 @@ | ||||
| [ | ||||
|     { | ||||
|         "version": "16.66.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Offboard Cream", | ||||
|                 "pr": 546 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Change WooFi gas estimates", | ||||
|                 "pr": 551 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1661145612 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1660093941, | ||||
|         "version": "16.66.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.66.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Upgrade dependency", | ||||
|                 "pr": 543 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1660073235 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.66.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Upgrade dependency", | ||||
|                 "pr": 538 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1659926840 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.66.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add WOOFi support", | ||||
|                 "pr": 513 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1659750766 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.65.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Use 0x gas api instead of eth gas station api", | ||||
|                 "pr": 532 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1659391840 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.64.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Refactor `TokenAdjacency` and `TokenAdjacencyBuilder`", | ||||
|                 "pr": 517 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add Synthetix support`", | ||||
|                 "pr": 518 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Replace Beethoven X subgraph URL", | ||||
|                 "pr": 519 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Remove Mooniswap on Ethereum mainnet", | ||||
|                 "pr": 529 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1658950329 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.63.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Better error handling for balancer cache", | ||||
|                 "pr": 515 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1657661207 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.63.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Remove JS router", | ||||
|                 "pr": 480 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Removed Median price in favour of best gas adjusted price", | ||||
|                 "pr": 480 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1656491792 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.62.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Offboard Smoothy and ComethSwap", | ||||
|                 "pr": 509 | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.62.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Remove nUSD from intermediate liquidity to save on sampler gas", | ||||
|                 "pr": 505 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1655253622 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.62.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add MDEX on BSC", | ||||
|                 "pr": 496 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add KnightSwap on BSC", | ||||
|                 "pr": 498 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add Velodrome support on Optimism", | ||||
|                 "pr": 494 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Do not send empty entries on Quote Report", | ||||
|                 "pr": 501 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "KnightSwap/Mdex cosmetic change", | ||||
|                 "pr": 502 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Offboard JetSwap, CafeSwap, JulSwap, and PolyDex", | ||||
|                 "pr": 503 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1655244958 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.61.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add stETH wrap/unwrap support", | ||||
|                 "pr": 476 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Offboard/clean up Oasis, CoFix, and legacy Kyber", | ||||
|                 "pr": 482 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add MeshSwap on Polygon", | ||||
|                 "pr": 491 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1654284040 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.60.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Alias Balancer sor to the old version", | ||||
|                 "pr": 481 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1652931596 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.60.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add BiSwap on BSC", | ||||
|                 "pr": 467 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add GMX and Platypus on Avalanche and Enable KyberDMM on bsc", | ||||
|                 "pr": 478 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add Yoshi Exchange support in Fantom", | ||||
|                 "pr": 473 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Fix KyberDMM gas underestimation", | ||||
|                 "pr": 479 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1652919697 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.59.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Remove SnowSwap on mainnet", | ||||
|                 "pr": 468 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Offboard Swerve Finance and LinkSwap", | ||||
|                 "pr": 469 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Offboard Eth2Dai", | ||||
|                 "pr": 470 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add an optional IRfqClient for SwapQuoter#getSwapQuoteAsync", | ||||
|                 "pr": 467 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1652400434 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.58.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Update Saddle pools on Mainnet", | ||||
|                 "pr": 450 | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.57.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Fix a runtime error related to BalancerV2SwapInfoCache", | ||||
|                 "pr": 472 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1652146864 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.57.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Fix missing AMM quotes on indicative Quote Reports", | ||||
|                 "pr": 466 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1651526551 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.57.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Added QUICK/ANY pair on Polygon", | ||||
|                 "pr": 464 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Added cvxFXS/FXS curve pool on mainnet", | ||||
|                 "pr": 465 | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.57.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add BalancerV2 batch swap support", | ||||
|                 "pr": 462 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1650611093 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.56.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add estimatedGas to ExtendedQuoteReport", | ||||
|                 "pr": 463 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1650575781 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.55.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Fix fillRfqOrder VIP being used for swaps that need transformERC20", | ||||
|                 "pr": 461 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1649347667 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.54.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add true VIP support for eligible RFQt swaps", | ||||
|                 "pr": 458 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1649215576 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.53.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Adds support for STG/USDC pool on Curve Mainnet", | ||||
|                 "pr": 451 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Use neon-router in asset-swapper tests", | ||||
|                 "pr": 453 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add sampler blocknumber to quote report data", | ||||
|                 "pr": 448 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1648739346 | ||||
|     }, | ||||
|     { | ||||
|         "version": "16.52.0", | ||||
|         "changes": [ | ||||
|   | ||||
| @@ -5,6 +5,131 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v16.66.4 - _August 22, 2022_ | ||||
|  | ||||
|     * Offboard Cream (#546) | ||||
|     * Change WooFi gas estimates (#551) | ||||
|  | ||||
| ## v16.66.3 - _August 10, 2022_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v16.66.2 - _August 9, 2022_ | ||||
|  | ||||
|     * Upgrade dependency (#543) | ||||
|  | ||||
| ## v16.66.1 - _August 8, 2022_ | ||||
|  | ||||
|     * Upgrade dependency (#538) | ||||
|  | ||||
| ## v16.66.0 - _August 6, 2022_ | ||||
|  | ||||
|     * Add WOOFi support (#513) | ||||
|  | ||||
| ## v16.65.0 - _August 1, 2022_ | ||||
|  | ||||
|     * Use 0x gas api instead of eth gas station api (#532) | ||||
|  | ||||
| ## v16.64.0 - _July 27, 2022_ | ||||
|  | ||||
|     * Refactor `TokenAdjacency` and `TokenAdjacencyBuilder` (#517) | ||||
|     * Add Synthetix support` (#518) | ||||
|     * Replace Beethoven X subgraph URL (#519) | ||||
|     * Remove Mooniswap on Ethereum mainnet (#529) | ||||
|  | ||||
| ## v16.63.1 - _July 12, 2022_ | ||||
|  | ||||
|     * Better error handling for balancer cache (#515) | ||||
|  | ||||
| ## v16.63.0 - _June 29, 2022_ | ||||
|  | ||||
|     * Remove JS router (#480) | ||||
|     * Removed Median price in favour of best gas adjusted price (#480) | ||||
|  | ||||
| ## v16.62.2 - _Invalid date_ | ||||
|  | ||||
|     * Offboard Smoothy and ComethSwap (#509) | ||||
|  | ||||
| ## v16.62.1 - _June 15, 2022_ | ||||
|  | ||||
|     * Remove nUSD from intermediate liquidity to save on sampler gas (#505) | ||||
|  | ||||
| ## v16.62.0 - _June 14, 2022_ | ||||
|  | ||||
|     * Add MDEX on BSC (#496) | ||||
|     * Add KnightSwap on BSC (#498) | ||||
|     * Add Velodrome support on Optimism (#494) | ||||
|     * Do not send empty entries on Quote Report (#501) | ||||
|     * KnightSwap/Mdex cosmetic change (#502) | ||||
|     * Offboard JetSwap, CafeSwap, JulSwap, and PolyDex (#503) | ||||
|  | ||||
| ## v16.61.0 - _June 3, 2022_ | ||||
|  | ||||
|     * Add stETH wrap/unwrap support (#476) | ||||
|     * Offboard/clean up Oasis, CoFix, and legacy Kyber (#482) | ||||
|     * Add MeshSwap on Polygon (#491) | ||||
|  | ||||
| ## v16.60.1 - _May 19, 2022_ | ||||
|  | ||||
|     * Alias Balancer sor to the old version (#481) | ||||
|  | ||||
| ## v16.60.0 - _May 19, 2022_ | ||||
|  | ||||
|     * Add BiSwap on BSC (#467) | ||||
|     * Add GMX and Platypus on Avalanche and Enable KyberDMM on bsc (#478) | ||||
|     * Add Yoshi Exchange support in Fantom (#473) | ||||
|     * Fix KyberDMM gas underestimation (#479) | ||||
|  | ||||
| ## v16.59.0 - _May 13, 2022_ | ||||
|  | ||||
|     * Remove SnowSwap on mainnet (#468) | ||||
|     * Offboard Swerve Finance and LinkSwap (#469) | ||||
|     * Offboard Eth2Dai (#470) | ||||
|     * Add an optional IRfqClient for SwapQuoter#getSwapQuoteAsync (#467) | ||||
|  | ||||
| ## v16.58.0 - _Invalid date_ | ||||
|  | ||||
|     * Update Saddle pools on Mainnet (#450) | ||||
|  | ||||
| ## v16.57.3 - _May 10, 2022_ | ||||
|  | ||||
|     * Fix a runtime error related to BalancerV2SwapInfoCache (#472) | ||||
|  | ||||
| ## v16.57.2 - _May 2, 2022_ | ||||
|  | ||||
|     * Fix missing AMM quotes on indicative Quote Reports (#466) | ||||
|  | ||||
| ## v16.57.1 - _Invalid date_ | ||||
|  | ||||
|     * Added QUICK/ANY pair on Polygon (#464) | ||||
|     * Added cvxFXS/FXS curve pool on mainnet (#465) | ||||
|  | ||||
| ## v16.57.0 - _April 22, 2022_ | ||||
|  | ||||
|     * Add BalancerV2 batch swap support (#462) | ||||
|  | ||||
| ## v16.56.0 - _April 21, 2022_ | ||||
|  | ||||
|     * Add estimatedGas to ExtendedQuoteReport (#463) | ||||
|  | ||||
| ## v16.55.0 - _April 7, 2022_ | ||||
|  | ||||
|     * Fix fillRfqOrder VIP being used for swaps that need transformERC20 (#461) | ||||
|  | ||||
| ## v16.54.0 - _April 6, 2022_ | ||||
|  | ||||
|     * Add true VIP support for eligible RFQt swaps (#458) | ||||
|  | ||||
| ## v16.53.0 - _March 31, 2022_ | ||||
|  | ||||
|     * Adds support for STG/USDC pool on Curve Mainnet (#451) | ||||
|     * Use neon-router in asset-swapper tests (#453) | ||||
|     * Add sampler blocknumber to quote report data (#448) | ||||
|  | ||||
| ## v16.52.0 - _Invalid date_ | ||||
|  | ||||
|     * Adds support for mobius money on celo (#423) | ||||
|  | ||||
| ## v16.51.0 - _March 10, 2022_ | ||||
|  | ||||
|     * Added `Curve` `YFI-ETH` pool (#444) | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| > :warning: **@0x/asset-swapper has been deprecated!** The `asset-swapper` code has been moved to [0x-api](https://github.com/0xProject/0x-api). Please do not open a PR with `asset-swapper` changes. | ||||
|  | ||||
| ## @0x/asset-swapper | ||||
|  | ||||
| Convenience package for swapping assets represented on the Ethereum blockchain using 0x. The package helps to perform all the off-chain computations to execute a marketBuy or marketSell function execution with 0x exchange contracts, or 0x extension contracts. Given some liquidity (0x signed orders), it helps estimate the cost of buying or selling a certain asset (giving a range) and then provide varying consumable outputs to execute the buy or sell. | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
|     "shouldSaveStandardInput": true, | ||||
|     "compilerSettings": { | ||||
|         "evmVersion": "istanbul", | ||||
|         "optimizer": { "enabled": true, "runs": 200, "details": { "yul": true, "deduplicate": true } }, | ||||
|         "optimizer": { "enabled": true, "runs": 200, "details": { "yul": false, "deduplicate": true } }, | ||||
|         "outputSelection": { | ||||
|             "*": { | ||||
|                 "*": [ | ||||
|   | ||||
							
								
								
									
										105
									
								
								packages/asset-swapper/contracts/src/BalancerV2BatchSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								packages/asset-swapper/contracts/src/BalancerV2BatchSampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| // 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; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IBalancerV2Vault.sol"; | ||||
| import "./BalancerV2Common.sol"; | ||||
|  | ||||
| contract BalancerV2BatchSampler is BalancerV2Common { | ||||
|  | ||||
|     // Replaces amount for first step with each takerTokenAmount and calls queryBatchSwap using supplied steps | ||||
|     /// @dev Sample sell quotes from Balancer V2 supporting multihops. | ||||
|     /// @param swapSteps Array of swap steps (can be >= 1). | ||||
|     /// @param swapAssets Array of token address for swaps. | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||
|     function sampleMultihopSellsFromBalancerV2( | ||||
|         IBalancerV2Vault vault, | ||||
|         IBalancerV2Vault.BatchSwapStep[] memory swapSteps, | ||||
|         address[] memory swapAssets, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|         IBalancerV2Vault.FundManagement memory swapFunds = | ||||
|             _createSwapFunds(); | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             swapSteps[0].amount = takerTokenAmounts[i]; | ||||
|             try | ||||
|                 // For sells we specify the takerToken which is what the vault will receive from the trade | ||||
|                 vault.queryBatchSwap(IBalancerV2Vault.SwapKind.GIVEN_IN, swapSteps, swapAssets, swapFunds) | ||||
|             // amounts represent pool balance deltas from the swap (incoming balance, outgoing balance) | ||||
|             returns (int256[] memory amounts) { | ||||
|                 // Outgoing balance is negative so we need to flip the sign | ||||
|                 // Note - queryBatchSwap will return a delta for each token in the assets array and last asset should be tokenOut | ||||
|                 int256 amountOutFromPool = amounts[amounts.length - 1] * -1; | ||||
|                 if (amountOutFromPool <= 0) { | ||||
|                     break; | ||||
|                 } | ||||
|                 makerTokenAmounts[i] = uint256(amountOutFromPool); | ||||
|             } catch { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Replaces amount for first step with each makerTokenAmount and calls queryBatchSwap using supplied steps | ||||
|     /// @dev Sample buy quotes from Balancer V2 supporting multihops. | ||||
|     /// @param swapSteps Array of swap steps (can be >= 1). | ||||
|     /// @param swapAssets Array of token address for swaps. | ||||
|     /// @param makerTokenAmounts Maker token buy amount for each sample. | ||||
|     function sampleMultihopBuysFromBalancerV2( | ||||
|         IBalancerV2Vault vault, | ||||
|         IBalancerV2Vault.BatchSwapStep[] memory swapSteps, | ||||
|         address[] memory swapAssets, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         returns (uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         uint256 numSamples = makerTokenAmounts.length; | ||||
|         takerTokenAmounts = new uint256[](numSamples); | ||||
|         IBalancerV2Vault.FundManagement memory swapFunds = | ||||
|             _createSwapFunds(); | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             swapSteps[0].amount = makerTokenAmounts[i]; | ||||
|             try | ||||
|                 // Uses GIVEN_OUT type for Buy | ||||
|                 vault.queryBatchSwap(IBalancerV2Vault.SwapKind.GIVEN_OUT, swapSteps, swapAssets, swapFunds) | ||||
|             // amounts represent pool balance deltas from the swap (incoming balance, outgoing balance) | ||||
|             returns (int256[] memory amounts) { | ||||
|                 int256 amountIntoPool = amounts[0]; | ||||
|                 if (amountIntoPool <= 0) { | ||||
|                     break; | ||||
|                 } | ||||
|                 takerTokenAmounts[i] = uint256(amountIntoPool); | ||||
|             } catch { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -18,28 +18,24 @@ | ||||
| */ | ||||
| 
 | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
| 
 | ||||
| import "./interfaces/IBalancerV2Vault.sol"; | ||||
| 
 | ||||
| 
 | ||||
| interface ISmoothy { | ||||
| contract BalancerV2Common { | ||||
| 
 | ||||
|     function getBalance ( | ||||
|         uint256 tid | ||||
|     ) | ||||
|         external | ||||
|     function _createSwapFunds() | ||||
|         internal | ||||
|         view | ||||
|         returns (uint256 balance); | ||||
| 
 | ||||
|     function _yBalances ( | ||||
|         uint256 tid | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 balance); | ||||
| 
 | ||||
|     function getTokenStats ( | ||||
|         uint256 tid | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 softWeight, uint256 hardWeight, uint256 balance, uint256 decimals); | ||||
|         returns (IBalancerV2Vault.FundManagement memory) | ||||
|     { | ||||
|         return | ||||
|             IBalancerV2Vault.FundManagement({ | ||||
|                 sender: address(this), | ||||
|                 fromInternalBalance: false, | ||||
|                 recipient: payable(address(this)), | ||||
|                 toInternalBalance: false | ||||
|             }); | ||||
|     } | ||||
| } | ||||
| @@ -21,44 +21,11 @@ pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./SamplerUtils.sol"; | ||||
| import "./interfaces/IBalancerV2Vault.sol"; | ||||
| import "./BalancerV2Common.sol"; | ||||
|  | ||||
| /// @dev Minimal Balancer V2 Vault interface | ||||
| ///      for documentation refer to https://github.com/balancer-labs/balancer-core-v2/blob/master/contracts/vault/interfaces/IVault.sol | ||||
| interface IBalancerV2Vault { | ||||
|     enum SwapKind { GIVEN_IN, GIVEN_OUT } | ||||
|  | ||||
|     struct BatchSwapStep { | ||||
|         bytes32 poolId; | ||||
|         uint256 assetInIndex; | ||||
|         uint256 assetOutIndex; | ||||
|         uint256 amount; | ||||
|         bytes userData; | ||||
|     } | ||||
|  | ||||
|     struct FundManagement { | ||||
|         address sender; | ||||
|         bool fromInternalBalance; | ||||
|         address payable recipient; | ||||
|         bool toInternalBalance; | ||||
|     } | ||||
|  | ||||
|     function queryBatchSwap( | ||||
|         SwapKind kind, | ||||
|         BatchSwapStep[] calldata swaps, | ||||
|         IAsset[] calldata assets, | ||||
|         FundManagement calldata funds | ||||
|     ) external returns (int256[] memory assetDeltas); | ||||
| } | ||||
| interface IAsset { | ||||
|     // solhint-disable-previous-line no-empty-blocks | ||||
| } | ||||
|  | ||||
| contract BalancerV2Sampler is SamplerUtils { | ||||
|  | ||||
|     struct BalancerV2PoolInfo { | ||||
|         bytes32 poolId; | ||||
|         address vault; | ||||
|     } | ||||
| contract BalancerV2Sampler is SamplerUtils, BalancerV2Common { | ||||
|  | ||||
|     /// @dev Sample sell quotes from Balancer V2. | ||||
|     /// @param poolInfo Struct with pool related data | ||||
| @@ -68,7 +35,7 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||
|     ///         amount. | ||||
|     function sampleSellsFromBalancerV2( | ||||
|         BalancerV2PoolInfo memory poolInfo, | ||||
|         IBalancerV2Vault.BalancerV2PoolInfo memory poolInfo, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
| @@ -78,9 +45,9 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|     { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|         IBalancerV2Vault vault = IBalancerV2Vault(poolInfo.vault); | ||||
|         IAsset[] memory swapAssets = new IAsset[](2); | ||||
|         swapAssets[0] = IAsset(takerToken); | ||||
|         swapAssets[1] = IAsset(makerToken); | ||||
|         address[] memory swapAssets = new address[](2); | ||||
|         swapAssets[0] = takerToken; | ||||
|         swapAssets[1] = makerToken; | ||||
|  | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
| @@ -97,7 +64,7 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|             // amounts represent pool balance deltas from the swap (incoming balance, outgoing balance) | ||||
|             returns (int256[] memory amounts) { | ||||
|                 // Outgoing balance is negative so we need to flip the sign | ||||
|                 int256 amountOutFromPool = amounts[1] * -1; | ||||
|                 int256 amountOutFromPool = amounts[amounts.length - 1] * -1; | ||||
|                 if (amountOutFromPool <= 0) { | ||||
|                     break; | ||||
|                 } | ||||
| @@ -117,7 +84,7 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token | ||||
|     ///         amount. | ||||
|     function sampleBuysFromBalancerV2( | ||||
|         BalancerV2PoolInfo memory poolInfo, | ||||
|         IBalancerV2Vault.BalancerV2PoolInfo memory poolInfo, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory makerTokenAmounts | ||||
| @@ -127,9 +94,9 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|     { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|         IBalancerV2Vault vault = IBalancerV2Vault(poolInfo.vault); | ||||
|         IAsset[] memory swapAssets = new IAsset[](2); | ||||
|         swapAssets[0] = IAsset(takerToken); | ||||
|         swapAssets[1] = IAsset(makerToken); | ||||
|         address[] memory swapAssets = new address[](2); | ||||
|         swapAssets[0] = takerToken; | ||||
|         swapAssets[1] = makerToken; | ||||
|  | ||||
|         uint256 numSamples = makerTokenAmounts.length; | ||||
|         takerTokenAmounts = new uint256[](numSamples); | ||||
| @@ -157,7 +124,7 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|     } | ||||
|  | ||||
|     function _createSwapSteps( | ||||
|         BalancerV2PoolInfo memory poolInfo, | ||||
|         IBalancerV2Vault.BalancerV2PoolInfo memory poolInfo, | ||||
|         uint256 amount | ||||
|     ) private pure returns (IBalancerV2Vault.BatchSwapStep[] memory) { | ||||
|         IBalancerV2Vault.BatchSwapStep[] memory swapSteps = | ||||
| @@ -172,18 +139,4 @@ contract BalancerV2Sampler is SamplerUtils { | ||||
|  | ||||
|         return swapSteps; | ||||
|     } | ||||
|  | ||||
|     function _createSwapFunds() | ||||
|         private | ||||
|         view | ||||
|         returns (IBalancerV2Vault.FundManagement memory) | ||||
|     { | ||||
|         return | ||||
|             IBalancerV2Vault.FundManagement({ | ||||
|                 sender: address(this), | ||||
|                 fromInternalBalance: false, | ||||
|                 recipient: payable(address(this)), | ||||
|                 toInternalBalance: false | ||||
|             }); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -22,9 +22,8 @@ pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IBancor.sol"; | ||||
|  | ||||
| contract CompilerHack {} | ||||
|  | ||||
| contract BancorSampler is CompilerHack { | ||||
| contract BancorSampler { | ||||
|  | ||||
|     /// @dev Base gas limit for Bancor calls. | ||||
|     uint256 constant private BANCOR_CALL_GAS = 300e3; // 300k | ||||
|   | ||||
							
								
								
									
										120
									
								
								packages/asset-swapper/contracts/src/BancorV3Sampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								packages/asset-swapper/contracts/src/BancorV3Sampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 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; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IBancorV3.sol"; | ||||
|  | ||||
|  | ||||
| contract BancorV3Sampler | ||||
| { | ||||
|     /// @dev Gas limit for BancorV3 calls. | ||||
|     uint256 constant private BancorV3_CALL_GAS = 150e3; // 150k | ||||
|  | ||||
|     address constant public ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||
|  | ||||
|     /// @dev Sample sell quotes from BancorV3. | ||||
|     /// @param weth The WETH contract address | ||||
|     /// @param router Router to look up tokens and amounts | ||||
|     /// @param path Token route. Should be takerToken -> makerToken | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||
|     ///         amount. | ||||
|     function sampleSellsFromBancorV3( | ||||
|         address weth, | ||||
|         address router, | ||||
|         address[] memory path, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|  | ||||
|         if(path[0] == weth){ | ||||
|             path[0] = ETH; | ||||
|         } | ||||
|         if(path[1] == weth){ | ||||
|             path[1] = ETH; | ||||
|         } | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             try | ||||
|                 IBancorV3(router).tradeOutputBySourceAmount(path[0], path[1], takerTokenAmounts[i]) | ||||
|                 returns (uint256 amount) | ||||
|             { | ||||
|                 makerTokenAmounts[i] = amount; | ||||
|                 // Break early if there are 0 amounts | ||||
|                 if (makerTokenAmounts[i] == 0) { | ||||
|                     break; | ||||
|                 } | ||||
|             } catch (bytes memory) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample buy quotes from BancorV3. | ||||
|     /// @param weth The WETH contract address | ||||
|     /// @param router Router to look up tokens and amounts | ||||
|     /// @param path Token route. Should be takerToken -> makerToken. | ||||
|     /// @param makerTokenAmounts Maker token buy amount for each sample. | ||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token | ||||
|     ///         amount. | ||||
|     function sampleBuysFromBancorV3( | ||||
|         address weth, | ||||
|         address router, | ||||
|         address[] memory path, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         uint256 numSamples = makerTokenAmounts.length; | ||||
|         takerTokenAmounts = new uint256[](numSamples); | ||||
|  | ||||
|         if(path[0] == weth){ | ||||
|             path[0] = ETH; | ||||
|         } | ||||
|         if(path[1] == weth){ | ||||
|             path[1] = ETH; | ||||
|         } | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             try | ||||
|                 IBancorV3(router).tradeInputByTargetAmount(path[0], path[1], makerTokenAmounts[i]) | ||||
|                 returns (uint256 amount) | ||||
|             { | ||||
|                 takerTokenAmounts[i] = amount; | ||||
|                 // Break early if there are 0 amounts | ||||
|                 if (takerTokenAmounts[i] == 0) { | ||||
|                     break; | ||||
|                 } | ||||
|             } catch (bytes memory) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -22,52 +22,60 @@ pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./BalancerSampler.sol"; | ||||
| import "./BalancerV2Sampler.sol"; | ||||
| import "./BalancerV2BatchSampler.sol"; | ||||
| import "./BancorSampler.sol"; | ||||
| import "./BancorV3Sampler.sol"; | ||||
| import "./CompoundSampler.sol"; | ||||
| import "./CurveSampler.sol"; | ||||
| import "./DODOSampler.sol"; | ||||
| import "./DODOV2Sampler.sol"; | ||||
| import "./KyberSampler.sol"; | ||||
| import "./GMXSampler.sol"; | ||||
| import "./KyberDmmSampler.sol"; | ||||
| import "./LidoSampler.sol"; | ||||
| import "./LiquidityProviderSampler.sol"; | ||||
| import "./MakerPSMSampler.sol"; | ||||
| import "./MultiBridgeSampler.sol"; | ||||
| import "./MStableSampler.sol"; | ||||
| import "./MooniswapSampler.sol"; | ||||
| import "./NativeOrderSampler.sol"; | ||||
| import "./PlatypusSampler.sol"; | ||||
| import "./ShellSampler.sol"; | ||||
| import "./SmoothySampler.sol"; | ||||
| import "./SynthetixSampler.sol"; | ||||
| import "./TwoHopSampler.sol"; | ||||
| import "./UniswapSampler.sol"; | ||||
| import "./UniswapV2Sampler.sol"; | ||||
| import "./UniswapV3Sampler.sol"; | ||||
| import "./VelodromeSampler.sol"; | ||||
| import "./WooPPSampler.sol"; | ||||
| import "./UtilitySampler.sol"; | ||||
|  | ||||
|  | ||||
| contract ERC20BridgeSampler is | ||||
|     BalancerSampler, | ||||
|     BalancerV2Sampler, | ||||
|     BalancerV2BatchSampler, | ||||
|     BancorSampler, | ||||
|     BancorV3Sampler, | ||||
|     CompoundSampler, | ||||
|     CurveSampler, | ||||
|     DODOSampler, | ||||
|     DODOV2Sampler, | ||||
|     KyberSampler, | ||||
|     GMXSampler, | ||||
|     KyberDmmSampler, | ||||
|     LidoSampler, | ||||
|     LiquidityProviderSampler, | ||||
|     MakerPSMSampler, | ||||
|     MStableSampler, | ||||
|     MooniswapSampler, | ||||
|     MultiBridgeSampler, | ||||
|     NativeOrderSampler, | ||||
|     PlatypusSampler, | ||||
|     ShellSampler, | ||||
|     SmoothySampler, | ||||
|     SynthetixSampler, | ||||
|     TwoHopSampler, | ||||
|     UniswapSampler, | ||||
|     UniswapV2Sampler, | ||||
|     UniswapV3Sampler, | ||||
|     VelodromeSampler, | ||||
|     WooPPSampler, | ||||
|     UtilitySampler | ||||
| { | ||||
|  | ||||
| @@ -92,4 +100,6 @@ contract ERC20BridgeSampler is | ||||
|             (callResults[i].success, callResults[i].data) = address(this).call(callDatas[i]); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     receive() external payable {} | ||||
| } | ||||
|   | ||||
							
								
								
									
										96
									
								
								packages/asset-swapper/contracts/src/GMXSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								packages/asset-swapper/contracts/src/GMXSampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IGMX.sol"; | ||||
| import "./ApproximateBuys.sol"; | ||||
| import "./SamplerUtils.sol"; | ||||
|  | ||||
| contract GMXSampler is | ||||
|     SamplerUtils, | ||||
|     ApproximateBuys | ||||
| { | ||||
|     struct GMXInfo { | ||||
|         address reader; | ||||
|         address vault; | ||||
|         address[] path; | ||||
|     } | ||||
|  | ||||
|     function sampleSellsFromGMX( | ||||
|         address reader, | ||||
|         address vault, | ||||
|         address[] memory path, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             try | ||||
|                 IGMX(reader).getAmountOut(IVault(vault), path[0], path[1], takerTokenAmounts[i]) | ||||
|                 returns (uint256 amountAfterFees, uint256 feeAmount) | ||||
|             { | ||||
|                 makerTokenAmounts[i] = amountAfterFees; | ||||
|                 // Break early if there are 0 amounts | ||||
|                 if (makerTokenAmounts[i] == 0) { | ||||
|                     break; | ||||
|                 } | ||||
|             } catch (bytes memory) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function sampleBuysFromGMX( | ||||
|         address reader, | ||||
|         address vault, | ||||
|         address[] memory path, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         address[] memory invertBuyPath = new address[](2); | ||||
|         invertBuyPath[0] = path[1]; | ||||
|         invertBuyPath[1] = path[0]; | ||||
|         return _sampleApproximateBuys( | ||||
|                 ApproximateBuyQuoteOpts({ | ||||
|                     makerTokenData: abi.encode(reader, vault, invertBuyPath), | ||||
|                     takerTokenData: abi.encode(reader, vault, path), | ||||
|                     getSellQuoteCallback: _sampleSellForApproximateBuyFromGMX | ||||
|                 }), | ||||
|                 makerTokenAmounts | ||||
|             ); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     function _sampleSellForApproximateBuyFromGMX( | ||||
|         bytes memory takerTokenData, | ||||
|         bytes memory makerTokenData, | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         private | ||||
|         view | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         (address _reader, address _vault, address[] memory _path ) = abi.decode(takerTokenData, (address, address, address[])); | ||||
|  | ||||
|         (bool success, bytes memory resultData) = address(this).staticcall(abi.encodeWithSelector( | ||||
|             this.sampleSellsFromGMX.selector, | ||||
|             _reader, | ||||
|             _vault, | ||||
|             _path, | ||||
|             _toSingleValueArray(sellAmount) | ||||
|         )); | ||||
|         if(!success) { | ||||
|             return 0; | ||||
|         } | ||||
|         // solhint-disable-next-line indent | ||||
|         return abi.decode(resultData, (uint256[]))[0]; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,301 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IKyberNetwork.sol"; | ||||
| import "./ApproximateBuys.sol"; | ||||
| import "./SamplerUtils.sol"; | ||||
|  | ||||
|  | ||||
| contract KyberSampler is | ||||
|     SamplerUtils, | ||||
|     ApproximateBuys | ||||
| { | ||||
|     /// @dev Gas limit for Kyber calls. | ||||
|     uint256 constant private KYBER_CALL_GAS = 500e3; // 500k | ||||
|     /// @dev Kyber ETH pseudo-address. | ||||
|     address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||
|  | ||||
|     struct KyberSamplerOpts { | ||||
|         uint256 reserveOffset; | ||||
|         address hintHandler; | ||||
|         address networkProxy; | ||||
|         address weth; | ||||
|         bytes hint; | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample sell quotes from Kyber. | ||||
|     /// @param opts KyberSamplerOpts The nth reserve | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||
|     /// @return reserveId The id of the reserve found at reserveOffset | ||||
|     /// @return hint The hint for the selected reserve | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token amount. | ||||
|     function sampleSellsFromKyberNetwork( | ||||
|         KyberSamplerOpts memory opts, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (bytes32 reserveId, bytes memory hint, uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|         reserveId = _getNextReserveId(opts, takerToken, makerToken); | ||||
|         if (reserveId == 0x0) { | ||||
|             return (reserveId, hint, makerTokenAmounts); | ||||
|         } | ||||
|         opts.hint = this.encodeKyberHint(opts, reserveId, takerToken, makerToken); | ||||
|         hint = opts.hint; | ||||
|  | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             uint256 value = this.sampleSellFromKyberNetwork( | ||||
|                 opts, | ||||
|                 takerToken, | ||||
|                 makerToken, | ||||
|                 takerTokenAmounts[i] | ||||
|             ); | ||||
|             makerTokenAmounts[i] = value; | ||||
|             // Break early if there are 0 amounts | ||||
|             if (makerTokenAmounts[i] == 0) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample buy quotes from Kyber. | ||||
|     /// @param opts KyberSamplerOpts The nth reserve | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param makerTokenAmounts Maker token buy amount for each sample. | ||||
|     /// @return reserveId The id of the reserve found at reserveOffset | ||||
|     /// @return hint The hint for the selected reserve | ||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token amount. | ||||
|     function sampleBuysFromKyberNetwork( | ||||
|         KyberSamplerOpts memory opts, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (bytes32 reserveId, bytes memory hint, uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|  | ||||
|         reserveId = _getNextReserveId(opts, takerToken, makerToken); | ||||
|         if (reserveId == 0x0) { | ||||
|             return (reserveId, hint, takerTokenAmounts); | ||||
|         } | ||||
|         opts.hint = this.encodeKyberHint(opts, reserveId, takerToken, makerToken); | ||||
|         hint = opts.hint; | ||||
|  | ||||
|         takerTokenAmounts = _sampleApproximateBuys( | ||||
|             ApproximateBuyQuoteOpts({ | ||||
|                 makerTokenData: abi.encode(makerToken, opts), | ||||
|                 takerTokenData: abi.encode(takerToken, opts), | ||||
|                 getSellQuoteCallback: _sampleSellForApproximateBuyFromKyber | ||||
|             }), | ||||
|             makerTokenAmounts | ||||
|         ); | ||||
|         return (reserveId, hint, takerTokenAmounts); | ||||
|     } | ||||
|  | ||||
|     function encodeKyberHint( | ||||
|         KyberSamplerOpts memory opts, | ||||
|         bytes32 reserveId, | ||||
|         address takerToken, | ||||
|         address makerToken | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (bytes memory hint) | ||||
|     { | ||||
|         // Build a hint selecting the single reserve | ||||
|         IKyberHintHandler kyberHint = IKyberHintHandler(opts.hintHandler); | ||||
|  | ||||
|         // All other reserves should be ignored with this hint | ||||
|         bytes32[] memory selectedReserves = new bytes32[](1); | ||||
|         selectedReserves[0] = reserveId; | ||||
|         uint256[] memory emptySplits = new uint256[](0); | ||||
|  | ||||
|         if (takerToken == opts.weth) { | ||||
|             // ETH to Token | ||||
|             try | ||||
|                 kyberHint.buildEthToTokenHint | ||||
|                     {gas: KYBER_CALL_GAS} | ||||
|                     ( | ||||
|                         makerToken, | ||||
|                         IKyberHintHandler.TradeType.MaskIn, | ||||
|                         selectedReserves, | ||||
|                         emptySplits | ||||
|                     ) | ||||
|                 returns (bytes memory result) | ||||
|             { | ||||
|                 return result; | ||||
|             } catch (bytes memory) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|             } | ||||
|         } else if (makerToken == opts.weth) { | ||||
|             // Token to ETH | ||||
|             try | ||||
|                 kyberHint.buildTokenToEthHint | ||||
|                     {gas: KYBER_CALL_GAS} | ||||
|                     ( | ||||
|                         takerToken, | ||||
|                         IKyberHintHandler.TradeType.MaskIn, | ||||
|                         selectedReserves, | ||||
|                         emptySplits | ||||
|                     ) | ||||
|                 returns (bytes memory result) | ||||
|             { | ||||
|                 return result; | ||||
|             } catch (bytes memory) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|             } | ||||
|  | ||||
|         } else { | ||||
|             // Token to Token | ||||
|             // We use the same reserve both ways | ||||
|             try | ||||
|                 kyberHint.buildTokenToTokenHint | ||||
|                     {gas: KYBER_CALL_GAS} | ||||
|                     ( | ||||
|                         takerToken, | ||||
|                         IKyberHintHandler.TradeType.MaskIn, | ||||
|                         selectedReserves, | ||||
|                         emptySplits, | ||||
|                         makerToken, | ||||
|                         IKyberHintHandler.TradeType.MaskIn, | ||||
|                         selectedReserves, | ||||
|                         emptySplits | ||||
|                     ) | ||||
|                 returns (bytes memory result) | ||||
|             { | ||||
|                 return result; | ||||
|             } catch (bytes memory) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function _sampleSellForApproximateBuyFromKyber( | ||||
|         bytes memory takerTokenData, | ||||
|         bytes memory makerTokenData, | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         private | ||||
|         view | ||||
|         returns (uint256) | ||||
|     { | ||||
|         (address makerToken, KyberSamplerOpts memory opts) = | ||||
|             abi.decode(makerTokenData, (address, KyberSamplerOpts)); | ||||
|         (address takerToken, ) = | ||||
|             abi.decode(takerTokenData, (address, KyberSamplerOpts)); | ||||
|         try | ||||
|             this.sampleSellFromKyberNetwork | ||||
|                 (opts, takerToken, makerToken, sellAmount) | ||||
|             returns (uint256 amount) | ||||
|         { | ||||
|             return amount; | ||||
|         } catch (bytes memory) { | ||||
|             // Swallow failures, leaving all results as zero. | ||||
|             return 0; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function sampleSellFromKyberNetwork( | ||||
|         KyberSamplerOpts memory opts, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256 takerTokenAmount | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256 makerTokenAmount) | ||||
|     { | ||||
|         // If there is no hint do not continue | ||||
|         if (opts.hint.length == 0) { | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         try | ||||
|             IKyberNetworkProxy(opts.networkProxy).getExpectedRateAfterFee | ||||
|                 {gas: KYBER_CALL_GAS} | ||||
|                 ( | ||||
|                     takerToken == opts.weth ? KYBER_ETH_ADDRESS : takerToken, | ||||
|                     makerToken == opts.weth ? KYBER_ETH_ADDRESS : makerToken, | ||||
|                     takerTokenAmount, | ||||
|                     0, // fee | ||||
|                     opts.hint | ||||
|                 ) | ||||
|             returns (uint256 rate) | ||||
|         { | ||||
|             uint256 makerTokenDecimals = _getTokenDecimals(makerToken); | ||||
|             uint256 takerTokenDecimals = _getTokenDecimals(takerToken); | ||||
|             makerTokenAmount = | ||||
|                 rate * | ||||
|                 takerTokenAmount * | ||||
|                 10 ** makerTokenDecimals / | ||||
|                 10 ** takerTokenDecimals / | ||||
|                 10 ** 18; | ||||
|             return makerTokenAmount; | ||||
|         } catch (bytes memory) { | ||||
|             // Swallow failures, leaving all results as zero. | ||||
|             return 0; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function _getNextReserveId( | ||||
|         KyberSamplerOpts memory opts, | ||||
|         address takerToken, | ||||
|         address makerToken | ||||
|     ) | ||||
|         internal | ||||
|         view | ||||
|         returns (bytes32 reserveId) | ||||
|     { | ||||
|         // Fetch the registered reserves for this pair | ||||
|         IKyberHintHandler kyberHint = IKyberHintHandler(opts.hintHandler); | ||||
|         (bytes32[] memory reserveIds, ,) = kyberHint.getTradingReserves( | ||||
|             takerToken == opts.weth ? KYBER_ETH_ADDRESS : takerToken, | ||||
|             makerToken == opts.weth ? KYBER_ETH_ADDRESS : makerToken, | ||||
|             true, | ||||
|             new bytes(0) // empty hint | ||||
|         ); | ||||
|  | ||||
|         if (opts.reserveOffset >= reserveIds.length) { | ||||
|             return 0x0; | ||||
|         } | ||||
|  | ||||
|         reserveId = reserveIds[opts.reserveOffset]; | ||||
|         // Ignore Kyber Bridged Reserves (0xbb) | ||||
|         if (uint256(reserveId >> 248) == 0xbb) { | ||||
|             return 0x0; | ||||
|         } | ||||
|  | ||||
|         return reserveId; | ||||
|     } | ||||
| } | ||||
| @@ -22,10 +22,18 @@ pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./SamplerUtils.sol"; | ||||
|  | ||||
|  | ||||
| interface IWstETH { | ||||
|     function getWstETHByStETH(uint256 _stETHAmount) external view returns (uint256); | ||||
|     function getStETHByWstETH(uint256 _wstETHAmount) external view returns (uint256); | ||||
| } | ||||
|  | ||||
|  | ||||
| contract LidoSampler is SamplerUtils { | ||||
|     struct LidoInfo { | ||||
|         address stEthToken; | ||||
|         address wethToken; | ||||
|         address wstEthToken; | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample sell quotes from Lido | ||||
| @@ -42,20 +50,17 @@ contract LidoSampler is SamplerUtils { | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         pure | ||||
|         view | ||||
|         returns (uint256[] memory) | ||||
|     { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|  | ||||
|         if (takerToken != lidoInfo.wethToken || makerToken != address(lidoInfo.stEthToken)) { | ||||
|             // Return 0 values if not selling WETH for stETH | ||||
|             uint256 numSamples = takerTokenAmounts.length; | ||||
|             uint256[] memory makerTokenAmounts = new uint256[](numSamples); | ||||
|             return makerTokenAmounts; | ||||
|         if (takerToken == lidoInfo.wethToken && makerToken == address(lidoInfo.stEthToken)) { | ||||
|             // Minting stETH is always 1:1 therefore we can just return the same amounts back. | ||||
|             return takerTokenAmounts; | ||||
|         } | ||||
|  | ||||
|         // Minting stETH is always 1:1 therefore we can just return the same amounts back | ||||
|         return takerTokenAmounts; | ||||
|         return _sampleSellsForWrapped(lidoInfo, takerToken, makerToken, takerTokenAmounts); | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample buy quotes from Lido. | ||||
| @@ -72,20 +77,43 @@ contract LidoSampler is SamplerUtils { | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         pure | ||||
|         view | ||||
|         returns (uint256[] memory) | ||||
|     { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|  | ||||
|         if (takerToken != lidoInfo.wethToken || makerToken != address(lidoInfo.stEthToken)) { | ||||
|             // Return 0 values if not buying stETH for WETH | ||||
|             uint256 numSamples = makerTokenAmounts.length; | ||||
|             uint256[] memory takerTokenAmounts = new uint256[](numSamples); | ||||
|             return takerTokenAmounts; | ||||
|         if (takerToken == lidoInfo.wethToken && makerToken == address(lidoInfo.stEthToken)) { | ||||
|             // Minting stETH is always 1:1 therefore we can just return the same amounts back. | ||||
|             return makerTokenAmounts; | ||||
|         } | ||||
|  | ||||
|         // Minting stETH is always 1:1 therefore we can just return the same amounts back | ||||
|         return makerTokenAmounts; | ||||
|         // Swap out `makerToken` and `takerToken` and re-use `_sampleSellsForWrapped`. | ||||
|         return _sampleSellsForWrapped(lidoInfo, makerToken, takerToken, makerTokenAmounts); | ||||
|     } | ||||
|  | ||||
|     function _sampleSellsForWrapped( | ||||
|         LidoInfo memory lidoInfo, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) private view  returns (uint256[] memory) { | ||||
|         IWstETH wstETH = IWstETH(lidoInfo.wstEthToken); | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         uint256[] memory makerTokenAmounts = new uint256[](numSamples); | ||||
|  | ||||
|         if (takerToken == lidoInfo.stEthToken && makerToken == lidoInfo.wstEthToken) { | ||||
|             for (uint256 i = 0; i < numSamples; i++) { | ||||
|                 makerTokenAmounts[i] = wstETH.getWstETHByStETH(takerTokenAmounts[i]); | ||||
|             } | ||||
|             return makerTokenAmounts; | ||||
|         } | ||||
|  | ||||
|         if (takerToken == lidoInfo.wstEthToken && makerToken == lidoInfo.stEthToken) { | ||||
|             for (uint256 i = 0; i < numSamples; i++) { | ||||
|                 makerTokenAmounts[i] = wstETH.getStETHByWstETH(takerTokenAmounts[i]); | ||||
|             } | ||||
|             return makerTokenAmounts; | ||||
|         } | ||||
|  | ||||
|         // Returns 0 values. | ||||
|         return makerTokenAmounts; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,82 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IMultiBridge.sol"; | ||||
|  | ||||
|  | ||||
| contract MultiBridgeSampler { | ||||
|  | ||||
|     /// @dev Default gas limit for multibridge calls. | ||||
|     uint256 constant private DEFAULT_CALL_GAS = 400e3; // 400k | ||||
|  | ||||
|     /// @dev Sample sell quotes from MultiBridge. | ||||
|     /// @param multibridge Address of the MultiBridge contract. | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param intermediateToken The address of the intermediate token to | ||||
|     ///        use in an indirect route. | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||
|     ///         amount. | ||||
|     function sampleSellsFromMultiBridge( | ||||
|         address multibridge, | ||||
|         address takerToken, | ||||
|         address intermediateToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|         // Initialize array of maker token amounts. | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|  | ||||
|         // If no address provided, return all zeros. | ||||
|         if (multibridge == address(0)) { | ||||
|             return makerTokenAmounts; | ||||
|         } | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             (bool didSucceed, bytes memory resultData) = | ||||
|                 multibridge.staticcall.gas(DEFAULT_CALL_GAS)( | ||||
|                     abi.encodeWithSelector( | ||||
|                         IMultiBridge(0).getSellQuote.selector, | ||||
|                         takerToken, | ||||
|                         intermediateToken, | ||||
|                         makerToken, | ||||
|                         takerTokenAmounts[i] | ||||
|                     )); | ||||
|             uint256 buyAmount = 0; | ||||
|             if (didSucceed) { | ||||
|                 buyAmount = abi.decode(resultData, (uint256)); | ||||
|             } | ||||
|             // Exit early if the amount is too high for the source to serve | ||||
|             if (buyAmount == 0) { | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|             makerTokenAmounts[i] = buyAmount; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										89
									
								
								packages/asset-swapper/contracts/src/PlatypusSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								packages/asset-swapper/contracts/src/PlatypusSampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IPlatypus.sol"; | ||||
| import "./ApproximateBuys.sol"; | ||||
| import "./SamplerUtils.sol"; | ||||
|  | ||||
|  | ||||
| contract PlatypusSampler is | ||||
|     SamplerUtils, | ||||
|     ApproximateBuys | ||||
| { | ||||
|  | ||||
|     function sampleSellsFromPlatypus( | ||||
|         address pool, | ||||
|         address[] memory path, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|  | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             try | ||||
|                 IPlatypus(pool).quotePotentialSwap(path[0], path[1], takerTokenAmounts[i]) | ||||
|                 returns (uint256 amountAfterFees, uint256 feeAmount) | ||||
|             { | ||||
|                 makerTokenAmounts[i] = amountAfterFees; | ||||
|                 // Break early if there are 0 amounts | ||||
|                 if (makerTokenAmounts[i] == 0) { | ||||
|                     break; | ||||
|                 } | ||||
|             } catch (bytes memory result) { | ||||
|                 // Swallow failures, leaving all results as zero. | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function sampleBuysFromPlatypus( | ||||
|         address pool, | ||||
|         address[] memory path, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         address[] memory invertBuyPath = new address[](2); | ||||
|         invertBuyPath[0] = path[1]; | ||||
|         invertBuyPath[1] = path[0]; | ||||
|         return _sampleApproximateBuys( | ||||
|                 ApproximateBuyQuoteOpts({ | ||||
|                     makerTokenData: abi.encode(pool, invertBuyPath), | ||||
|                     takerTokenData: abi.encode(pool, path), | ||||
|                     getSellQuoteCallback: _sampleSellForApproximateBuyFromPlatypus | ||||
|                 }), | ||||
|                 makerTokenAmounts | ||||
|             ); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     function _sampleSellForApproximateBuyFromPlatypus( | ||||
|         bytes memory makerTokenData, | ||||
|         bytes memory takerTokenData, | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         private | ||||
|         view | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         (address _pool, address[] memory _path ) = abi.decode(makerTokenData, (address, address[])); | ||||
|  | ||||
|         (bool success, bytes memory resultData) = address(this).staticcall(abi.encodeWithSelector( | ||||
|             this.sampleSellsFromPlatypus.selector, | ||||
|             _pool, | ||||
|             _path, | ||||
|             _toSingleValueArray(sellAmount) | ||||
|         )); | ||||
|         if(!success) { | ||||
|             return 0; | ||||
|         } | ||||
|         // solhint-disable-next-line indent | ||||
|         return abi.decode(resultData, (uint256[]))[0]; | ||||
|     } | ||||
| } | ||||
| @@ -1,156 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| // import "./interfaces/ISmoothy.sol"; | ||||
| import "./ApproximateBuys.sol"; | ||||
| import "./SamplerUtils.sol"; | ||||
| import "./interfaces/ISmoothy.sol"; | ||||
|  | ||||
| contract SmoothySampler is | ||||
|     SamplerUtils, | ||||
|     ApproximateBuys | ||||
| { | ||||
|     /// @dev Information for sampling from smoothy sources. | ||||
|     struct SmoothyInfo { | ||||
|         address poolAddress; | ||||
|         bytes4 sellQuoteFunctionSelector; | ||||
|         bytes4 buyQuoteFunctionSelector; | ||||
|     } | ||||
|  | ||||
|     /// @dev Base gas limit for Smoothy calls. | ||||
|     uint256 constant private SMOOTHY_CALL_GAS = 600e3; | ||||
|  | ||||
|     /// @dev Sample sell quotes from Smoothy. | ||||
|     /// @param smoothyInfo Smoothy information specific to this token pair. | ||||
|     /// @param fromTokenIdx Index of the taker token (what to sell). | ||||
|     /// @param toTokenIdx Index of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||
|     ///         amount. | ||||
|     function sampleSellsFromSmoothy( | ||||
|         SmoothyInfo memory smoothyInfo, | ||||
|         int128 fromTokenIdx, | ||||
|         int128 toTokenIdx, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|     { | ||||
|         // Basically a Curve fork | ||||
|  | ||||
|         // Smoothy only keep a percentage of its tokens available in reserve | ||||
|         uint256 poolReserveMakerAmount = ISmoothy(smoothyInfo.poolAddress).getBalance(uint256(toTokenIdx)) - | ||||
|                                          ISmoothy(smoothyInfo.poolAddress)._yBalances(uint256(toTokenIdx)); | ||||
|         (, , , uint256 decimals) = ISmoothy(smoothyInfo.poolAddress).getTokenStats(uint256(toTokenIdx)); | ||||
|         poolReserveMakerAmount = poolReserveMakerAmount/(10**(18-decimals)); | ||||
|  | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             (bool didSucceed, bytes memory resultData) = | ||||
|                 smoothyInfo.poolAddress.staticcall.gas(SMOOTHY_CALL_GAS)( | ||||
|                     abi.encodeWithSelector( | ||||
|                         smoothyInfo.sellQuoteFunctionSelector, | ||||
|                         fromTokenIdx, | ||||
|                         toTokenIdx, | ||||
|                         takerTokenAmounts[i] | ||||
|                     )); | ||||
|             uint256 buyAmount = 0; | ||||
|             if (didSucceed) { | ||||
|                 buyAmount = abi.decode(resultData, (uint256)); | ||||
|             } | ||||
|  | ||||
|             // Make sure the quoted buyAmount is available in the pool reserve | ||||
|             if (buyAmount >= poolReserveMakerAmount) { | ||||
|                 // Assign pool reserve amount for all higher samples to break early | ||||
|                 for (uint256 j = i; j < numSamples; j++) { | ||||
|                     makerTokenAmounts[j] = poolReserveMakerAmount; | ||||
|                 } | ||||
|                 break; | ||||
|             } else { | ||||
|                 makerTokenAmounts[i] = buyAmount; | ||||
|             } | ||||
|  | ||||
|             // Break early if there are 0 amounts | ||||
|             if (makerTokenAmounts[i] == 0) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample buy quotes from Smoothy. | ||||
|     /// @param smoothyInfo Smoothy information specific to this token pair. | ||||
|     /// @param fromTokenIdx Index of the taker token (what to sell). | ||||
|     /// @param toTokenIdx Index of the maker token (what to buy). | ||||
|     /// @param makerTokenAmounts Maker token buy amount for each sample. | ||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token | ||||
|     ///         amount. | ||||
|     function sampleBuysFromSmoothy( | ||||
|         SmoothyInfo memory smoothyInfo, | ||||
|         int128 fromTokenIdx, | ||||
|         int128 toTokenIdx, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         // Buys not supported so approximate it. | ||||
|         return _sampleApproximateBuys( | ||||
|             ApproximateBuyQuoteOpts({ | ||||
|                 makerTokenData: abi.encode(toTokenIdx, smoothyInfo), | ||||
|                 takerTokenData: abi.encode(fromTokenIdx, smoothyInfo), | ||||
|                 getSellQuoteCallback: _sampleSellForApproximateBuyFromSmoothy | ||||
|             }), | ||||
|             makerTokenAmounts | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function _sampleSellForApproximateBuyFromSmoothy( | ||||
|         bytes memory takerTokenData, | ||||
|         bytes memory makerTokenData, | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         private | ||||
|         view | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         (int128 takerTokenIdx, SmoothyInfo memory smoothyInfo) = | ||||
|             abi.decode(takerTokenData, (int128, SmoothyInfo)); | ||||
|         (int128 makerTokenIdx) = | ||||
|             abi.decode(makerTokenData, (int128)); | ||||
|         (bool success, bytes memory resultData) = | ||||
|             address(this).staticcall(abi.encodeWithSelector( | ||||
|                 this.sampleSellsFromSmoothy.selector, | ||||
|                 smoothyInfo, | ||||
|                 takerTokenIdx, | ||||
|                 makerTokenIdx, | ||||
|                 _toSingleValueArray(sellAmount) | ||||
|             )); | ||||
|         if (!success) { | ||||
|             return 0; | ||||
|         } | ||||
|         // solhint-disable-next-line indent | ||||
|         return abi.decode(resultData, (uint256[]))[0]; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										173
									
								
								packages/asset-swapper/contracts/src/SynthetixSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								packages/asset-swapper/contracts/src/SynthetixSampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 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; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| interface IReadProxyAddressResolver { | ||||
|     function target() external view returns (address); | ||||
| } | ||||
|  | ||||
| interface IAddressResolver { | ||||
|     function getAddress(bytes32 name) external view returns (address); | ||||
| } | ||||
|  | ||||
| interface IExchanger { | ||||
|     // Ethereum Mainnet | ||||
|     function getAmountsForAtomicExchange( | ||||
|         uint256 sourceAmount, | ||||
|         bytes32 sourceCurrencyKey, | ||||
|         bytes32 destinationCurrencyKey | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns ( | ||||
|             uint256 amountReceived, | ||||
|             uint256 fee, | ||||
|             uint256 exchangeFeeRate | ||||
|         ); | ||||
|  | ||||
|     // Optimism | ||||
|     function getAmountsForExchange( | ||||
|         uint256 sourceAmount, | ||||
|         bytes32 sourceCurrencyKey, | ||||
|         bytes32 destinationCurrencyKey | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns ( | ||||
|             uint256 amountReceived, | ||||
|             uint256 fee, | ||||
|             uint256 exchangeFeeRate | ||||
|         ); | ||||
| } | ||||
|  | ||||
| contract SynthetixSampler { | ||||
|  | ||||
|     /// @dev Sample sell quotes from Synthetix Atomic Swap. | ||||
|     /// @param takerTokenSymbol Symbol (currency key) of the taker token (what to sell). | ||||
|     /// @param makerTokenSymbol Symbol (currency key) of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample (sorted in ascending order). | ||||
|     /// @return synthetix Synthetix address. | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token amount. | ||||
|     function sampleSellsFromSynthetix( | ||||
|         IReadProxyAddressResolver readProxy, | ||||
|         bytes32 takerTokenSymbol, | ||||
|         bytes32 makerTokenSymbol, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) public view returns (address synthetix, uint256[] memory makerTokenAmounts) { | ||||
|         synthetix = getSynthetixAddress(readProxy); | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|         if (numSamples == 0) { | ||||
|             return (synthetix, makerTokenAmounts); | ||||
|         } | ||||
|  | ||||
|         makerTokenAmounts[0] = exchange( | ||||
|             readProxy, | ||||
|             takerTokenAmounts[0], | ||||
|             takerTokenSymbol, | ||||
|             makerTokenSymbol | ||||
|         ); | ||||
|  | ||||
|         // Synthetix atomic swap has a fixed rate. Calculate the rest based on the first value (and save gas). | ||||
|         for (uint256 i = 1; i < numSamples; i++) { | ||||
|             makerTokenAmounts[i] = | ||||
|                 (makerTokenAmounts[0] * takerTokenAmounts[i]) / | ||||
|                 takerTokenAmounts[0]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample buy quotes from Synthetix Atomic Swap. | ||||
|     /// @param takerTokenSymbol Symbol (currency key) of the taker token (what to sell). | ||||
|     /// @param makerTokenSymbol Symbol (currency key) of the maker token (what to buy). | ||||
|     /// @param makerTokenAmounts Maker token buy amount for each sample (sorted in ascending order). | ||||
|     /// @return synthetix Synthetix address. | ||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token amount. | ||||
|     function sampleBuysFromSynthetix( | ||||
|         IReadProxyAddressResolver readProxy, | ||||
|         bytes32 takerTokenSymbol, | ||||
|         bytes32 makerTokenSymbol, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) public view returns (address synthetix, uint256[] memory takerTokenAmounts) { | ||||
|         synthetix = getSynthetixAddress(readProxy); | ||||
|         // Since Synthetix atomic have a fixed rate, we can pick any reasonablely size takerTokenAmount (fixed to 1 ether here) and calculate the rest. | ||||
|         uint256 amountReceivedForEther = exchange( | ||||
|             readProxy, | ||||
|             1 ether, | ||||
|             takerTokenSymbol, | ||||
|             makerTokenSymbol | ||||
|         ); | ||||
|  | ||||
|         uint256 numSamples = makerTokenAmounts.length; | ||||
|         takerTokenAmounts = new uint256[](numSamples); | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             takerTokenAmounts[i] = | ||||
|                 (1 ether * makerTokenAmounts[i]) / | ||||
|                 amountReceivedForEther; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function exchange( | ||||
|         IReadProxyAddressResolver readProxy, | ||||
|         uint256 sourceAmount, | ||||
|         bytes32 sourceCurrencyKey, | ||||
|         bytes32 destinationCurrencyKey | ||||
|     ) private view returns (uint256 amountReceived) { | ||||
|         IExchanger exchanger = getExchanger(readProxy); | ||||
|         uint256 chainId; | ||||
|         assembly { | ||||
|             chainId := chainid() | ||||
|         } | ||||
|  | ||||
|         if (chainId == 1) { | ||||
|             (amountReceived, , ) = exchanger.getAmountsForAtomicExchange( | ||||
|                 sourceAmount, | ||||
|                 sourceCurrencyKey, | ||||
|                 destinationCurrencyKey | ||||
|             ); | ||||
|         } else { | ||||
|             (amountReceived, , ) = exchanger.getAmountsForExchange( | ||||
|                 sourceAmount, | ||||
|                 sourceCurrencyKey, | ||||
|                 destinationCurrencyKey | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function getSynthetixAddress(IReadProxyAddressResolver readProxy) | ||||
|         private | ||||
|         view | ||||
|         returns (address) | ||||
|     { | ||||
|         return IAddressResolver(readProxy.target()).getAddress("Synthetix"); | ||||
|     } | ||||
|  | ||||
|     function getExchanger(IReadProxyAddressResolver readProxy) | ||||
|         private | ||||
|         view | ||||
|         returns (IExchanger) | ||||
|     { | ||||
|         return | ||||
|             IExchanger( | ||||
|                 IAddressResolver(readProxy.target()).getAddress("Exchanger") | ||||
|             ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										134
									
								
								packages/asset-swapper/contracts/src/VelodromeSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								packages/asset-swapper/contracts/src/VelodromeSampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 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; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import './ApproximateBuys.sol'; | ||||
| import './SamplerUtils.sol'; | ||||
|  | ||||
| struct VeloRoute { | ||||
|     address from; | ||||
|     address to; | ||||
|     bool stable; | ||||
| } | ||||
|  | ||||
| interface IVelodromeRouter { | ||||
|     function getAmountOut( | ||||
|         uint256 amountIn, | ||||
|         address tokenIn, | ||||
|         address tokenOut | ||||
|     ) external view returns (uint256 amount, bool stable); | ||||
|  | ||||
|     function getAmountsOut(uint256 amountIn, VeloRoute[] calldata routes) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256[] memory amounts); | ||||
| } | ||||
|  | ||||
| contract VelodromeSampler is SamplerUtils, ApproximateBuys { | ||||
|     /// @dev Sample sell quotes from Velodrome | ||||
|     /// @param router Address of Velodrome router. | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample (sorted in ascending order). | ||||
|     /// @return stable Whether the pool is a stable pool (vs volatile). | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token amount. | ||||
|     function sampleSellsFromVelodrome( | ||||
|         IVelodromeRouter router, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) public view returns (bool stable, uint256[] memory makerTokenAmounts) { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         makerTokenAmounts = new uint256[](numSamples); | ||||
|  | ||||
|         // Sampling should not mix stable and volatile pools. | ||||
|         // Find the most liquid pool based on max(takerTokenAmounts) and stick with it. | ||||
|         stable = _isMostLiquidPoolStablePool(router, takerToken, makerToken, takerTokenAmounts); | ||||
|         VeloRoute[] memory routes = new VeloRoute[](1); | ||||
|         routes[0] = VeloRoute({ from: takerToken, to: makerToken, stable: stable }); | ||||
|  | ||||
|         for (uint256 i = 0; i < numSamples; i++) { | ||||
|             makerTokenAmounts[i] = router.getAmountsOut(takerTokenAmounts[i], routes)[1]; | ||||
|             // Break early if there are 0 amounts | ||||
|             if (makerTokenAmounts[i] == 0) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample buy quotes from Velodrome. | ||||
|     /// @param router Address of Velodrome router. | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param makerTokenAmounts Maker token buy amount for each sample. | ||||
|     /// @return stable Whether the pool is a stable pool (vs volatile). | ||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token amount. | ||||
|     function sampleBuysFromVelodrome( | ||||
|         IVelodromeRouter router, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) public view returns (bool stable, uint256[] memory takerTokenAmounts) { | ||||
|         _assertValidPair(makerToken, takerToken); | ||||
|  | ||||
|         // Sampling should not mix stable and volatile pools. | ||||
|         // Find the most liquid pool based on the reverse swap (maker -> taker) and stick with it. | ||||
|         stable = _isMostLiquidPoolStablePool(router, makerToken, takerToken, makerTokenAmounts); | ||||
|  | ||||
|         takerTokenAmounts = _sampleApproximateBuys( | ||||
|             ApproximateBuyQuoteOpts({ | ||||
|                 takerTokenData: abi.encode(router, VeloRoute({ from: takerToken, to: makerToken, stable: stable })), | ||||
|                 makerTokenData: abi.encode(router, VeloRoute({ from: makerToken, to: takerToken, stable: stable })), | ||||
|                 getSellQuoteCallback: _sampleSellForApproximateBuyFromVelodrome | ||||
|             }), | ||||
|             makerTokenAmounts | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function _sampleSellForApproximateBuyFromVelodrome( | ||||
|         bytes memory takerTokenData, | ||||
|         bytes memory, /* makerTokenData */ | ||||
|         uint256 sellAmount | ||||
|     ) internal view returns (uint256) { | ||||
|         (IVelodromeRouter router, VeloRoute memory route) = abi.decode(takerTokenData, (IVelodromeRouter, VeloRoute)); | ||||
|  | ||||
|         VeloRoute[] memory routes = new VeloRoute[](1); | ||||
|         routes[0] = route; | ||||
|         return router.getAmountsOut(sellAmount, routes)[1]; | ||||
|     } | ||||
|  | ||||
|     /// @dev Returns whether the most liquid pool is a stable pool. | ||||
|     /// @param router Address of Velodrome router. | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token buy amount for each sample (sorted in ascending order) | ||||
|     /// @return stable Whether the pool is a stable pool (vs volatile). | ||||
|     function _isMostLiquidPoolStablePool( | ||||
|         IVelodromeRouter router, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) internal view returns (bool stable) { | ||||
|         uint256 numSamples = takerTokenAmounts.length; | ||||
|         (, stable) = router.getAmountOut(takerTokenAmounts[numSamples - 1], takerToken, makerToken); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										121
									
								
								packages/asset-swapper/contracts/src/WooPPSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								packages/asset-swapper/contracts/src/WooPPSampler.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| // SPDX-License-Identifier: UNLICENSED | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
| import "./SamplerUtils.sol"; | ||||
| import "./ApproximateBuys.sol"; | ||||
|  | ||||
| interface IWooPP { | ||||
|     /// @dev get the quote token address (immutable) | ||||
|     /// @return address of quote token | ||||
|     function quoteToken() external view returns (address); | ||||
|  | ||||
|     /// @dev Query the amount for selling the base token amount. | ||||
|     /// @param baseToken the base token to sell | ||||
|     /// @param baseAmount the amount to sell | ||||
|     /// @return quoteAmount the swapped quote amount | ||||
|     function querySellBase(address baseToken, uint256 baseAmount) external view returns (uint256 quoteAmount); | ||||
|  | ||||
|     /// @dev Query the amount for selling the quote token. | ||||
|     /// @param baseToken the base token to receive (buy) | ||||
|     /// @param quoteAmount the amount to sell | ||||
|     /// @return baseAmount the swapped base token amount | ||||
|     function querySellQuote(address baseToken, uint256 quoteAmount) external view returns (uint256 baseAmount); | ||||
| } | ||||
|  | ||||
| contract WooPPSampler is SamplerUtils, ApproximateBuys{ | ||||
|  | ||||
|    function query( | ||||
|         uint amountIn,  | ||||
|         address tokenIn,  | ||||
|         address tokenOut, | ||||
|         address pool | ||||
|     ) internal view returns (uint256 amountOut) { | ||||
|         if (amountIn == 0) {  | ||||
|             return 0;  | ||||
|         } | ||||
|         address quoteToken = IWooPP(pool).quoteToken(); | ||||
|         if (tokenIn == quoteToken) { | ||||
|             amountOut = IWooPP(pool).querySellQuote(tokenOut, amountIn); | ||||
|         } else if (tokenOut == quoteToken) { | ||||
|             amountOut = IWooPP(pool).querySellBase(tokenIn, amountIn); | ||||
|         } else { | ||||
|             uint quoteAmount = IWooPP(pool).querySellBase(tokenIn, amountIn); | ||||
|             amountOut = IWooPP(pool).querySellQuote(tokenOut, quoteAmount); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sample sell quotes from WooFI. | ||||
|     /// @param pool Address of the pool we are sampling from | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample (sorted in ascending order). | ||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||
|     ///         amount. | ||||
|     function sampleSellsFromWooPP( | ||||
|         address pool, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory takerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory makerTokenAmounts) | ||||
|         { | ||||
|             uint256 numSamples = takerTokenAmounts.length; | ||||
|             makerTokenAmounts = new uint256[](numSamples); | ||||
|             for (uint256 i = 0; i < numSamples; i++) { | ||||
|                 makerTokenAmounts[i] = query(takerTokenAmounts[i], takerToken, makerToken, pool); | ||||
|  | ||||
|                 if (makerTokenAmounts[i] == 0) { | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     /// @dev Sample buy quotes from WooFI. | ||||
|     /// @param pool Address of the pool we are sampling from | ||||
|     /// @param takerToken Address of the taker token (what to sell). | ||||
|     /// @param makerToken Address of the maker token (what to buy). | ||||
|     /// @param makerTokenAmounts Maker token sell amount for each sample (sorted in ascending order). | ||||
|     /// @return takerTokenAmounts Taker amounts bought at each taker token | ||||
|     ///         amount. | ||||
|     function sampleBuysFromWooPP( | ||||
|         address pool, | ||||
|         address takerToken, | ||||
|         address makerToken, | ||||
|         uint256[] memory makerTokenAmounts | ||||
|     ) | ||||
|         public | ||||
|         view | ||||
|         returns (uint256[] memory takerTokenAmounts) | ||||
|     { | ||||
|         uint256 numSamples = makerTokenAmounts.length; | ||||
|         takerTokenAmounts = _sampleApproximateBuys( | ||||
|             ApproximateBuyQuoteOpts({ | ||||
|                 takerTokenData: abi.encode(pool,takerToken, makerToken), | ||||
|                 makerTokenData: abi.encode(pool, makerToken, takerToken), | ||||
|                 getSellQuoteCallback: _sampleSellForApproximateBuyFromWoofi | ||||
|             }), | ||||
|             makerTokenAmounts | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function _sampleSellForApproximateBuyFromWoofi( | ||||
|         bytes memory takerTokenData, | ||||
|         bytes memory makerTokenData, | ||||
|         uint256 sellAmount | ||||
|     ) internal view returns (uint256) { | ||||
|         (address _pool, address _takerToken, address _makerToken) = abi.decode(takerTokenData, (address, address, address)); | ||||
|         (bool success, bytes memory resultData) = address(this).staticcall(abi.encodeWithSelector( | ||||
|             this.sampleSellsFromWooPP.selector, | ||||
|             _pool, | ||||
|             _takerToken, | ||||
|             _makerToken, | ||||
|             _toSingleValueArray(sellAmount) | ||||
|         )); | ||||
|         if(!success) { | ||||
|             return 0; | ||||
|         } | ||||
|         return abi.decode(resultData, (uint256[]))[0]; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| /// @dev Minimal Balancer V2 Vault interface | ||||
| ///      for documentation refer to https://github.com/balancer-labs/balancer-core-v2/blob/master/contracts/vault/interfaces/IVault.sol | ||||
| interface IBalancerV2Vault { | ||||
|     enum SwapKind { GIVEN_IN, GIVEN_OUT } | ||||
|  | ||||
|     struct BatchSwapStep { | ||||
|         bytes32 poolId; | ||||
|         uint256 assetInIndex; | ||||
|         uint256 assetOutIndex; | ||||
|         uint256 amount; | ||||
|         bytes userData; | ||||
|     } | ||||
|  | ||||
|     struct FundManagement { | ||||
|         address sender; | ||||
|         bool fromInternalBalance; | ||||
|         address payable recipient; | ||||
|         bool toInternalBalance; | ||||
|     } | ||||
|  | ||||
|     struct BalancerV2PoolInfo { | ||||
|         bytes32 poolId; | ||||
|         address vault; | ||||
|     } | ||||
|  | ||||
|     function queryBatchSwap( | ||||
|         SwapKind kind, | ||||
|         BatchSwapStep[] calldata swaps, | ||||
|         address[] calldata assets, | ||||
|         FundManagement calldata funds | ||||
|     ) external returns (int256[] memory assetDeltas); | ||||
| } | ||||
| @@ -0,0 +1,43 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2022 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; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| interface IBancorV3 { | ||||
|  | ||||
|     /** | ||||
|      * @dev returns the output amount when trading by providing the source amount | ||||
|      */ | ||||
|     function tradeOutputBySourceAmount( | ||||
|         address sourceToken, | ||||
|         address targetToken, | ||||
|         uint256 sourceAmount | ||||
|     ) external view returns (uint256); | ||||
|  | ||||
|     /** | ||||
|      * @dev returns the input amount when trading by providing the target amount | ||||
|      */ | ||||
|     function tradeInputByTargetAmount( | ||||
|         address sourceToken, | ||||
|         address targetToken, | ||||
|         uint256 targetAmount | ||||
|     ) external view returns (uint256); | ||||
|  | ||||
| } | ||||
							
								
								
									
										23
									
								
								packages/asset-swapper/contracts/src/interfaces/IGMX.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								packages/asset-swapper/contracts/src/interfaces/IGMX.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| interface IGMX { | ||||
|     function getMaxAmountIn(IVault _vault, address _tokenIn, address _tokenOut) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256); | ||||
|  | ||||
|     function getAmountOut(IVault _vault, address _tokenIn, address _tokenOut, uint256 _amountIn) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256, uint256); | ||||
| } | ||||
|  | ||||
| interface IVault { | ||||
|     function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256); | ||||
|     function stableSwapFeeBasisPoints() external view returns (uint256); | ||||
|     function stableTokens(address _token) external view returns (bool); | ||||
|     function tokenDecimals(address _token) external view returns (uint256); | ||||
|     function getMaxPrice(address _token) external view returns (uint256); | ||||
|     function getMinPrice(address _token) external view returns (uint256); | ||||
| } | ||||
| @@ -1,96 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6; | ||||
|  | ||||
| // Keepin everything together | ||||
| interface IKyberNetwork { | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| interface IKyberNetworkProxy { | ||||
|  | ||||
|     function getExpectedRateAfterFee( | ||||
|         address src, | ||||
|         address dest, | ||||
|         uint256 srcQty, | ||||
|         uint256 platformFeeBps, | ||||
|         bytes calldata hint | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 expectedRate); | ||||
| } | ||||
|  | ||||
| interface IKyberHintHandler { | ||||
|  | ||||
|     enum TradeType {BestOfAll, MaskIn, MaskOut, Split} | ||||
|  | ||||
|     enum ProcessWithRate {NotRequired, Required} | ||||
|  | ||||
|     function getTradingReserves( | ||||
|         address tokenSrc, | ||||
|         address tokenDest, | ||||
|         bool isTokenToToken, | ||||
|         bytes calldata hint | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns ( | ||||
|             bytes32[] memory reserveIds, | ||||
|             uint256[] memory splitValuesBps, | ||||
|             ProcessWithRate processWithRate | ||||
|         ); | ||||
|  | ||||
|     function buildTokenToEthHint( | ||||
|         address tokenSrc, | ||||
|         TradeType tokenToEthType, | ||||
|         bytes32[] calldata tokenToEthReserveIds, | ||||
|         uint256[] calldata tokenToEthSplits | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (bytes memory hint); | ||||
|  | ||||
|     function buildEthToTokenHint( | ||||
|         address tokenDest, | ||||
|         TradeType ethToTokenType, | ||||
|         bytes32[] calldata ethToTokenReserveIds, | ||||
|         uint256[] calldata ethToTokenSplits | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (bytes memory hint); | ||||
|  | ||||
|     function buildTokenToTokenHint( | ||||
|         address tokenSrc, | ||||
|         TradeType tokenToEthType, | ||||
|         bytes32[] calldata tokenToEthReserveIds, | ||||
|         uint256[] calldata tokenToEthSplits, | ||||
|         address tokenDest, | ||||
|         TradeType ethToTokenType, | ||||
|         bytes32[] calldata ethToTokenReserveIds, | ||||
|         uint256[] calldata ethToTokenSplits | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (bytes memory hint); | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| pragma solidity ^0.6; | ||||
|  | ||||
| interface IPlatypus { | ||||
|     function quotePotentialSwap( | ||||
|         address fromToken, | ||||
|         address toToken, | ||||
|         uint256 fromAmount | ||||
|     ) external view returns (uint256 potentialOutcome, uint256 haircut); | ||||
|  | ||||
|     function assetOf(address token) external view returns (address); | ||||
| } | ||||
| @@ -1,39 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
|  | ||||
| contract DummyLiquidityProvider | ||||
| { | ||||
|     /// @dev Quotes the amount of `makerToken` that would be obtained by | ||||
|     ///      selling `sellAmount` of `takerToken`. | ||||
|     /// @param sellAmount Amount of `takerToken` to sell. | ||||
|     /// @return makerTokenAmount Amount of `makerToken` that would be obtained. | ||||
|     function getSellQuote( | ||||
|         address, /* takerToken */ | ||||
|         address, /* makerToken */ | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 makerTokenAmount) | ||||
|     { | ||||
|         makerTokenAmount = sellAmount - 1; | ||||
|     } | ||||
|  | ||||
|     /// @dev Quotes the amount of `takerToken` that would need to be sold in | ||||
|     ///      order to obtain `buyAmount` of `makerToken`. | ||||
|     /// @param buyAmount Amount of `makerToken` to buy. | ||||
|     /// @return takerTokenAmount Amount of `takerToken` that would need to be sold. | ||||
|     function getBuyQuote( | ||||
|         address, /* takerToken */ | ||||
|         address, /* makerToken */ | ||||
|         uint256 buyAmount | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 takerTokenAmount) | ||||
|     { | ||||
|         takerTokenAmount = buyAmount + 1; | ||||
|     } | ||||
| } | ||||
| @@ -1,455 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
| pragma solidity ^0.6; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "../src/ERC20BridgeSampler.sol"; | ||||
| import "../src/interfaces/IKyberNetwork.sol"; | ||||
| import "../src/interfaces/IUniswapV2Router01.sol"; | ||||
|  | ||||
|  | ||||
| library LibDeterministicQuotes { | ||||
|  | ||||
|     address private constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; | ||||
|     uint256 private constant RATE_DENOMINATOR = 1 ether; | ||||
|     uint256 private constant MIN_RATE = RATE_DENOMINATOR / 100; | ||||
|     uint256 private constant MAX_RATE = 100 * RATE_DENOMINATOR; | ||||
|     uint8 private constant MIN_DECIMALS = 4; | ||||
|     uint8 private constant MAX_DECIMALS = 20; | ||||
|  | ||||
|     function getDeterministicSellQuote( | ||||
|         bytes32 salt, | ||||
|         address sellToken, | ||||
|         address buyToken, | ||||
|         uint256 sellAmount | ||||
|     ) | ||||
|         internal | ||||
|         pure | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         uint256 sellBase = uint256(10) ** getDeterministicTokenDecimals(sellToken); | ||||
|         uint256 buyBase = uint256(10) ** getDeterministicTokenDecimals(buyToken); | ||||
|         uint256 rate = getDeterministicRate(salt, sellToken, buyToken); | ||||
|         return sellAmount * rate * buyBase / sellBase / RATE_DENOMINATOR; | ||||
|     } | ||||
|  | ||||
|     function getDeterministicBuyQuote( | ||||
|         bytes32 salt, | ||||
|         address sellToken, | ||||
|         address buyToken, | ||||
|         uint256 buyAmount | ||||
|     ) | ||||
|         internal | ||||
|         pure | ||||
|         returns (uint256 sellAmount) | ||||
|     { | ||||
|         uint256 sellBase = uint256(10) ** getDeterministicTokenDecimals(sellToken); | ||||
|         uint256 buyBase = uint256(10) ** getDeterministicTokenDecimals(buyToken); | ||||
|         uint256 rate = getDeterministicRate(salt, sellToken, buyToken); | ||||
|         return buyAmount * RATE_DENOMINATOR * sellBase / rate / buyBase; | ||||
|     } | ||||
|  | ||||
|     function getDeterministicTokenDecimals(address token) | ||||
|         internal | ||||
|         pure | ||||
|         returns (uint8 decimals) | ||||
|     { | ||||
|         if (token == WETH_ADDRESS) { | ||||
|             return 18; | ||||
|         } | ||||
|         bytes32 seed = keccak256(abi.encodePacked(token)); | ||||
|         return uint8(uint256(seed) % (MAX_DECIMALS - MIN_DECIMALS)) + MIN_DECIMALS; | ||||
|     } | ||||
|  | ||||
|     function getDeterministicRate(bytes32 salt, address sellToken, address buyToken) | ||||
|         internal | ||||
|         pure | ||||
|         returns (uint256 rate) | ||||
|     { | ||||
|         bytes32 seed = keccak256(abi.encodePacked(salt, sellToken, buyToken)); | ||||
|         return uint256(seed) % (MAX_RATE - MIN_RATE) + MIN_RATE; | ||||
|     } | ||||
| } | ||||
|  | ||||
| contract TestDeploymentConstants { | ||||
|  | ||||
|     // solhint-disable separate-by-one-line-in-contract | ||||
|  | ||||
|     // Mainnet addresses /////////////////////////////////////////////////////// | ||||
|     /// @dev Mainnet address of the WETH contract. | ||||
|     address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; | ||||
|  | ||||
|     /// @dev Overridable way to get the WETH address. | ||||
|     /// @return wethAddress The WETH address. | ||||
|     function _getWethAddress() | ||||
|         internal | ||||
|         view | ||||
|         returns (address wethAddress) | ||||
|     { | ||||
|         return WETH_ADDRESS; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| contract FailTrigger { | ||||
|  | ||||
|     // Give this address a balance to force operations to fail. | ||||
|     address payable constant public FAILURE_ADDRESS = 0xe9dB8717BC5DFB20aaf538b4a5a02B7791FF430C; | ||||
|  | ||||
|     // Funds `FAILURE_ADDRESS`. | ||||
|     function enableFailTrigger() external payable { | ||||
|         FAILURE_ADDRESS.transfer(msg.value); | ||||
|     } | ||||
|  | ||||
|     function _revertIfShouldFail() internal view { | ||||
|         if (FAILURE_ADDRESS.balance != 0) { | ||||
|             revert("FAIL_TRIGGERED"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| contract TestERC20BridgeSamplerUniswapExchange is | ||||
|     IUniswapExchangeQuotes, | ||||
|     TestDeploymentConstants, | ||||
|     FailTrigger | ||||
| { | ||||
|     bytes32 constant private BASE_SALT = 0x1d6a6a0506b0b4a554b907a4c29d9f4674e461989d9c1921feb17b26716385ab; | ||||
|  | ||||
|     address public tokenAddress; | ||||
|     bytes32 public salt; | ||||
|  | ||||
|     constructor(address _tokenAddress) public { | ||||
|         tokenAddress = _tokenAddress; | ||||
|         salt = keccak256(abi.encodePacked(BASE_SALT, _tokenAddress)); | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IUniswapExchangeQuotes.getEthToTokenInputPrice()`. | ||||
|     function getEthToTokenInputPrice( | ||||
|         uint256 ethSold | ||||
|     ) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 tokensBought) | ||||
|     { | ||||
|         _revertIfShouldFail(); | ||||
|         return LibDeterministicQuotes.getDeterministicSellQuote( | ||||
|             salt, | ||||
|             tokenAddress, | ||||
|             _getWethAddress(), | ||||
|             ethSold | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IUniswapExchangeQuotes.getEthToTokenOutputPrice()`. | ||||
|     function getEthToTokenOutputPrice( | ||||
|         uint256 tokensBought | ||||
|     ) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 ethSold) | ||||
|     { | ||||
|         _revertIfShouldFail(); | ||||
|         return LibDeterministicQuotes.getDeterministicBuyQuote( | ||||
|             salt, | ||||
|             _getWethAddress(), | ||||
|             tokenAddress, | ||||
|             tokensBought | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IUniswapExchangeQuotes.getTokenToEthInputPrice()`. | ||||
|     function getTokenToEthInputPrice( | ||||
|         uint256 tokensSold | ||||
|     ) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 ethBought) | ||||
|     { | ||||
|         _revertIfShouldFail(); | ||||
|         return LibDeterministicQuotes.getDeterministicSellQuote( | ||||
|             salt, | ||||
|             tokenAddress, | ||||
|             _getWethAddress(), | ||||
|             tokensSold | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IUniswapExchangeQuotes.getTokenToEthOutputPrice()`. | ||||
|     function getTokenToEthOutputPrice( | ||||
|         uint256 ethBought | ||||
|     ) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 tokensSold) | ||||
|     { | ||||
|         _revertIfShouldFail(); | ||||
|         return LibDeterministicQuotes.getDeterministicBuyQuote( | ||||
|             salt, | ||||
|             _getWethAddress(), | ||||
|             tokenAddress, | ||||
|             ethBought | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| contract TestERC20BridgeSamplerUniswapV2Router01 is | ||||
|     IUniswapV2Router01, | ||||
|     TestDeploymentConstants, | ||||
|     FailTrigger | ||||
| { | ||||
|     bytes32 constant private SALT = 0xadc7fcb33c735913b8635927e66896b356a53a912ab2ceff929e60a04b53b3c1; | ||||
|  | ||||
|     // Deterministic `IUniswapV2Router01.getAmountsOut()`. | ||||
|     function getAmountsOut(uint256 amountIn, address[] calldata path) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (uint256[] memory amounts) | ||||
|     { | ||||
|         require(path.length >= 2, "PATH_TOO_SHORT"); | ||||
|         _revertIfShouldFail(); | ||||
|         amounts = new uint256[](path.length); | ||||
|         amounts[0] = amountIn; | ||||
|         for (uint256 i = 0; i < path.length - 1; ++i) { | ||||
|             amounts[i + 1] = LibDeterministicQuotes.getDeterministicSellQuote( | ||||
|                 SALT, | ||||
|                 path[i], | ||||
|                 path[i + 1], | ||||
|                 amounts[i] | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IUniswapV2Router01.getAmountsInt()`. | ||||
|     function getAmountsIn(uint256 amountOut, address[] calldata path) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (uint256[] memory amounts) | ||||
|     { | ||||
|         require(path.length >= 2, "PATH_TOO_SHORT"); | ||||
|         _revertIfShouldFail(); | ||||
|         amounts = new uint256[](path.length); | ||||
|         amounts[path.length - 1] = amountOut; | ||||
|         for (uint256 i = path.length - 1; i > 0; --i) { | ||||
|             amounts[i - 1] = LibDeterministicQuotes.getDeterministicBuyQuote( | ||||
|                 SALT, | ||||
|                 path[i - 1], | ||||
|                 path[i], | ||||
|                 amounts[i] | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| // solhint-disable space-after-comma | ||||
| contract TestERC20BridgeSamplerKyberNetwork is | ||||
|     TestDeploymentConstants, | ||||
|     FailTrigger | ||||
| { | ||||
|     bytes32 constant private SALT = 0x0ff3ca9d46195c39f9a12afb74207b4970349fb3cfb1e459bbf170298d326bc7; | ||||
|     address constant public ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||
|  | ||||
|     enum TradeType {BestOfAll, MaskIn, MaskOut, Split} | ||||
|     enum ProcessWithRate {NotRequired, Required} | ||||
|  | ||||
|     // IKyberHintHandler | ||||
|     function buildTokenToEthHint( | ||||
|         address tokenSrc, | ||||
|         TradeType /* tokenToEthType */, | ||||
|         bytes32[] calldata /* tokenToEthReserveIds */, | ||||
|         uint256[] calldata /* tokenToEthSplits */ | ||||
|     ) external view returns (bytes memory hint) | ||||
|     { | ||||
|         return abi.encode(tokenSrc); | ||||
|     } | ||||
|  | ||||
|     function buildEthToTokenHint( | ||||
|         address tokenDest, | ||||
|         TradeType /* ethToTokenType */, | ||||
|         bytes32[] calldata /* ethToTokenReserveIds */, | ||||
|         uint256[] calldata /* ethToTokenSplits */ | ||||
|     ) external view returns (bytes memory hint) | ||||
|     { | ||||
|         return abi.encode(tokenDest); | ||||
|     } | ||||
|  | ||||
|     // IKyberHintHandler | ||||
|     function buildTokenToTokenHint( | ||||
|         address tokenSrc, | ||||
|         TradeType /* tokenToEthType */, | ||||
|         bytes32[] calldata /* tokenToEthReserveIds */, | ||||
|         uint256[] calldata /* tokenToEthSplits */, | ||||
|         address /* tokenDest  */, | ||||
|         TradeType /* EthToTokenType */, | ||||
|         bytes32[] calldata /* EthToTokenReserveIds */, | ||||
|         uint256[] calldata /* EthToTokenSplits */ | ||||
|     ) external view returns (bytes memory hint) | ||||
|     { | ||||
|         return abi.encode(tokenSrc); | ||||
|     } | ||||
|  | ||||
|     // IKyberHintHandler | ||||
|     function getTradingReserves( | ||||
|         address tokenSrc, | ||||
|         address tokenDest, | ||||
|         bool isTokenToToken, | ||||
|         bytes calldata hint | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns ( | ||||
|             bytes32[] memory reserveIds, | ||||
|             uint256[] memory splitValuesBps, | ||||
|             ProcessWithRate processWithRate | ||||
|         ) | ||||
|     { | ||||
|         reserveIds = new bytes32[](1); | ||||
|         reserveIds[0] = bytes32(uint256(1)); | ||||
|         splitValuesBps = new uint256[](0); | ||||
|         processWithRate = ProcessWithRate.NotRequired; | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IKyberNetworkProxy.getExpectedRateAfterFee()`. | ||||
|     function getExpectedRateAfterFee( | ||||
|         address fromToken, | ||||
|         address toToken, | ||||
|         uint256 /* srcQty */, | ||||
|         uint256 /* fee */, | ||||
|         bytes calldata /* hint */ | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns | ||||
|         (uint256 expectedRate) | ||||
|     { | ||||
|         _revertIfShouldFail(); | ||||
|         fromToken = fromToken == ETH_ADDRESS ? _getWethAddress() : fromToken; | ||||
|         toToken = toToken == ETH_ADDRESS ? _getWethAddress() : toToken; | ||||
|         expectedRate = LibDeterministicQuotes.getDeterministicRate( | ||||
|             SALT, | ||||
|             fromToken, | ||||
|             toToken | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     // Deterministic `IKyberNetworkProxy.getExpectedRate()`. | ||||
|     function getExpectedRate( | ||||
|         address fromToken, | ||||
|         address toToken, | ||||
|         uint256 | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 expectedRate, uint256) | ||||
|     { | ||||
|         _revertIfShouldFail(); | ||||
|         fromToken = fromToken == ETH_ADDRESS ? _getWethAddress() : fromToken; | ||||
|         toToken = toToken == ETH_ADDRESS ? _getWethAddress() : toToken; | ||||
|         expectedRate = LibDeterministicQuotes.getDeterministicRate( | ||||
|             SALT, | ||||
|             fromToken, | ||||
|             toToken | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| contract TestERC20BridgeSamplerUniswapExchangeFactory is | ||||
|     IUniswapExchangeFactory | ||||
| { | ||||
|     mapping (address => IUniswapExchangeQuotes) private _exchangesByToken; | ||||
|  | ||||
|     // Creates Uniswap exchange contracts for tokens. | ||||
|     function createTokenExchanges(address[] calldata tokenAddresses) | ||||
|         external | ||||
|     { | ||||
|         for (uint256 i = 0; i < tokenAddresses.length; i++) { | ||||
|             address tokenAddress = tokenAddresses[i]; | ||||
|             _exchangesByToken[tokenAddress] = | ||||
|                 new TestERC20BridgeSamplerUniswapExchange(tokenAddress); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // `IUniswapExchangeFactory.getExchange()`. | ||||
|     function getExchange(address tokenAddress) | ||||
|         override | ||||
|         external | ||||
|         view | ||||
|         returns (address) | ||||
|     { | ||||
|         return address(_exchangesByToken[tokenAddress]); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| contract TestERC20BridgeSampler is | ||||
|     ERC20BridgeSampler, | ||||
|     FailTrigger | ||||
| { | ||||
|     TestERC20BridgeSamplerUniswapExchangeFactory public uniswap; | ||||
|     TestERC20BridgeSamplerUniswapV2Router01 public uniswapV2Router; | ||||
|     TestERC20BridgeSamplerKyberNetwork public kyber; | ||||
|  | ||||
|     uint8 private constant MAX_ORDER_STATUS = uint8(IExchange.OrderStatus.CANCELLED) + 1; | ||||
|  | ||||
|     constructor() public ERC20BridgeSampler() { | ||||
|         uniswap = new TestERC20BridgeSamplerUniswapExchangeFactory(); | ||||
|         uniswapV2Router = new TestERC20BridgeSamplerUniswapV2Router01(); | ||||
|         kyber = new TestERC20BridgeSamplerKyberNetwork(); | ||||
|     } | ||||
|  | ||||
|     // Creates Uniswap exchange contracts for tokens. | ||||
|     function createTokenExchanges(address[] calldata tokenAddresses) | ||||
|         external | ||||
|     { | ||||
|         uniswap.createTokenExchanges(tokenAddresses); | ||||
|     } | ||||
|  | ||||
|     // Overridden to return deterministic states. | ||||
|     function getLimitOrderFillableTakerAmount( | ||||
|         IExchange.LimitOrder memory order, | ||||
|         IExchange.Signature memory, | ||||
|         IExchange | ||||
|     ) | ||||
|         override | ||||
|         public | ||||
|         view | ||||
|         returns (uint256 fillableTakerAmount) | ||||
|     { | ||||
|         return uint256(keccak256(abi.encode(order.salt))) % order.takerAmount; | ||||
|     } | ||||
|  | ||||
|     // Overriden to return deterministic decimals. | ||||
|     function _getTokenDecimals(address tokenAddress) | ||||
|         override | ||||
|         internal | ||||
|         view | ||||
|         returns (uint8 decimals) | ||||
|     { | ||||
|         return LibDeterministicQuotes.getDeterministicTokenDecimals(tokenAddress); | ||||
|     } | ||||
| } | ||||
| @@ -1897,7 +1897,7 @@ ___ | ||||
|  | ||||
| # Interface: SwapQuoteRequestOpts | ||||
|  | ||||
| slippagePercentage: The percentage buffer to add to account for slippage. Affects max ETH price estimates. Defaults to 0.2 (20%). | ||||
| slippagePercentage: The percentage buffer to add to account for slippage. Affects max ETH price estimates. Defaults to 0.01 (1%). | ||||
| gasPrice: gas price to determine protocolFee amount, default to ethGasStation fast amount | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| { | ||||
|     "name": "@0x/asset-swapper", | ||||
|     "version": "16.51.0", | ||||
|     "version": "16.66.9", | ||||
|     "private": true, | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -8,8 +9,8 @@ | ||||
|     "main": "lib/src/index.js", | ||||
|     "types": "lib/src/index.d.ts", | ||||
|     "scripts": { | ||||
|         "build": "yarn pre_build && tsc -b", | ||||
|         "build:ts": "tsc -b", | ||||
|         "build": "#yarn pre_build && tsc -b", | ||||
|         "build:ts": "#tsc -b", | ||||
|         "watch": "tsc -w -p tsconfig.json", | ||||
|         "watch:contracts": "sol-compiler -w", | ||||
|         "build:ci": "yarn build", | ||||
| @@ -19,11 +20,11 @@ | ||||
|         "lint-contracts": "#solhint -c .solhint.json contracts/**/**/**/**/*.sol", | ||||
|         "prettier": "prettier --write '**/*.{ts,tsx,json}' --config ../../.prettierrc  --ignore-path ../../.prettierignore", | ||||
|         "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": "yarn run_mocha", | ||||
|         "test": "#yarn run_mocha", | ||||
|         "rebuild_and_test": "run-s clean build test", | ||||
|         "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov", | ||||
|         "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info", | ||||
|         "test:circleci": "yarn test:coverage", | ||||
|         "test:circleci": "#yarn test:coverage", | ||||
|         "run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*_test.js' lib/test/global_hooks.js --timeout 30000 --bail --exit", | ||||
|         "clean": "shx rm -rf lib test_temp generated_docs test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers", | ||||
|         "diff_docs": "git diff --exit-code ./docs", | ||||
| @@ -34,12 +35,13 @@ | ||||
|         "contracts:gen": "contracts-gen generate", | ||||
|         "contracts:copy": "contracts-gen copy", | ||||
|         "publish:private": "yarn build && gitpkg publish", | ||||
|         "sampler-size": "jq .compilerOutput.evm.deployedBytecode.object  -- test/generated-artifacts/ERC20BridgeSampler.json | echo $(( $(wc -c) / 2 - 1 ))" | ||||
|         "sampler-size": "jq .compilerOutput.evm.deployedBytecode.object  -- test/generated-artifacts/ERC20BridgeSampler.json | echo $(( $(wc -c) / 2 - 1 ))", | ||||
|         "list:deps": "yarn lerna list -l" | ||||
|     }, | ||||
|     "config": { | ||||
|         "publicInterfaceContracts": "ERC20BridgeSampler,BalanceChecker,FakeTaker", | ||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", | ||||
|         "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BalancerV2Sampler|BancorSampler|CompoundSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|FakeTaker|IBalancer|IBancor|ICurve|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|ISmoothy|IUniswapExchangeQuotes|IUniswapV2Router01|KyberDmmSampler|KyberSampler|LidoSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|SmoothySampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UniswapV3Sampler|UtilitySampler).json", | ||||
|         "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BalancerV2BatchSampler|BalancerV2Common|BalancerV2Sampler|BancorSampler|BancorV3Sampler|CompoundSampler|CurveSampler|DODOSampler|DODOV2Sampler|ERC20BridgeSampler|FakeTaker|GMXSampler|IBalancer|IBalancerV2Vault|IBancor|IBancorV3|ICurve|IGMX|IMStable|IMooniswap|IMultiBridge|IPlatypus|IShell|IUniswapExchangeQuotes|IUniswapV2Router01|KyberDmmSampler|LidoSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|NativeOrderSampler|PlatypusSampler|SamplerUtils|ShellSampler|SynthetixSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UniswapV3Sampler|UtilitySampler|VelodromeSampler|WooPPSampler).json", | ||||
|         "postpublish": { | ||||
|             "assets": [] | ||||
|         } | ||||
| @@ -58,22 +60,22 @@ | ||||
|         "registry": "git@github.com:0xProject/gitpkg-registry.git" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.31", | ||||
|         "@0x/base-contract": "^6.4.5", | ||||
|         "@0x/contract-addresses": "^6.12.0", | ||||
|         "@0x/contract-wrappers": "^13.19.1", | ||||
|         "@0x/contracts-erc20": "^3.3.27", | ||||
|         "@0x/contracts-zero-ex": "^0.31.1", | ||||
|         "@0x/dev-utils": "^4.2.11", | ||||
|         "@0x/json-schemas": "^6.4.1", | ||||
|         "@0x/assert": "^3.0.35", | ||||
|         "@0x/base-contract": "^7.0.0", | ||||
|         "@0x/contract-addresses": "^6.23.2", | ||||
|         "@0x/contract-wrappers": "^13.22.2", | ||||
|         "@0x/contracts-erc20": "^3.3.42", | ||||
|         "@0x/contracts-zero-ex": "^0.37.2", | ||||
|         "@0x/dev-utils": "^5.0.0", | ||||
|         "@0x/fast-abi": "^0.0.5", | ||||
|         "@0x/json-schemas": "^6.4.4", | ||||
|         "@0x/neon-router": "^0.3.5", | ||||
|         "@0x/protocol-utils": "^1.11.1", | ||||
|         "@0x/quote-server": "^6.0.6", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@0x/typescript-typings": "^5.2.1", | ||||
|         "@0x/utils": "^6.5.0", | ||||
|         "@0x/web3-wrapper": "^7.6.2", | ||||
|         "@balancer-labs/sor": "0.3.2", | ||||
|         "@0x/protocol-utils": "^11.16.9", | ||||
|         "@0x/quote-server": "^8.0.0", | ||||
|         "@0x/types": "^3.3.6", | ||||
|         "@0x/utils": "^7.0.0", | ||||
|         "@0x/web3-wrapper": "^8.0.0", | ||||
|         "@balancer-labs/sdk": "0.1.6", | ||||
|         "@bancor/sdk": "0.2.9", | ||||
|         "@ethersproject/abi": "^5.0.1", | ||||
|         "@ethersproject/address": "^5.0.1", | ||||
| @@ -82,32 +84,23 @@ | ||||
|         "@ethersproject/strings": "^5.0.10", | ||||
|         "axios": "^0.21.1", | ||||
|         "axios-mock-adapter": "^1.19.0", | ||||
|         "cream-sor": "^0.3.3", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "ethereum-types": "^3.6.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "fast-abi": "^0.0.4", | ||||
|         "balancer-labs-sor-v1": "npm:@balancer-labs/sor@0.3.2", | ||||
|         "ethereum-types": "^3.7.1", | ||||
|         "graphql": "^15.4.0", | ||||
|         "graphql-request": "^3.4.0", | ||||
|         "heartbeats": "^5.0.1", | ||||
|         "lodash": "^4.17.11" | ||||
|         "lodash": "^4.17.15", | ||||
|         "msw": "^0.44.2" | ||||
|     }, | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.7.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.19", | ||||
|         "@0x/contracts-exchange": "^3.2.38", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.37", | ||||
|         "@0x/contracts-gen": "^2.0.43", | ||||
|         "@0x/contracts-test-utils": "^5.4.18", | ||||
|         "@0x/contracts-utils": "^4.8.8", | ||||
|         "@0x/mesh-rpc-client": "^9.4.2", | ||||
|         "@0x/migrations": "^8.1.16", | ||||
|         "@0x/sol-compiler": "^4.7.8", | ||||
|         "@0x/subproviders": "^6.6.2", | ||||
|         "@0x/abi-gen": "^5.8.1", | ||||
|         "@0x/contracts-gen": "^2.0.47", | ||||
|         "@0x/contracts-test-utils": "^5.4.33", | ||||
|         "@0x/sol-compiler": "^4.8.2", | ||||
|         "@0x/subproviders": "^7.0.0", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.4", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/lodash": "4.14.137", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
|         "chai": "^4.0.1", | ||||
| @@ -115,15 +108,14 @@ | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "gitpkg": "https://github.com/0xProject/gitpkg.git", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "nyc": "^11.0.1", | ||||
|         "shx": "^0.2.2", | ||||
|         "tslint": "5.11.0", | ||||
|         "tslint": "^6.1.3", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typemoq": "^2.1.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "4.6.3" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -19,7 +19,7 @@ import { | ||||
|     DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID, | ||||
| } from './utils/market_operation_utils/constants'; | ||||
|  | ||||
| const ETH_GAS_STATION_API_URL = 'https://ethgasstation.info/api/ethgasAPI.json'; | ||||
| const ZERO_EX_GAS_API_URL = 'https://gas.api.0x.org/source/median'; | ||||
| const NULL_BYTES = '0x'; | ||||
| const NULL_ERC20_ASSET_DATA = '0xf47261b00000000000000000000000000000000000000000000000000000000000000000'; | ||||
| const NULL_ADDRESS = '0x0000000000000000000000000000000000000000'; | ||||
| @@ -48,7 +48,7 @@ const DEFAULT_SWAP_QUOTER_OPTS: SwapQuoterOpts = { | ||||
|     orderRefreshIntervalMs: 10000, // 10 seconds | ||||
|     ...DEFAULT_ORDER_PRUNER_OPTS, | ||||
|     samplerGasLimit: 500e6, | ||||
|     ethGasStationUrl: ETH_GAS_STATION_API_URL, | ||||
|     zeroExGasApiUrl: ZERO_EX_GAS_API_URL, | ||||
|     rfqt: { | ||||
|         integratorsWhitelist: [], | ||||
|         makerAssetOfferings: {}, | ||||
| @@ -95,11 +95,10 @@ export { DEFAULT_FEE_SCHEDULE, DEFAULT_GAS_SCHEDULE } from './utils/market_opera | ||||
|  | ||||
| export const POSITIVE_SLIPPAGE_FEE_TRANSFORMER_GAS = new BigNumber(30000); | ||||
|  | ||||
| // tslint:disable-next-line: custom-no-magic-numbers | ||||
| export const KEEP_ALIVE_TTL = 5 * 60 * ONE_SECOND_MS; | ||||
|  | ||||
| export const constants = { | ||||
|     ETH_GAS_STATION_API_URL, | ||||
|     ZERO_EX_GAS_API_URL, | ||||
|     PROTOCOL_FEE_MULTIPLIER, | ||||
|     POSITIVE_SLIPPAGE_FEE_TRANSFORMER_GAS, | ||||
|     NULL_BYTES, | ||||
|   | ||||
| @@ -4,7 +4,7 @@ export { | ||||
|     ContractTxFunctionObj, | ||||
|     SendTransactionOpts, | ||||
| } from '@0x/base-contract'; | ||||
| export { ContractAddresses } from '@0x/contract-addresses'; | ||||
| export { ContractAddresses, ChainId, getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; | ||||
| export { | ||||
|     V4RFQFirmQuote, | ||||
|     V4RFQIndicativeQuote, | ||||
| @@ -116,6 +116,15 @@ export { | ||||
|     SamplerMetrics, | ||||
| } from './types'; | ||||
| export { affiliateFeeUtils } from './utils/affiliate_fee_utils'; | ||||
| export { | ||||
|     IRfqClient, | ||||
|     RfqClientV1Price, | ||||
|     RfqClientV1PriceRequest, | ||||
|     RfqClientV1PriceResponse, | ||||
|     RfqClientV1Quote, | ||||
|     RfqClientV1QuoteRequest, | ||||
|     RfqClientV1QuoteResponse, | ||||
| } from './utils/irfq_client'; | ||||
| export { | ||||
|     DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID, | ||||
|     DEFAULT_GAS_SCHEDULE, | ||||
| @@ -123,6 +132,7 @@ export { | ||||
|     BUY_SOURCE_FILTER_BY_CHAIN_ID, | ||||
|     SELL_SOURCE_FILTER_BY_CHAIN_ID, | ||||
|     NATIVE_FEE_TOKEN_BY_CHAIN_ID, | ||||
|     ZERO_AMOUNT, | ||||
| } from './utils/market_operation_utils/constants'; | ||||
| export { | ||||
|     Parameters, | ||||
| @@ -132,7 +142,6 @@ export { | ||||
| export { | ||||
|     BalancerFillData, | ||||
|     BancorFillData, | ||||
|     CollapsedFill, | ||||
|     CurveFillData, | ||||
|     CurveFunctionSelectors, | ||||
|     CurveInfo, | ||||
| @@ -141,25 +150,25 @@ export { | ||||
|     ERC20BridgeSource, | ||||
|     ExchangeProxyOverhead, | ||||
|     FeeSchedule, | ||||
|     GasSchedule, | ||||
|     Fill, | ||||
|     FillAdjustor, | ||||
|     FillData, | ||||
|     GetMarketOrdersRfqOpts, | ||||
|     KyberFillData, | ||||
|     LiquidityProviderFillData, | ||||
|     LiquidityProviderRegistry, | ||||
|     MarketDepth, | ||||
|     MarketDepthSide, | ||||
|     MooniswapFillData, | ||||
|     MultiHopFillData, | ||||
|     NativeCollapsedFill, | ||||
|     NativeRfqOrderFillData, | ||||
|     NativeLimitOrderFillData, | ||||
|     NativeFillData, | ||||
|     OptimizedMarketOrder, | ||||
|     SourceQuoteOperation, | ||||
|     TokenAdjacencyGraph, | ||||
|     UniswapV2FillData, | ||||
| } from './utils/market_operation_utils/types'; | ||||
|  | ||||
| export { TokenAdjacencyGraph, TokenAdjacencyGraphBuilder } from './utils/token_adjacency_graph'; | ||||
| export { IdentityFillAdjustor } from './utils/market_operation_utils/identity_fill_adjustor'; | ||||
| export { ProtocolFeeUtils } from './utils/protocol_fee_utils'; | ||||
| export { | ||||
|     BridgeQuoteReportEntry, | ||||
| @@ -183,3 +192,5 @@ export type Native = ERC20BridgeSource.Native; | ||||
| export type MultiHop = ERC20BridgeSource.MultiHop; | ||||
|  | ||||
| export { rfqtMocker, RfqtQuoteEndpoint } from './utils/rfqt_mocker'; | ||||
|  | ||||
| export { adjustOutput } from './utils/market_operation_utils/fills'; | ||||
|   | ||||
| @@ -32,16 +32,14 @@ import { | ||||
| import { assert } from '../utils/assert'; | ||||
| import { | ||||
|     CURVE_LIQUIDITY_PROVIDER_BY_CHAIN_ID, | ||||
|     MOONISWAP_LIQUIDITY_PROVIDER_BY_CHAIN_ID, | ||||
|     NATIVE_FEE_TOKEN_BY_CHAIN_ID, | ||||
| } from '../utils/market_operation_utils/constants'; | ||||
| import { poolEncoder } from '../utils/market_operation_utils/orders'; | ||||
| import { | ||||
|     CurveFillData, | ||||
|     ERC20BridgeSource, | ||||
|     FinalUniswapV3FillData, | ||||
|     LiquidityProviderFillData, | ||||
|     MooniswapFillData, | ||||
|     NativeRfqOrderFillData, | ||||
|     OptimizedMarketBridgeOrder, | ||||
|     OptimizedMarketOrder, | ||||
|     UniswapV2FillData, | ||||
| @@ -60,9 +58,9 @@ import { | ||||
|     isDirectSwapCompatible, | ||||
|     isMultiplexBatchFillCompatible, | ||||
|     isMultiplexMultiHopFillCompatible, | ||||
|     requiresTransformERC20, | ||||
| } from './quote_consumer_utils'; | ||||
|  | ||||
| // tslint:disable-next-line:custom-no-magic-numbers | ||||
| const MAX_UINT256 = new BigNumber(2).pow(256).minus(1); | ||||
| const { NULL_ADDRESS, NULL_BYTES, ZERO_AMOUNT } = constants; | ||||
|  | ||||
| @@ -73,9 +71,7 @@ const PANCAKE_SWAP_FORKS = [ | ||||
|     ERC20BridgeSource.BakerySwap, | ||||
|     ERC20BridgeSource.SushiSwap, | ||||
|     ERC20BridgeSource.ApeSwap, | ||||
|     ERC20BridgeSource.CafeSwap, | ||||
|     ERC20BridgeSource.CheeseSwap, | ||||
|     ERC20BridgeSource.JulSwap, | ||||
| ]; | ||||
| const FAKE_PROVIDER: any = { | ||||
|     sendAsync(): void { | ||||
| @@ -220,9 +216,7 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { | ||||
|                 ERC20BridgeSource.BakerySwap, | ||||
|                 ERC20BridgeSource.SushiSwap, | ||||
|                 ERC20BridgeSource.ApeSwap, | ||||
|                 ERC20BridgeSource.CafeSwap, | ||||
|                 ERC20BridgeSource.CheeseSwap, | ||||
|                 ERC20BridgeSource.JulSwap, | ||||
|             ]) | ||||
|         ) { | ||||
|             const source = slippedOrders[0].source; | ||||
| @@ -278,13 +272,13 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { | ||||
|  | ||||
|         if ( | ||||
|             this.chainId === ChainId.Mainnet && | ||||
|             isDirectSwapCompatible(quote, optsWithDefaults, [ERC20BridgeSource.Curve, ERC20BridgeSource.Swerve]) && | ||||
|             isDirectSwapCompatible(quote, optsWithDefaults, [ERC20BridgeSource.Curve]) && | ||||
|             // Curve VIP cannot currently support WETH buy/sell as the functionality needs to WITHDRAW or DEPOSIT | ||||
|             // into WETH prior/post the trade. | ||||
|             // ETH buy/sell is supported | ||||
|             ![sellToken, buyToken].includes(NATIVE_FEE_TOKEN_BY_CHAIN_ID[ChainId.Mainnet]) | ||||
|         ) { | ||||
|             const fillData = slippedOrders[0].fills[0].fillData as CurveFillData; | ||||
|             const fillData = slippedOrders[0].fillData as CurveFillData; | ||||
|             return { | ||||
|                 calldataHexString: this._exchangeProxy | ||||
|                     .sellToLiquidityProvider( | ||||
| @@ -309,26 +303,45 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         // RFQT VIP | ||||
|         if ( | ||||
|             this.chainId === ChainId.Mainnet && | ||||
|             isDirectSwapCompatible(quote, optsWithDefaults, [ERC20BridgeSource.Mooniswap]) | ||||
|             [ChainId.Mainnet, ChainId.Polygon].includes(this.chainId) && | ||||
|             !isToETH && | ||||
|             !isFromETH && | ||||
|             quote.orders.every(o => o.type === FillQuoteTransformerOrderType.Rfq) && | ||||
|             !requiresTransformERC20(optsWithDefaults) | ||||
|         ) { | ||||
|             const fillData = slippedOrders[0].fills[0].fillData as MooniswapFillData; | ||||
|             const rfqOrdersData = quote.orders.map(o => o.fillData as NativeRfqOrderFillData); | ||||
|             const fillAmountPerOrder = (() => { | ||||
|                 // Don't think order taker amounts are clipped to actual sell amount | ||||
|                 // (the last one might be too large) so figure them out manually. | ||||
|                 let remaining = sellAmount; | ||||
|                 const fillAmounts = []; | ||||
|                 for (const o of quote.orders) { | ||||
|                     const fillAmount = BigNumber.min(o.takerAmount, remaining); | ||||
|                     fillAmounts.push(fillAmount); | ||||
|                     remaining = remaining.minus(fillAmount); | ||||
|                 } | ||||
|                 return fillAmounts; | ||||
|             })(); | ||||
|             const callData = | ||||
|                 quote.orders.length === 1 | ||||
|                     ? this._exchangeProxy | ||||
|                           .fillRfqOrder(rfqOrdersData[0].order, rfqOrdersData[0].signature, fillAmountPerOrder[0]) | ||||
|                           .getABIEncodedTransactionData() | ||||
|                     : this._exchangeProxy | ||||
|                           .batchFillRfqOrders( | ||||
|                               rfqOrdersData.map(d => d.order), | ||||
|                               rfqOrdersData.map(d => d.signature), | ||||
|                               fillAmountPerOrder, | ||||
|                               true, | ||||
|                           ) | ||||
|                           .getABIEncodedTransactionData(); | ||||
|             return { | ||||
|                 calldataHexString: this._exchangeProxy | ||||
|                     .sellToLiquidityProvider( | ||||
|                         isFromETH ? ETH_TOKEN_ADDRESS : sellToken, | ||||
|                         isToETH ? ETH_TOKEN_ADDRESS : buyToken, | ||||
|                         MOONISWAP_LIQUIDITY_PROVIDER_BY_CHAIN_ID[this.chainId], | ||||
|                         NULL_ADDRESS, | ||||
|                         sellAmount, | ||||
|                         minBuyAmount, | ||||
|                         poolEncoder.encode([fillData.poolAddress]), | ||||
|                     ) | ||||
|                     .getABIEncodedTransactionData(), | ||||
|                 ethAmount: isFromETH ? sellAmount : ZERO_AMOUNT, | ||||
|                 calldataHexString: callData, | ||||
|                 ethAmount: ZERO_AMOUNT, | ||||
|                 toAddress: this._exchangeProxy.address, | ||||
|                 allowanceTarget: this.contractAddresses.exchangeProxy, | ||||
|                 allowanceTarget: this._exchangeProxy.address, | ||||
|                 gasOverhead: ZERO_AMOUNT, | ||||
|             }; | ||||
|         } | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| import { ChainId, getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; | ||||
| import { FastABI } from '@0x/fast-abi'; | ||||
| import { FillQuoteTransformerOrderType, LimitOrder } from '@0x/protocol-utils'; | ||||
| import { BigNumber, providerUtils } from '@0x/utils'; | ||||
| import Axios, { AxiosInstance } from 'axios'; | ||||
| import { BlockParamLiteral, MethodAbi, SupportedProvider, ZeroExProvider } from 'ethereum-types'; | ||||
| import { FastABI } from 'fast-abi'; | ||||
| import { Agent as HttpAgent } from 'http'; | ||||
| import { Agent as HttpsAgent } from 'https'; | ||||
| import * as _ from 'lodash'; | ||||
| @@ -25,6 +25,7 @@ import { | ||||
|     SwapQuoterRfqOpts, | ||||
| } from './types'; | ||||
| import { assert } from './utils/assert'; | ||||
| import { IRfqClient } from './utils/irfq_client'; | ||||
| import { MarketOperationUtils } from './utils/market_operation_utils'; | ||||
| import { BancorService } from './utils/market_operation_utils/bancor_service'; | ||||
| import { SAMPLER_ADDRESS, SOURCE_FLAGS, ZERO_AMOUNT } from './utils/market_operation_utils/constants'; | ||||
| @@ -32,12 +33,9 @@ import { DexOrderSampler } from './utils/market_operation_utils/sampler'; | ||||
| import { SourceFilters } from './utils/market_operation_utils/source_filters'; | ||||
| import { | ||||
|     ERC20BridgeSource, | ||||
|     FeeSchedule, | ||||
|     FillData, | ||||
|     GasSchedule, | ||||
|     GetMarketOrdersOpts, | ||||
|     MarketDepth, | ||||
|     MarketDepthSide, | ||||
|     MarketSideLiquidity, | ||||
|     OptimizedMarketOrder, | ||||
|     OptimizerResultWithReport, | ||||
| } from './utils/market_operation_utils/types'; | ||||
| @@ -111,7 +109,7 @@ export class SwapQuoter { | ||||
|         }; | ||||
|         this._protocolFeeUtils = ProtocolFeeUtils.getInstance( | ||||
|             constants.PROTOCOL_FEE_UTILS_POLLING_INTERVAL_IN_MS, | ||||
|             options.ethGasStationUrl, | ||||
|             options.zeroExGasApiUrl, | ||||
|         ); | ||||
|         // Allow the sampler bytecode to be overwritten using geths override functionality | ||||
|         const samplerBytecode = _.get(artifacts.ERC20BridgeSampler, 'compilerOutput.evm.deployedBytecode.object'); | ||||
| @@ -146,7 +144,7 @@ export class SwapQuoter { | ||||
|                 this.chainId, | ||||
|                 samplerContract, | ||||
|                 samplerOverrides, | ||||
|                 undefined, // pools caches for balancer and cream | ||||
|                 undefined, // pools caches for balancer | ||||
|                 tokenAdjacencyGraph, | ||||
|                 liquidityProviderRegistry, | ||||
|                 this.chainId === ChainId.Mainnet // Enable Bancor only on Mainnet | ||||
| @@ -227,67 +225,6 @@ export class SwapQuoter { | ||||
|         return batchSwapQuotes.filter(x => x !== undefined) as MarketBuySwapQuote[]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the bids and asks liquidity for the entire market. | ||||
|      * For certain sources (like AMM's) it is recommended to provide a practical maximum takerAssetAmount. | ||||
|      * @param   makerTokenAddress The address of the maker asset | ||||
|      * @param   takerTokenAddress The address of the taker asset | ||||
|      * @param   takerAssetAmount  The amount to sell and buy for the bids and asks. | ||||
|      * | ||||
|      * @return  An object that conforms to MarketDepth that contains all of the samples and liquidity | ||||
|      *          information for the source. | ||||
|      */ | ||||
|     public async getBidAskLiquidityForMakerTakerAssetPairAsync( | ||||
|         makerToken: string, | ||||
|         takerToken: string, | ||||
|         takerAssetAmount: BigNumber, | ||||
|         options: Partial<SwapQuoteRequestOpts> = {}, | ||||
|     ): Promise<MarketDepth> { | ||||
|         assert.isString('makerToken', makerToken); | ||||
|         assert.isString('takerToken', takerToken); | ||||
|         const sourceFilters = new SourceFilters([], options.excludedSources, options.includedSources); | ||||
|  | ||||
|         let [sellOrders, buyOrders] = !sourceFilters.isAllowed(ERC20BridgeSource.Native) | ||||
|             ? [[], []] | ||||
|             : await Promise.all([ | ||||
|                   this.orderbook.getOrdersAsync(makerToken, takerToken), | ||||
|                   this.orderbook.getOrdersAsync(takerToken, makerToken), | ||||
|               ]); | ||||
|         if (!sellOrders || sellOrders.length === 0) { | ||||
|             sellOrders = [createDummyOrder(makerToken, takerToken)]; | ||||
|         } | ||||
|         if (!buyOrders || buyOrders.length === 0) { | ||||
|             buyOrders = [createDummyOrder(takerToken, makerToken)]; | ||||
|         } | ||||
|  | ||||
|         const getMarketDepthSide = (marketSideLiquidity: MarketSideLiquidity): MarketDepthSide => { | ||||
|             const { dexQuotes, nativeOrders } = marketSideLiquidity.quotes; | ||||
|             const { side } = marketSideLiquidity; | ||||
|  | ||||
|             return [ | ||||
|                 ...dexQuotes, | ||||
|                 nativeOrders.map(o => { | ||||
|                     return { | ||||
|                         input: side === MarketOperation.Sell ? o.fillableTakerAmount : o.fillableMakerAmount, | ||||
|                         output: side === MarketOperation.Sell ? o.fillableMakerAmount : o.fillableTakerAmount, | ||||
|                         fillData: o, | ||||
|                         source: ERC20BridgeSource.Native, | ||||
|                     }; | ||||
|                 }), | ||||
|             ]; | ||||
|         }; | ||||
|         const [bids, asks] = await Promise.all([ | ||||
|             this._marketOperationUtils.getMarketBuyLiquidityAsync(buyOrders, takerAssetAmount, options), | ||||
|             this._marketOperationUtils.getMarketSellLiquidityAsync(sellOrders, takerAssetAmount, options), | ||||
|         ]); | ||||
|         return { | ||||
|             bids: getMarketDepthSide(bids), | ||||
|             asks: getMarketDepthSide(asks), | ||||
|             makerTokenDecimals: asks.makerTokenDecimals, | ||||
|             takerTokenDecimals: asks.takerTokenDecimals, | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the recommended gas price for a fast transaction | ||||
|      */ | ||||
| @@ -327,6 +264,7 @@ export class SwapQuoter { | ||||
|         assetFillAmount: BigNumber, | ||||
|         marketOperation: MarketOperation, | ||||
|         options: Partial<SwapQuoteRequestOpts>, | ||||
|         rfqClient?: IRfqClient | undefined, | ||||
|     ): Promise<SwapQuote> { | ||||
|         assert.isETHAddressHex('makerToken', makerToken); | ||||
|         assert.isETHAddressHex('takerToken', takerToken); | ||||
| @@ -364,9 +302,11 @@ export class SwapQuoter { | ||||
|         const calcOpts: GetMarketOrdersOpts = { | ||||
|             ...cloneOpts, | ||||
|             gasPrice, | ||||
|             feeSchedule: _.mapValues(opts.feeSchedule, gasCost => (fillData: FillData) => | ||||
|                 gasCost === undefined ? 0 : gasPrice.times(gasCost(fillData)), | ||||
|             ), | ||||
|             feeSchedule: _.mapValues(opts.gasSchedule, gasCost => (fillData: FillData) => { | ||||
|                 const gas = gasCost ? gasCost(fillData) : 0; | ||||
|                 const fee = gasPrice.times(gas); | ||||
|                 return { gas, fee }; | ||||
|             }), | ||||
|             exchangeProxyOverhead: flags => gasPrice.times(opts.exchangeProxyOverhead(flags)), | ||||
|         }; | ||||
|         // pass the QuoteRequestor on if rfqt enabled | ||||
| @@ -381,6 +321,7 @@ export class SwapQuoter { | ||||
|                 this.expiryBufferMs, | ||||
|                 rfqtOptions?.metricsProxy, | ||||
|             ); | ||||
|             calcOpts.rfqt.rfqClient = rfqClient; | ||||
|         } | ||||
|  | ||||
|         const result: OptimizerResultWithReport = await this._marketOperationUtils.getOptimizerResultAsync( | ||||
| @@ -499,7 +440,7 @@ function createSwapQuote( | ||||
|     operation: MarketOperation, | ||||
|     assetFillAmount: BigNumber, | ||||
|     gasPrice: BigNumber, | ||||
|     gasSchedule: FeeSchedule, | ||||
|     gasSchedule: GasSchedule, | ||||
|     slippage: number, | ||||
| ): SwapQuote { | ||||
|     const { | ||||
| @@ -519,7 +460,7 @@ function createSwapQuote( | ||||
|         : calculateQuoteInfo(optimizedOrders, operation, assetFillAmount, gasPrice, gasSchedule, slippage); | ||||
|  | ||||
|     // Put together the swap quote | ||||
|     const { makerTokenDecimals, takerTokenDecimals } = optimizerResult.marketSideLiquidity; | ||||
|     const { makerTokenDecimals, takerTokenDecimals, blockNumber } = optimizerResult.marketSideLiquidity; | ||||
|     const swapQuote = { | ||||
|         makerToken, | ||||
|         takerToken, | ||||
| @@ -536,6 +477,7 @@ function createSwapQuote( | ||||
|         extendedQuoteReportSources, | ||||
|         isTwoHop, | ||||
|         priceComparisonsReport, | ||||
|         blockNumber, | ||||
|     }; | ||||
|  | ||||
|     if (operation === MarketOperation.Buy) { | ||||
| @@ -558,7 +500,7 @@ function calculateQuoteInfo( | ||||
|     operation: MarketOperation, | ||||
|     assetFillAmount: BigNumber, | ||||
|     gasPrice: BigNumber, | ||||
|     gasSchedule: FeeSchedule, | ||||
|     gasSchedule: GasSchedule, | ||||
|     slippage: number, | ||||
| ): { bestCaseQuoteInfo: SwapQuoteInfo; worstCaseQuoteInfo: SwapQuoteInfo; sourceBreakdown: SwapQuoteOrdersBreakdown } { | ||||
|     const bestCaseFillResult = simulateBestCaseFill({ | ||||
| @@ -587,25 +529,23 @@ function calculateQuoteInfo( | ||||
| function calculateTwoHopQuoteInfo( | ||||
|     optimizedOrders: OptimizedMarketOrder[], | ||||
|     operation: MarketOperation, | ||||
|     gasSchedule: FeeSchedule, | ||||
|     gasSchedule: GasSchedule, | ||||
|     slippage: number, | ||||
| ): { bestCaseQuoteInfo: SwapQuoteInfo; worstCaseQuoteInfo: SwapQuoteInfo; sourceBreakdown: SwapQuoteOrdersBreakdown } { | ||||
|     const [firstHopOrder, secondHopOrder] = optimizedOrders; | ||||
|     const [firstHopFill] = firstHopOrder.fills; | ||||
|     const [secondHopFill] = secondHopOrder.fills; | ||||
|     const gas = new BigNumber( | ||||
|         gasSchedule[ERC20BridgeSource.MultiHop]!({ | ||||
|             firstHopSource: _.pick(firstHopFill, 'source', 'fillData'), | ||||
|             secondHopSource: _.pick(secondHopFill, 'source', 'fillData'), | ||||
|             firstHopSource: _.pick(firstHopOrder, 'source', 'fillData'), | ||||
|             secondHopSource: _.pick(secondHopOrder, 'source', 'fillData'), | ||||
|         }), | ||||
|     ).toNumber(); | ||||
|     const isSell = operation === MarketOperation.Sell; | ||||
|  | ||||
|     return { | ||||
|         bestCaseQuoteInfo: { | ||||
|             makerAmount: isSell ? secondHopFill.output : secondHopFill.input, | ||||
|             takerAmount: isSell ? firstHopFill.input : firstHopFill.output, | ||||
|             totalTakerAmount: isSell ? firstHopFill.input : firstHopFill.output, | ||||
|             makerAmount: isSell ? secondHopOrder.fill.output : secondHopOrder.fill.input, | ||||
|             takerAmount: isSell ? firstHopOrder.fill.input : firstHopOrder.fill.output, | ||||
|             totalTakerAmount: isSell ? firstHopOrder.fill.input : firstHopOrder.fill.output, | ||||
|             feeTakerTokenAmount: constants.ZERO_AMOUNT, | ||||
|             protocolFeeInWeiAmount: constants.ZERO_AMOUNT, | ||||
|             gas, | ||||
| @@ -631,7 +571,7 @@ function calculateTwoHopQuoteInfo( | ||||
|             [ERC20BridgeSource.MultiHop]: { | ||||
|                 proportion: new BigNumber(1), | ||||
|                 intermediateToken: secondHopOrder.takerToken, | ||||
|                 hops: [firstHopFill.source, secondHopFill.source], | ||||
|                 hops: [firstHopOrder.source, secondHopOrder.source], | ||||
|             }, | ||||
|         }, | ||||
|     }; | ||||
|   | ||||
| @@ -17,11 +17,13 @@ import { | ||||
|     GetMarketOrdersOpts, | ||||
|     LiquidityProviderRegistry, | ||||
|     OptimizedMarketOrder, | ||||
|     TokenAdjacencyGraph, | ||||
| } from './utils/market_operation_utils/types'; | ||||
| export { SamplerMetrics } from './utils/market_operation_utils/types'; | ||||
| import { ExtendedQuoteReportSources, PriceComparisonsReport, QuoteReport } from './utils/quote_report_generator'; | ||||
| import { MetricsProxy } from './utils/quote_requestor'; | ||||
| import { TokenAdjacencyGraph } from './utils/token_adjacency_graph'; | ||||
| export { SamplerMetrics } from './utils/market_operation_utils/types'; | ||||
|  | ||||
| export type Address = string; | ||||
|  | ||||
| /** | ||||
|  * expiryBufferMs: The number of seconds to add when calculating whether an order is expired or not. Defaults to 300s (5m). | ||||
| @@ -179,6 +181,7 @@ export interface SwapQuoteBase { | ||||
|     takerTokenDecimals: number; | ||||
|     takerAmountPerEth: BigNumber; | ||||
|     makerAmountPerEth: BigNumber; | ||||
|     blockNumber: number; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -334,7 +337,7 @@ export interface SwapQuoterOpts extends OrderPrunerOpts { | ||||
|     contractAddresses?: AssetSwapperContractAddresses; | ||||
|     samplerGasLimit?: number; | ||||
|     multiBridgeAddress?: string; | ||||
|     ethGasStationUrl?: string; | ||||
|     zeroExGasApiUrl?: string; | ||||
|     rfqt?: SwapQuoterRfqOpts; | ||||
|     samplerOverrides?: SamplerOverrides; | ||||
|     tokenAdjacencyGraph?: TokenAdjacencyGraph; | ||||
|   | ||||
| @@ -17,7 +17,10 @@ import { | ||||
|  | ||||
| const SUCCESS_CODE = 201; | ||||
|  | ||||
| function getAltMarketInfo( | ||||
| /** | ||||
|  * Returns the AltOffering if it exists for a given pair | ||||
|  */ | ||||
| export function getAltMarketInfo( | ||||
|     offerings: AltOffering[], | ||||
|     buyTokenAddress: string, | ||||
|     sellTokenAddress: string, | ||||
| @@ -101,11 +104,9 @@ function parseIndicativeQuoteResponseFromAltMM( | ||||
|         takerAmount, | ||||
|         // HACK: alt implementation does not return an expiration with indicative quotes | ||||
|         // return now + { IMPUTED EXPIRY SECONDS } to have it included after order checks | ||||
|         expiry: | ||||
|             // tslint:disable-next-line:custom-no-magic-numbers | ||||
|             new BigNumber(Date.now() / 1000) | ||||
|                 .integerValue(BigNumber.ROUND_DOWN) | ||||
|                 .plus(constants.ALT_MM_IMPUTED_INDICATIVE_EXPIRY_SECONDS), | ||||
|         expiry: new BigNumber(Date.now() / 1000) | ||||
|             .integerValue(BigNumber.ROUND_DOWN) | ||||
|             .plus(constants.ALT_MM_IMPUTED_INDICATIVE_EXPIRY_SECONDS), | ||||
|     }; | ||||
| } | ||||
|  | ||||
| @@ -240,7 +241,6 @@ export async function returnQuoteFromAltMMAsync<ResponseT>( | ||||
|     // empty response will get filtered out in validation | ||||
|     const emptyResponse = {}; | ||||
|  | ||||
|     // tslint:disable-next-line:custom-no-magic-numbers | ||||
|     if (response.status !== SUCCESS_CODE) { | ||||
|         const rejectedRequestInfo = { | ||||
|             status: response.status, | ||||
|   | ||||
							
								
								
									
										59
									
								
								packages/asset-swapper/src/utils/irfq_client.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								packages/asset-swapper/src/utils/irfq_client.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| import { RfqOrder, Signature } from '@0x/protocol-utils'; | ||||
| import { BigNumber } from '@0x/utils'; | ||||
|  | ||||
| import { AltRfqMakerAssetOfferings } from '../types'; | ||||
|  | ||||
| export interface RfqClientV1PriceRequest { | ||||
|     altRfqAssetOfferings: AltRfqMakerAssetOfferings | undefined; | ||||
|     assetFillAmount: BigNumber; | ||||
|     chainId: number; | ||||
|     comparisonPrice: BigNumber | undefined; | ||||
|     integratorId: string; | ||||
|     intentOnFilling: boolean; | ||||
|     makerToken: string; | ||||
|     marketOperation: 'Sell' | 'Buy'; | ||||
|     takerAddress: string; | ||||
|     takerToken: string; | ||||
|     txOrigin: string; | ||||
| } | ||||
|  | ||||
| export interface RfqClientV1QuoteRequest extends RfqClientV1PriceRequest {} | ||||
|  | ||||
| export interface RfqClientV1Price { | ||||
|     expiry: BigNumber; | ||||
|     kind: 'rfq' | 'otc'; | ||||
|     makerAmount: BigNumber; | ||||
|     makerToken: string; | ||||
|     makerUri: string; | ||||
|     takerAmount: BigNumber; | ||||
|     takerToken: string; | ||||
| } | ||||
|  | ||||
| export interface RfqClientV1PriceResponse { | ||||
|     prices: RfqClientV1Price[]; | ||||
| } | ||||
|  | ||||
| export interface RfqClientV1Quote { | ||||
|     makerUri: string; | ||||
|     order: RfqOrder; | ||||
|     signature: Signature; | ||||
| } | ||||
|  | ||||
| export interface RfqClientV1QuoteResponse { | ||||
|     quotes: RfqClientV1Quote[]; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * IRfqClient is an interface that defines how to connect with an Rfq system. | ||||
|  */ | ||||
| export interface IRfqClient { | ||||
|     /** | ||||
|      * Fetches a list of "indicative quotes" or prices from a remote Rfq server | ||||
|      */ | ||||
|     getV1PricesAsync(request: RfqClientV1PriceRequest): Promise<RfqClientV1PriceResponse>; | ||||
|  | ||||
|     /** | ||||
|      * Fetches a list of "firm quotes" or signed quotes from a remote Rfq server. | ||||
|      */ | ||||
|     getV1QuotesAsync(request: RfqClientV1QuoteRequest): Promise<RfqClientV1QuoteResponse>; | ||||
| } | ||||
| @@ -40,7 +40,6 @@ interface Cache { | ||||
|     [key: string]: AaveReserve[]; | ||||
| } | ||||
|  | ||||
| // tslint:disable-next-line:custom-no-magic-numbers | ||||
| const RESERVES_REFRESH_INTERVAL_MS = 30 * constants.ONE_MINUTE_MS; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,14 +1,13 @@ | ||||
| import { ChainId } from '@0x/contract-addresses'; | ||||
| import { BigNumber, NULL_BYTES } from '@0x/utils'; | ||||
| import { BigNumber } from '@0x/utils'; | ||||
|  | ||||
| import { | ||||
|     ACRYPTOS_BSC_INFOS, | ||||
|     APESWAP_ROUTER_BY_CHAIN_ID, | ||||
|     BAKERYSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     BELT_BSC_INFOS, | ||||
|     CAFESWAP_ROUTER_BY_CHAIN_ID, | ||||
|     BISWAP_ROUTER_BY_CHAIN_ID, | ||||
|     CHEESESWAP_ROUTER_BY_CHAIN_ID, | ||||
|     COMETHSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     COMPONENT_POOLS_BY_CHAIN_ID, | ||||
|     CRYPTO_COM_ROUTER_BY_CHAIN_ID, | ||||
|     CURVE_AVALANCHE_INFOS, | ||||
| @@ -25,32 +24,26 @@ import { | ||||
|     FIREBIRDONESWAP_BSC_INFOS, | ||||
|     FIREBIRDONESWAP_POLYGON_INFOS, | ||||
|     IRONSWAP_POLYGON_INFOS, | ||||
|     JETSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     JULSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     KYBER_BANNED_RESERVES, | ||||
|     KYBER_BRIDGED_LIQUIDITY_PREFIX, | ||||
|     KNIGHTSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     MAX_DODOV2_POOLS_QUERIED, | ||||
|     MAX_KYBER_RESERVES_QUERIED, | ||||
|     MDEX_ROUTER_BY_CHAIN_ID, | ||||
|     MESHSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     MOBIUSMONEY_CELO_INFOS, | ||||
|     MORPHEUSSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     MSTABLE_POOLS_BY_CHAIN_ID, | ||||
|     NERVE_BSC_INFOS, | ||||
|     NULL_ADDRESS, | ||||
|     PANCAKESWAP_ROUTER_BY_CHAIN_ID, | ||||
|     PANCAKESWAPV2_ROUTER_BY_CHAIN_ID, | ||||
|     PANCAKESWAP_ROUTER_BY_CHAIN_ID, | ||||
|     PANGOLIN_ROUTER_BY_CHAIN_ID, | ||||
|     POLYDEX_ROUTER_BY_CHAIN_ID, | ||||
|     PLATYPUS_AVALANCHE_INFOS, | ||||
|     QUICKSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     SADDLE_MAINNET_INFOS, | ||||
|     SHELL_POOLS_BY_CHAIN_ID, | ||||
|     SHIBASWAP_ROUTER_BY_CHAIN_ID, | ||||
|     SMOOTHY_BSC_INFOS, | ||||
|     SMOOTHY_MAINNET_INFOS, | ||||
|     SNOWSWAP_MAINNET_INFOS, | ||||
|     SPIRITSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     SPOOKYSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     SUSHISWAP_ROUTER_BY_CHAIN_ID, | ||||
|     SWERVE_MAINNET_INFOS, | ||||
|     SYNAPSE_AVALANCHE_INFOS, | ||||
|     SYNAPSE_BSC_INFOS, | ||||
|     SYNAPSE_FANTOM_INFOS, | ||||
| @@ -62,35 +55,15 @@ import { | ||||
|     UNISWAPV2_ROUTER_BY_CHAIN_ID, | ||||
|     WAULTSWAP_ROUTER_BY_CHAIN_ID, | ||||
|     XSIGMA_MAINNET_INFOS, | ||||
|     YOSHI_ROUTER_BY_CHAIN_ID, | ||||
| } from './constants'; | ||||
| import { CurveInfo, ERC20BridgeSource } from './types'; | ||||
|  | ||||
| /** | ||||
|  * Filter Kyber reserves which should not be used (0xbb bridged reserves) | ||||
|  * @param reserveId Kyber reserveId | ||||
|  */ | ||||
| export function isAllowedKyberReserveId(reserveId: string): boolean { | ||||
|     return ( | ||||
|         reserveId !== NULL_BYTES && | ||||
|         !reserveId.startsWith(KYBER_BRIDGED_LIQUIDITY_PREFIX) && | ||||
|         !KYBER_BANNED_RESERVES.includes(reserveId) | ||||
|     ); | ||||
| } | ||||
| import { CurveInfo, ERC20BridgeSource, PlatypusInfo } from './types'; | ||||
|  | ||||
| // tslint:disable-next-line: completed-docs ban-types | ||||
| export function isValidAddress(address: string | String): address is string { | ||||
|     return (typeof address === 'string' || address instanceof String) && address.toString() !== NULL_ADDRESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Returns the offsets to be used to discover Kyber reserves | ||||
|  */ | ||||
| export function getKyberOffsets(): BigNumber[] { | ||||
|     return Array(MAX_KYBER_RESERVES_QUERIED) | ||||
|         .fill(0) | ||||
|         .map((_v, i) => new BigNumber(i)); | ||||
| } | ||||
|  | ||||
| // tslint:disable completed-docs | ||||
| export function getDodoV2Offsets(): BigNumber[] { | ||||
|     return Array(MAX_DODOV2_POOLS_QUERIED) | ||||
| @@ -225,32 +198,6 @@ export function getCurveV2InfosForPair(chainId: ChainId, takerToken: string, mak | ||||
|     } | ||||
| } | ||||
|  | ||||
| export function getSwerveInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { | ||||
|     if (chainId !== ChainId.Mainnet) { | ||||
|         return []; | ||||
|     } | ||||
|     return Object.values(SWERVE_MAINNET_INFOS).filter(c => | ||||
|         [makerToken, takerToken].every( | ||||
|             t => | ||||
|                 (c.tokens.includes(t) && c.metaTokens === undefined) || | ||||
|                 (c.tokens.includes(t) && [makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0), | ||||
|         ), | ||||
|     ); | ||||
| } | ||||
|  | ||||
| export function getSnowSwapInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { | ||||
|     if (chainId !== ChainId.Mainnet) { | ||||
|         return []; | ||||
|     } | ||||
|     return Object.values(SNOWSWAP_MAINNET_INFOS).filter(c => | ||||
|         [makerToken, takerToken].every( | ||||
|             t => | ||||
|                 (c.tokens.includes(t) && c.metaTokens === undefined) || | ||||
|                 (c.tokens.includes(t) && [makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0), | ||||
|         ), | ||||
|     ); | ||||
| } | ||||
|  | ||||
| export function getNerveInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { | ||||
|     if (chainId !== ChainId.BSC) { | ||||
|         return []; | ||||
| @@ -375,30 +322,6 @@ export function getEllipsisInfosForPair(chainId: ChainId, takerToken: string, ma | ||||
|     ); | ||||
| } | ||||
|  | ||||
| export function getSmoothyInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { | ||||
|     if (chainId === ChainId.BSC) { | ||||
|         return Object.values(SMOOTHY_BSC_INFOS).filter(c => | ||||
|             [makerToken, takerToken].every( | ||||
|                 t => | ||||
|                     (c.tokens.includes(t) && c.metaTokens === undefined) || | ||||
|                     (c.tokens.includes(t) && | ||||
|                         [makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0), | ||||
|             ), | ||||
|         ); | ||||
|     } else if (chainId === ChainId.Mainnet) { | ||||
|         return Object.values(SMOOTHY_MAINNET_INFOS).filter(c => | ||||
|             [makerToken, takerToken].every( | ||||
|                 t => | ||||
|                     (c.tokens.includes(t) && c.metaTokens === undefined) || | ||||
|                     (c.tokens.includes(t) && | ||||
|                         [makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0), | ||||
|             ), | ||||
|         ); | ||||
|     } else { | ||||
|         return []; | ||||
|     } | ||||
| } | ||||
|  | ||||
| export function getSaddleInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { | ||||
|     if (chainId !== ChainId.Mainnet) { | ||||
|         return []; | ||||
| @@ -463,6 +386,15 @@ export function getMobiusMoneyInfoForPair(chainId: ChainId, takerToken: string, | ||||
|     ); | ||||
| } | ||||
|  | ||||
| export function getPlatypusInfoForPair(chainId: ChainId, takerToken: string, makerToken: string): PlatypusInfo[] { | ||||
|     if (chainId !== ChainId.Avalanche) { | ||||
|         return []; | ||||
|     } | ||||
|     return Object.values(PLATYPUS_AVALANCHE_INFOS).filter(c => | ||||
|         [makerToken, takerToken].every(t => c.tokens.includes(t)), | ||||
|     ); | ||||
| } | ||||
|  | ||||
| export function getShellLikeInfosForPair( | ||||
|     chainId: ChainId, | ||||
|     takerToken: string, | ||||
| @@ -493,13 +425,10 @@ export function getCurveLikeInfosForPair( | ||||
|     source: | ||||
|         | ERC20BridgeSource.Curve | ||||
|         | ERC20BridgeSource.CurveV2 | ||||
|         | ERC20BridgeSource.Swerve | ||||
|         | ERC20BridgeSource.SnowSwap | ||||
|         | ERC20BridgeSource.Nerve | ||||
|         | ERC20BridgeSource.Synapse | ||||
|         | ERC20BridgeSource.Belt | ||||
|         | ERC20BridgeSource.Ellipsis | ||||
|         | ERC20BridgeSource.Smoothy | ||||
|         | ERC20BridgeSource.Saddle | ||||
|         | ERC20BridgeSource.IronSwap | ||||
|         | ERC20BridgeSource.XSigma | ||||
| @@ -515,12 +444,6 @@ export function getCurveLikeInfosForPair( | ||||
|         case ERC20BridgeSource.CurveV2: | ||||
|             pools = getCurveV2InfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
|         case ERC20BridgeSource.Swerve: | ||||
|             pools = getSwerveInfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
|         case ERC20BridgeSource.SnowSwap: | ||||
|             pools = getSnowSwapInfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
|         case ERC20BridgeSource.Nerve: | ||||
|             pools = getNerveInfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
| @@ -533,9 +456,6 @@ export function getCurveLikeInfosForPair( | ||||
|         case ERC20BridgeSource.Ellipsis: | ||||
|             pools = getEllipsisInfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
|         case ERC20BridgeSource.Smoothy: | ||||
|             pools = getSmoothyInfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
|         case ERC20BridgeSource.Saddle: | ||||
|             pools = getSaddleInfosForPair(chainId, takerToken, makerToken); | ||||
|             break; | ||||
| @@ -574,22 +494,22 @@ export function uniswapV2LikeRouterAddress( | ||||
|         | ERC20BridgeSource.PancakeSwapV2 | ||||
|         | ERC20BridgeSource.BakerySwap | ||||
|         | ERC20BridgeSource.ApeSwap | ||||
|         | ERC20BridgeSource.CafeSwap | ||||
|         | ERC20BridgeSource.CheeseSwap | ||||
|         | ERC20BridgeSource.JulSwap | ||||
|         | ERC20BridgeSource.QuickSwap | ||||
|         | ERC20BridgeSource.ComethSwap | ||||
|         | ERC20BridgeSource.Dfyn | ||||
|         | ERC20BridgeSource.WaultSwap | ||||
|         | ERC20BridgeSource.Polydex | ||||
|         | ERC20BridgeSource.ShibaSwap | ||||
|         | ERC20BridgeSource.JetSwap | ||||
|         | ERC20BridgeSource.TraderJoe | ||||
|         | ERC20BridgeSource.Pangolin | ||||
|         | ERC20BridgeSource.UbeSwap | ||||
|         | ERC20BridgeSource.MorpheusSwap | ||||
|         | ERC20BridgeSource.SpookySwap | ||||
|         | ERC20BridgeSource.SpiritSwap, | ||||
|         | ERC20BridgeSource.SpiritSwap | ||||
|         | ERC20BridgeSource.BiSwap | ||||
|         | ERC20BridgeSource.Yoshi | ||||
|         | ERC20BridgeSource.MDex | ||||
|         | ERC20BridgeSource.KnightSwap | ||||
|         | ERC20BridgeSource.MeshSwap, | ||||
| ): string { | ||||
|     switch (source) { | ||||
|         case ERC20BridgeSource.UniswapV2: | ||||
| @@ -606,26 +526,16 @@ export function uniswapV2LikeRouterAddress( | ||||
|             return BAKERYSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.ApeSwap: | ||||
|             return APESWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.CafeSwap: | ||||
|             return CAFESWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.CheeseSwap: | ||||
|             return CHEESESWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.JulSwap: | ||||
|             return JULSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.QuickSwap: | ||||
|             return QUICKSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.ComethSwap: | ||||
|             return COMETHSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.Dfyn: | ||||
|             return DFYN_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.WaultSwap: | ||||
|             return WAULTSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.Polydex: | ||||
|             return POLYDEX_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.ShibaSwap: | ||||
|             return SHIBASWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.JetSwap: | ||||
|             return JETSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.Pangolin: | ||||
|             return PANGOLIN_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.TraderJoe: | ||||
| @@ -638,6 +548,16 @@ export function uniswapV2LikeRouterAddress( | ||||
|             return SPOOKYSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.SpiritSwap: | ||||
|             return SPIRITSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.BiSwap: | ||||
|             return BISWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.Yoshi: | ||||
|             return YOSHI_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.MeshSwap: | ||||
|             return MESHSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.MDex: | ||||
|             return MDEX_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         case ERC20BridgeSource.KnightSwap: | ||||
|             return KNIGHTSWAP_ROUTER_BY_CHAIN_ID[chainId]; | ||||
|         default: | ||||
|             throw new Error(`Unknown UniswapV2 like source ${source}`); | ||||
|     } | ||||
|   | ||||
| @@ -48,7 +48,7 @@ export function getComparisonPrices( | ||||
|     } else { | ||||
|         try { | ||||
|             const fillFeeInEth = new BigNumber( | ||||
|                 (feeSchedule[ERC20BridgeSource.Native] as FeeEstimate)({ type: FillQuoteTransformerOrderType.Rfq }), | ||||
|                 (feeSchedule[ERC20BridgeSource.Native] as FeeEstimate)({ type: FillQuoteTransformerOrderType.Rfq }).fee, | ||||
|             ); | ||||
|             const exchangeProxyOverheadInEth = new BigNumber(exchangeProxyOverhead(SOURCE_FLAGS.RfqOrder)); | ||||
|             feeInEth = fillFeeInEth.plus(exchangeProxyOverheadInEth); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user